本文主要了解FFmpeg進(jìn)行音視頻編碼轉(zhuǎn)換。主要學(xué)習(xí)如下幾個(gè)知識(shí)點(diǎn):
FFmpeg軟編碼H.264和H.265支持H.264的封裝格式的文件格式有很多,例如FLV,MP4,HLS,TS等。FFmpeg本身不支持H.264的編碼器,通過第三方庫x264或者OpenH264來支持,但是OpenH264開源較晚,所以多數(shù)使用的還是x264,可以通過命令行 H.264編碼實(shí)例通過上面的-h命令查看x264支持的參數(shù)真的很多,我們?cè)谝玫絻?yōu)化的時(shí)候可以仔細(xì)了解其參數(shù)的含義,下面的幾個(gè)實(shí)例列出了一些參數(shù)的使用,簡單的了解參數(shù)的含義以及使用方法。每一個(gè)參數(shù)都可以帶很多不同的配置,在使用的時(shí)候查看文檔 編碼器預(yù)設(shè)參數(shù)preset這個(gè)參數(shù)主要調(diào)節(jié)編碼速度和質(zhì)量的平衡,有ultrafast、superfast、veryfast、faster、fast、medium、slow、slower、veryslow、placebo這10個(gè)選項(xiàng),從快到慢。 使用H.264轉(zhuǎn)碼文件
輸出關(guān)鍵速度信息 多了一個(gè)參數(shù)-preset ultrafast 中的ultrafast表示使用最快的編碼方式,默認(rèn)的編碼速度是medium模式的,來查看這兩種模式生成的輸出信息差異。
上面的ultrafast速度是41.1倍,使用medium速度是6。24倍但是生成的視頻的畫質(zhì)速度低的會(huì)好一些, 編碼優(yōu)化參數(shù)tune這個(gè)參數(shù)配合視頻類型和視覺優(yōu)化的參數(shù)??蛇x項(xiàng)
profile和level設(shè)置profile和level的設(shè)置和H.264標(biāo)準(zhǔn)文檔ISO-14496-Part10描述的profile和level信息基本相同。profile有如下選項(xiàng):
下面使用baseline profile和high profile編碼一個(gè)H.264視頻,分析兩個(gè)編碼出來的文件的區(qū)別。有一個(gè)知識(shí)我們提取了解一下baseline profile編碼出來額視頻不會(huì)包含B幀,而high profile包含B幀,下面就看它們B幀的差別
生成了兩個(gè)文件,通過ffprobe來查看包含B幀的信息
輸出0
輸出161 sc_thresholdFFmpeg可以通過參數(shù)-g設(shè)置幀數(shù)間隔為GOP的長度,但是遇到場景切換的時(shí)候,從一個(gè)畫面突然變?yōu)榱硪粋€(gè)畫面時(shí),會(huì)強(qiáng)行插入一個(gè)關(guān)鍵幀,這時(shí)GOP的長度會(huì)重新開始??梢酝ㄟ^參數(shù)sc_threshold決定是否在場景切換的時(shí)候插入關(guān)鍵幀。
執(zhí)行完畢后生成的文件每50幀被設(shè)置為一個(gè)GOP間隔。 可以看到紅色框框框起來的兩個(gè)I幀間隔很短,因?yàn)椴迦氲腎幀和前面的畫面完全不同 看到有些GOP的間距很短,這是因?yàn)閺?qiáng)行插入了GOP導(dǎo)致的,為了使GOP的插入更加均勻,使用sc_threshold設(shè)置一下:
再看GOP的幀信息如下: 拖動(dòng)下面的滾動(dòng)條沒有發(fā)現(xiàn)和上面一樣相隔很近的兩個(gè)I幀了。 x264opts由于FFmpeg設(shè)置x264參數(shù)時(shí)增加的參數(shù)比較多,F(xiàn)Fmpeg開放了x264opts,可以通過這個(gè)參數(shù)設(shè)置x264的內(nèi)部私有參數(shù),如設(shè)置IBP幀的順序以及規(guī)律。下面列舉在上面生成的GOP文件數(shù)據(jù)分析基礎(chǔ)上控制生成的文件不出現(xiàn)B幀,只要設(shè)置x264內(nèi)部參數(shù)bframes=0即可:
通過StreamEye查看Stream信息沒有出現(xiàn)B幀 如果希望控制I幀P幀B幀的頻率和規(guī)律,可以通過控制GOP中B幀的幀數(shù)來實(shí)現(xiàn),P幀的頻率可以通過x264的參數(shù)b-adapt進(jìn)行設(shè)置。
看看分析: nal-hrd編碼可以設(shè)置VBR,CBR的編碼模式,VBR為可變碼率,CBR為恒定碼率?;ヂ?lián)網(wǎng)上VBR居多,但是我們可以使用FFmpeg制作CBR碼率視頻。
命令執(zhí)行參數(shù)介紹
可以通過工具Bitrate Viewer查看碼率波動(dòng),我就沒試了,通過Elecard StreamEye查看流信息的bitrate type為CBR。 FFmpeg硬編解碼以前都不知道FFmpeg可以硬編解碼,以為它就只能軟編解碼,它真的強(qiáng)大。FFmpeg可以在Nvidia GPU,Intel QSV,樹莓派,OS X系統(tǒng)下硬編解碼。我使用的是OS X系統(tǒng),所以下面來實(shí)驗(yàn)一個(gè)在該系統(tǒng)的硬編解碼。 OS X系統(tǒng)硬編解碼直接看一個(gè)硬轉(zhuǎn)碼的實(shí)例,先把一個(gè)視頻通過h264_vda硬解碼,然后通過h264_videotoolbox硬編碼視頻文件。
結(jié)果出現(xiàn)錯(cuò)誤如下: 這個(gè)錯(cuò)誤可清楚的知道是沒有安裝h264_vda工具庫,在前面的文章我們知道如何重新給本機(jī)的FFmpeg帶參數(shù)安裝一些我們要使用的庫了。但是我找了可以帶的–with參數(shù),不知道解碼器h264_vda屬于哪個(gè)庫里面的。//todo FFmpeg輸出MP3編碼MP3使用編碼器libmp3lame這個(gè)庫,通過命令
輸出的碼率類型參數(shù)設(shè)置
控制碼率的參數(shù)為-q:a后面帶數(shù)字 FFmpeg輸出AACAAC是一種比MP3的編碼效率更高,編碼音質(zhì)更好的音頻編碼格式,常見的使用AAC編碼后的文件存儲(chǔ)格式為m4a。FFmpeg可以使用如下三種編碼器
FFmpeg使用AAC編碼器看下面最簡單的例子:
同樣可以使用-q:a帶數(shù)值代表的碼率信息進(jìn)行轉(zhuǎn)換 |
|