h264手动添加sps和pps到AVCodecContext->extradata
2017-09-12 22:07
423 查看
最近编码的时候发现生成的视频不能用Windows Media Player等系统自带的播放器播放,也没有缩略图。找了很久,最后才发现在avcodec_open2之前添加一行代码就行了:
codec_ctx->flags |= AV_CODEC_FLAG_GLOBAL_HEADER;
调用该行代码后,FFmpeg会在调用avcodec_open2里,在写header时填充sps,pps等信息。不填充编码出来的视频就不能正常解码,当然使用专业的播放器(potplayer等)还是可以。
在没发现添加这行代码就可以之前,我是直接尝试手动添加sps/pps到extradata的。
在avcodec_open2之前添加如下代码,生成的视屏就能用系统自带播放器播放,也有了缩略图。但是Windows资源管理器看的帧高度和宽度不正确,所以还要修改sps_pps数组。
sps和pps的结构参考:h264编码 里面的Sequence parameter set RBSP syntax
0x00000001或者0x000001是起始码,0x67是sps的开头,0x68是pps的开头。
0x42代表profile_idc,后面八位是constraint_set0_flag和reserved_zero_4bits,都设为0,0x0a是level_idc,接着后面为图方便能用0表示的都用了。这里要注意是ue(v)表示该域是可变位,使用的指数-哥伦布编码 我的目的主要是设置正确帧高度和帧高度,所以只要填充 pic_width_in_mbs_minus1和 pic_height_in_map_units_minus1,将它们的十六进制数写入sps_pps,如果宽度和高度不是16的倍数,要填frame_cropping_flag,具体的做法参考大神博客和SO.
更多资料参考:
Fetching
the dimensions of a H264Video stream
H264码流中SPS的获取
H264 with multiple PPS and SPS
H.264 extradata (partially) explained - for dummies
ffmpeg h264编码 extradata
为空
h264bitstream/h264_slice_data.c
codec_ctx->flags |= AV_CODEC_FLAG_GLOBAL_HEADER;
调用该行代码后,FFmpeg会在调用avcodec_open2里,在写header时填充sps,pps等信息。不填充编码出来的视频就不能正常解码,当然使用专业的播放器(potplayer等)还是可以。
在没发现添加这行代码就可以之前,我是直接尝试手动添加sps/pps到extradata的。
在avcodec_open2之前添加如下代码,生成的视屏就能用系统自带播放器播放,也有了缩略图。但是Windows资源管理器看的帧高度和宽度不正确,所以还要修改sps_pps数组。
unsigned char sps_pps[23] = { 0x00, 0x00, 0x00, 0x01, 0x67, 0x42, 0x00, 0x0a, 0xf8, 0x0f, 0x00, 0x44, 0xbe, 0x8, 0x00, 0x00, 0x00, 0x01, 0x68, 0xce, 0x38, 0x80 }; codec_ctx->extradata_size = 23; codec_ctx->extradata = (uint8_t*)av_malloc(23 + AV_INPUT_BUFFER_PADDING_SIZE); if (codec_ctx->extradata == NULL) { printf("could not av_malloc the video params extradata!\n"); return -1; } memcpy(codec_ctx->extradata, sps_pps, 23);
sps和pps的结构参考:h264编码 里面的Sequence parameter set RBSP syntax
0x00000001或者0x000001是起始码,0x67是sps的开头,0x68是pps的开头。
0x42代表profile_idc,后面八位是constraint_set0_flag和reserved_zero_4bits,都设为0,0x0a是level_idc,接着后面为图方便能用0表示的都用了。这里要注意是ue(v)表示该域是可变位,使用的指数-哥伦布编码 我的目的主要是设置正确帧高度和帧高度,所以只要填充 pic_width_in_mbs_minus1和 pic_height_in_map_units_minus1,将它们的十六进制数写入sps_pps,如果宽度和高度不是16的倍数,要填frame_cropping_flag,具体的做法参考大神博客和SO.
更多资料参考:
Fetching
the dimensions of a H264Video stream
H264码流中SPS的获取
H264 with multiple PPS and SPS
H.264 extradata (partially) explained - for dummies
ffmpeg h264编码 extradata
为空
h264bitstream/h264_slice_data.c
相关文章推荐
- H264中的SPS、PPS提取与作用<转>
- H264码流中SPS PPS详解<转>
- ffmpeg参数设置,AVCodecContext设置, h264 profile
- ffmpeg 手动添加 sps pps(处理内存泄露问题)
- H264码流中SPS PPS详解
- H264中的SPS、PPS提取与作用
- 关于 ffmpeg 中av_rescale_rnd 和avcodec_encode_video2(AVCodecContext *avctx, AVPacket *avpkt, 的含义
- ffmpeg 编码器AVCodecContext 的配置参数
- ffmpeg 编码器AVCodecContext 的配置参数
- 从RTSP协议SDP数据中获得H264中的的SPS、PPS
- FFmpeg 编码器AVCodecContext参数设置
- H264—MP4格式及在MP4文件中提取H264的SPS、PPS及码流
- H264 获取SPS与PPS(附源码)
- H264—MP4格式及在MP4文件中提取H264的SPS、PPS及码流
- H264 获取SPS与PPS(附源码)
- H264 SPS PPS Slice Header解码笔记
- H264 获取SPS与PPS(附源码)
- H264参数语法: SPS、PPS .
- h264 Nalu 详解(转载) 及 sps.pps.idr相关
- 嵌入式 H264—MP4格式及在MP4文件中提取H264的SPS、PPS及码流