FFmpeg x264编码b帧时时间戳,帧率等总结

版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.csdn.net/zhengbin6072/article/details/78902983

1. 在进行FFmpeg API转码视频时,解码出来的视频帧是包含有frame->pict_type字段的,如果编码前不处理,x264会按照该类型强制编码。如果希望x264自动插入b帧编码,在编码前需要将frame->pict_type设置为AV_PICTURE_TYPE_NONE。x264编码出来后的帧类型可以通过AVCodecContext的coded_frame成员来判断。


2. 在编码含有b帧的情况下,p帧和b帧的pts和dts是不相同的。如果希望编码器自动处理帧时间戳,需要在编码前的frame中设置pts和dts为相同值,编码器会根据延迟打dts时间戳。如果编码前没有设置frame的pts和dts,则时间戳需要在编码后自己计算加上去。


3. ffmpeg转码时的编码AVCodecContext的framerate字段设置了未必是有效的(实际上是由每一帧的真实显示时间偏移决定的)。一般可以通过结合AVCodecContext的time_base字段和每一帧的时间戳来计算每一帧的实际显示时间偏移(s),比如设置time_base为{1, 50},视频帧时间戳按1递增,则每一帧的显示间隔为0.02s,一秒显示50帧,从而控制每秒钟显示的帧数。 


4. 每一帧的显示时间是由frame中的pts来决定的,该pts的time_base为AVCodecContext的time_base。在解码前需要将input stream的time_base转换为input AVCodecContext的time_base,在编码后需要将output 的AVCodecContext的time_base转换为output stream的的time_base。

猜你喜欢

转载自blog.csdn.net/zhengbin6072/article/details/78902983