一、前言
用ffmpeg單獨(dú)做視頻保存不難,單獨(dú)做音頻保存也不難,難的是音視頻同步保存到MP4中,重點(diǎn)是音視頻要同步,其實(shí)這也不難,只要播放那邊音視頻同步后的數(shù)據(jù),寫入到文件即可。最難的是在播放過程中不斷隨機(jī)的切換播放進(jìn)度,而且還會(huì)暫停播放、暫停錄制的情況出現(xiàn),這些個(gè)復(fù)雜情況的出現(xiàn),可以說,測(cè)試了所有網(wǎng)絡(luò)上可能找到的相關(guān)代碼,沒有一個(gè)是行得通的,基本上都是停留在最簡(jiǎn)單的處理。那怎么辦呢?近期花了半個(gè)月的時(shí)間,閉門把這個(gè)硬骨頭啃下來,專門處理這個(gè)問題,畢竟暫停播放、暫停錄制、切換進(jìn)度這些個(gè)情況都是極大概率發(fā)生的,這一關(guān)過不了,就無法號(hào)稱最全播放組件了。總之核心的解決辦法就是,除了要重新調(diào)整時(shí)間基準(zhǔn)以外,還需要在前面重新按照幀數(shù)量和音頻的時(shí)長(zhǎng)來設(shè)置pts/dts,網(wǎng)上能找到的代碼,幾乎都沒看到這個(gè)計(jì)算,幾乎都是調(diào)整時(shí)間基準(zhǔn)的。大致整理了下能夠做到下面幾點(diǎn)的才能基本合格。文章來源:http://www.zghlxwxcb.cn/news/detail-582749.html
- 網(wǎng)上的保存計(jì)算都是在理想狀態(tài)下進(jìn)行的(打開后從第一幀開始保存直到結(jié)束)
- 中間如果切換了播放進(jìn)度(不是連續(xù)的幀)
- 中間暫停了流采集或者暫停了錄制(不是連續(xù)的時(shí)間)
- 同時(shí)支持錄制到文件和推流到服務(wù)器
- 音視頻同步輸出(任意切換進(jìn)度自動(dòng)同步)
- 指定只存儲(chǔ)視頻或者音頻
- 音視頻流索引順序是0/1和1/0
- 不編碼存儲(chǔ)和重新編碼存儲(chǔ)
為何要區(qū)分不編碼存儲(chǔ)和重新編碼存儲(chǔ)?因?yàn)榫幋a要占用cpu,對(duì)于源頭就是H264/265/AAC這種,完全可以不用編碼直接存儲(chǔ)到MP4文件中,可以大大節(jié)約CPU資源,所以保存類的設(shè)計(jì)中,就應(yīng)該有這個(gè)判斷。文章來源地址http://www.zghlxwxcb.cn/news/detail-582749.html
二、效果圖
到了這里,關(guān)于Qt/C++音視頻開發(fā)46-音視頻同步保存到MP4的文章就介紹完了。如果您還想了解更多內(nèi)容,請(qǐng)?jiān)谟疑辖撬阉鱐OY模板網(wǎng)以前的文章或繼續(xù)瀏覽下面的相關(guān)文章,希望大家以后多多支持TOY模板網(wǎng)!