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上就都能播放。