x264编码器,提供了两个demo来验证编码功能:一个是大而全的x264.c,另一个是简洁版的example.c。git
其中,前者demo,能够配置不少编码参数,但太冗长繁杂,对初学者不太友好。github
后者demo,大多参数都已hard code,用户仅需调整width、height、color_space信息便可,阅读起来比较easy。算法
可是存在一个问题,默认输入/输出文件是stdin/stdout,这怎么能行?所以修改了一版来方便你们使用。已上传至这儿。app
修改部分须要作几点说明:函数
1. sps/pps头补加方式:param.b_repeat_headers
编码
原生方式,在每一个关键帧前编码器都会自动增长该头信息(由于设置值为1)。而实际上,通常编码参数配置了后(不需送yuv帧),spa
就能够出该csd(Codec Specific Data,对于h264为sps/pps)数据了,不需每一个关键帧前都加该头信息,所以我将该值修改成了0。code
2. 基于1的修改,须要增长特定接口得到csd数据。视频
该特定接口函数为x264_encoder_headers(h, &nal, &i_nal),打开编码器后,直接调用该接口就能够得到csd数据。blog
针对该接口,须要补充说明一点,函数返回后i_nal值表明多少个nalu单元,这里的值是3,即SPS+PPS+SEI共三种类型。
3. profile级别设定:x264_param_apply_profile
原生profile为“high”,其实我比较排斥B帧,所以修改成了baseline,由于规范中只有该profile不带B帧。
4. 固定关键帧间隔 or 根据场景自动生成
原生方式为根据场景变换来生成一个关键帧,所以何时来KeyFrame是不肯定的。其实,这种方式有其很强的合理性。
什么场景使用x264编码器?通常是视频剪辑,而不是像具体手持设备实时编码场景(场景画面变化是物理连续、渐进的),
所以,经常会出现场景切换,这个时候最合理的方案是切换后的第一帧,编码为关键帧,固然前提条件是须要必定算法去检测到场景变化了!
而个人需求是:须要出固定关键帧间隔!怎么作呢?编码参数进行以下配置:
1 param.i_keyint_max = 25; 2 3 param.i_keyint_min = 25;
然而,这样作起做用了吗?
答案可能不是那么干脆利索,不能简单用“是”或“否”来回答,只能用“几乎是”,呵呵。。。
详细说来,若是图像帧序列画风比较平稳,没有大变天,那么就会按照25的关键帧间隔编码;
而若是遇到画风大变,就会智能地编出关键帧,而后以该帧为起点再按25的关键帧间隔出帧,直到下一次画风大变。