大家好,歡迎來(lái)到停止重構(gòu)的頻道。
本期我們討論音視頻文件轉(zhuǎn)編碼,如將視頻H264轉(zhuǎn)H265等。
內(nèi)容中所提及的代碼都會(huì)放在GitHub,感興趣的小伙伴可以到GitHub下載。
我們按這樣的順序展開(kāi)討論:?
1、??編碼的作用?
2、??轉(zhuǎn)編碼的工作原理
3、??編解碼器安裝?
4、??示例代碼講解?
編碼的作用
在前面《音視頻轉(zhuǎn)碼工作原理》中討論過(guò),一個(gè)視頻文件實(shí)質(zhì)上是分3層的,封裝、編碼、基礎(chǔ)數(shù)據(jù)。
編碼的作用是為了壓縮數(shù)據(jù),限制最終文件的大小。
選擇不同的編碼格式,更多是為了節(jié)省更多的存儲(chǔ)空間,或者為了擴(kuò)大客戶(hù)端的播放兼容性。
這里值得一提的是,編碼是需要區(qū)分音頻和視頻的,視頻的編碼器是不能壓縮音頻數(shù)據(jù)的,反之亦然。?
?
關(guān)于H264等視頻編碼格式的詳細(xì)說(shuō)明,可參考往期《H264》。
?
關(guān)AAC等音頻編碼格式的詳細(xì)說(shuō)明,可參考往期《AAC》
轉(zhuǎn)編碼的工作原理?
整個(gè)轉(zhuǎn)編碼的過(guò)程是?解封裝>>解碼>>編碼>>封裝。
將解封裝后的數(shù)據(jù)塊放到對(duì)應(yīng)的解碼器中,即可解壓縮成原始的視頻幀、音頻幀。
將原始幀放入目標(biāo)編碼器中,即可壓縮出對(duì)應(yīng)編碼格式的數(shù)據(jù)塊。
其中一個(gè)數(shù)據(jù)塊不一定是完整的一幀數(shù)據(jù)?一些封裝格式,可能幾個(gè)數(shù)據(jù)塊才能組成完整的一幀數(shù)據(jù)。
整個(gè)過(guò)程是流式的,循環(huán)往復(fù),直到處理完成。
這里需要特別說(shuō)明的是,編碼器、解碼器都是對(duì)應(yīng)編碼格式的,是特定的算法程序,是現(xiàn)成的。
如h264轉(zhuǎn)h265,則解碼器使用h264的,編碼器使用h265的。
如果是直播的場(chǎng)景,可以選擇在封裝前加上時(shí)間間隔,請(qǐng)參考往期《重封裝》,?本期不作贅述。
補(bǔ)充說(shuō)明一下,轉(zhuǎn)編碼實(shí)際上只是換了一種編碼格式,可以對(duì)編碼器設(shè)置諸如碼率等影響壓縮效率的參數(shù),也可以設(shè)置諸如去除B幀等編碼格式特有的參數(shù)。
但是想要改變分辨率、幀率、采樣率等參數(shù)的話,則需要對(duì)原始幀數(shù)據(jù)進(jìn)行處理才行,關(guān)于這部分的詳細(xì)說(shuō)明,請(qǐng)關(guān)注下一期內(nèi)容。
?
編解碼器安裝
FFmpeg默認(rèn)情況下會(huì)包含一些編解碼器,可以使用命令查看FFmpeg支持的編解碼器。
如果需要對(duì)FFmpeg擴(kuò)展編解碼器的話,則需要先安裝對(duì)應(yīng)的編碼器/解碼器程序,然后修改FFmpeg編譯配置,并重新編譯安裝即可。
關(guān)于FFmpeg更詳細(xì)的說(shuō)明,可參考往期《FFmpeg》。
?
示例代碼講解?
轉(zhuǎn)編碼的示例代碼為trancode.cpp?,示例代碼是H264轉(zhuǎn)H265的。
在原來(lái)轉(zhuǎn)封裝示例代碼基礎(chǔ)上,增加了初始、關(guān)閉編解碼器,循環(huán)處理數(shù)據(jù)中加入了解碼、編碼過(guò)程。
在設(shè)置解碼器/編碼器timebase時(shí),F(xiàn)Fmpeg推薦設(shè)置為幀率的倒數(shù),但按我們的經(jīng)驗(yàn),這樣會(huì)有很多問(wèn)題,所以我們更推薦設(shè)置為統(tǒng)一的timebase。
?
在轉(zhuǎn)編碼過(guò)程中,需要在解碼前、編碼后,做一下timebase轉(zhuǎn)換?,才能保證視頻播放時(shí)不會(huì)過(guò)快或過(guò)慢。
?
?
在編碼/解碼時(shí),需要區(qū)分音頻/視頻,將數(shù)據(jù)放到對(duì)應(yīng)的編解碼器。
另外,編碼/解碼實(shí)質(zhì)上是異步的,所以程序需要判斷是否取出數(shù)據(jù)再進(jìn)行下一步。
?
而且因?yàn)榫幗獯a異步處理的原因,且解編碼是需要花費(fèi)一定時(shí)間的,所以在讀取完視頻文件時(shí)?,編解碼器可能還存在未處理完的數(shù)據(jù)。
所以在讀出完視頻文件后,還需要等待編解碼器處理完所有的數(shù)據(jù)才算處理結(jié)束。
總結(jié)
本期內(nèi)容的代碼已經(jīng)上傳Github,需要的朋友可以下載。
文章來(lái)源:http://www.zghlxwxcb.cn/news/detail-668282.html
以上代碼講解只提及了重要的部分,代碼中含有更詳細(xì)的注釋說(shuō)明,里面有編譯運(yùn)行環(huán)境的搭建說(shuō)明,也提供了做好的docker容器。文章來(lái)源地址http://www.zghlxwxcb.cn/news/detail-668282.html
到了這里,關(guān)于【音視頻處理】轉(zhuǎn)編碼H264 to H265,F(xiàn)Fmpeg,代碼分享講解的文章就介紹完了。如果您還想了解更多內(nèi)容,請(qǐng)?jiān)谟疑辖撬阉鱐OY模板網(wǎng)以前的文章或繼續(xù)瀏覽下面的相關(guān)文章,希望大家以后多多支持TOY模板網(wǎng)!