h264有兩種封裝,一種是annexb模式,傳統模式,有startcode(0x000001或0x0000001)分割NALU,在mpegts流媒體中使用,vlc里打開編碼器信息中顯示h264;
一種是AVCC模式,一般用mp4、mkv、flv容器封裝,以長度信息分割NALU, vlc里打開編碼器信息中顯示avc1。
很多場景需要進行這兩種格式之間的轉換,FFmpeg提供了名稱為h264_mp4toannexb的Bitstream Filter(bsf)來實現這個功能。
例如將mp4轉換成h264可使用如下指令:
mp4->h264:sudo ffmpeg -i test.mp4 -codec copy -bsf: h264_mp4toannexb -f h264 test.h264
很多博客介紹的方法也對,但是轉碼之后碼率會過高,慎用。
Bitstream Filter
(1)主要目的是對數據進行格式轉換,使它能夠被解碼器處理(比如HEVC QSV的解碼器)。
(2)Bitstream Filter對已編碼的碼流進行操作,不涉及解碼過程。
(3)使用ffmpeg -bsfs命令可以查看ffmpeg工具支持的Bitstream Filter類型。
(4)使用ff*工具的 -bsf 選項來指定對具體流的Bitstream Filter,使用逗號分割的多個filter,如果filter有參數, 參數名和參數值跟在filter名稱后面。
bsf的使用方法:
(1)使用查詢函數av_bsf_get_by_name 根據名稱查找對應的AVBitstreamFilter。
(2)使用av_bsf_alloc為AVBSFContext和他的一些內部變量分配內存。
(3)設置AVBSFContext可能需要使用一些變解碼參數和time_base[2].
(4)在設置好參數之后使用av_bsf_init來初始化bsf.
(5)使用av_bsf_send_packet函數輸入數據,並使用av_bsf_receive_packet獲得處理后的輸出數據。
(6)處理結束后,av_bsf_free清理用於上下文和內部緩沖區的內存。
該接口官網介紹:
ffmpeg視頻轉碼基礎操作可參考:http://www.ruanyifeng.com/blog/2020/01/ffmpeg.html