用ffmpeg4.x AV_CODEC_ID_H264编码器将yuv数据转换成h264有B帧问题解决
H.265技术在码率上进行了深度优化,同等画质下,可以比H.264节省近50%的码率,使存储成本大大降低。我们流媒体服务器和流媒体播放器都将会趋向于H265编码,之前我们实现了H265编码的播放:EasyRTMP-Android使用H265编码流程,而现在我们也实现了RTSP/Onvif网络摄像头流媒体服务器播放H265编码视频。
本文我们暂时不讨论H265,我们来讲一下有用户遇到的关于ffmpeg4.x AV_CODEC_ID_H264编码器将yuv数据转换成h264的问题。
有开发者用ffmpeg4.x AV_CODEC_ID_H264编码器将yuv数据转换成h264,转换成的h264里面有B帧,将h264转换成mp4,再将yuv转换成h264的时候是设置了pts和dts的,但是转成h264后,pts和dts都没了,再将h264转换成mp4的时候还得重新设置pts和dts,但是流里面有B帧,因此pts和dts不能设置成一样的,这位开发者无法解决此问题。
这是因为h264文件里是不会把pts写进去的,dts也不会,但是他是按照dts的顺序写进去的,可以在avframe里设置好pts,然后出来avpacket以后,直接把avpacket写到文件里。
后来我们跟这块有了解的同事沟通了一下,将h264直接存mp4,发现里面没有I帧,播放器可能无法播放,但是同样代码换到ffmpeg3.x上就都能播放。