FFmpeg拼接文件常见问题
本文出處:http://blog.csdn.net/chaijunkun/article/details/117674932,轉(zhuǎn)載請注明。由于本人不定期會整理相關(guān)博文,會對相應(yīng)內(nèi)容作出完善。因此強烈建議在原始出處查看此文。
拼接文件并不簡單
將多個視頻文件拼接在一起,看似是個很簡單的需求,但事實上由于音視頻編碼的復(fù)雜性,原始素材編碼的稍稍不同,有可能就會影響拼接的順利進行。在之前的文章中,筆者介紹了音視頻精準(zhǔn)拼接的算法原理,以及音視頻流順序不一致導(dǎo)致的拼接問題,本篇文章,將繼續(xù)介紹一些在拼接場景中的常見問題。
拼接清單文件
文件編碼
清單文件中如果包含中文,需要使用UTF-8編碼格式進行存儲,并且不要帶BOM。
文件名字符
在清單文件中指定的文件名,優(yōu)先推薦使用不帶目錄的相對文件名,例如像上面的清單文件。這是因為在默認(rèn)情況下,該種視頻合并算法中對文件名進行了安全校驗。詳細(xì)的代碼可以在libavformat/concatdec.c文件的safe_filename方法中看到。允許出現(xiàn)的字符為:A-Za-z0-9_-
當(dāng)使用絕對文件名,尤其是在Windows環(huán)境中(有d:\這樣的盤符),檢查會無法通過,需要加上-safe 0進行規(guī)避校驗。另外,絕對文件名中的路徑分隔符,無論在Windows下還是Linux下,均無需特別處理,直接使用“\”或者“/”即可。
更多參考資料,可查閱官方文檔:Concatenate Wiki
相對路徑問題
筆者發(fā)現(xiàn),在Windows和Linux中,FFmpeg對于concat清單文件中的路徑解析方式不太一樣。
Windows環(huán)境
清單文件有下列內(nèi)容:
file 'D:\res\seg_01.mp4' file 'template\copyright.mp4'目錄結(jié)構(gòu):
D:\res\seg_01.mp4\template\copyright.mp4FFmpeg工作目錄:D:\
Linux環(huán)境
清單文件有下列內(nèi)容:
file '/data/res/seg_01.mp4' file 'template/copyright.mp4'目錄結(jié)構(gòu):
/data/res/seg_01.mp4/template/copyright.mp4FFmpeg工作目錄:/data
分別運行
根據(jù)描述可知,除系統(tǒng)因素外,相對目錄結(jié)構(gòu)是一致的,在Windows中,FFmpeg可以正常識別相對目錄的寫法;在Linux中,FFmpeg在拼接時顯示了警告信息:
[concat @ 0x5c57480] Impossible to open 'res/template/copyright.mp4' 5kbits/s speed= 919x res/manifest.txt: No such file or directory雖然命令退出代碼是0,但輸出的內(nèi)容并不完整(如果強制在命令中指定了-xerror,則退出代碼不為0)。
通過警告信息,發(fā)現(xiàn)嘗試打開的文件路徑并不正確,被強制在前追加了清單文件所在目錄。而在Windows中,上述命令可成功執(zhí)行。
總之歸納為,Windows系統(tǒng)下,查找相對文件名的完整文件名是基于工作目錄的,而Linux系統(tǒng)下是基于清單文件所在目錄的。
因此,為了保證各平臺一致性,要么全部使用相對路徑,并將資源放在一起;要么全部使用絕對路徑。
拼接素材編碼參數(shù)
有時拼接多個素材時,某些可以正常執(zhí)行,有些會在控制臺顯示出如下警告信息:
[mov,mp4,m4a,3gp,3g2,mj2 @ 000001d22ce17a40] Auto-inserting h264_mp4toannexb bitstream filter [mov,mp4,m4a,3gp,3g2,mj2 @ 000001d22d7ff280] Auto-inserting h264_mp4toannexb bitstream filter [mov,mp4,m4a,3gp,3g2,mj2 @ 000001d22ce1d440] Auto-inserting h264_mp4toannexb bitstream filter [mp4 @ 000001d22d2f0740] Non-monotonous DTS in output stream 0:0; previous: 8505397, current: 8504899; changing to 8505398. This may result in incorrect timestamps in the output file.前兩條是正常拼接的輸出,在第三條素材將要進行拼接時,提示stream 0:0出了問題。可能導(dǎo)致不正確的時間戳輸出。
通過流編號以及查詢原始素材,得知該問題出在視頻流上。那么具體是什么問題呢?
在fftools/ffmpeg.c文件(write_packet方法)中,找到了相關(guān)的判斷條件,該問題出現(xiàn)在視頻流、音頻流、字幕流的拼接時(當(dāng)然還有一些例外情況,感興趣的朋友可以自行查閱源代碼),如果當(dāng)前準(zhǔn)備拼接的文件中,數(shù)據(jù)包dts(decode timestamp)小于之前所有的最大值,則觸發(fā)該異常。
看來是原始素材的問題,這里需要一款跨平臺的媒體分析工具:mediainfo。該工具可以很方便地查看媒體文件的編碼信息,從而幫助我們更為方便地定位問題。先看下正常文件的編碼信息(為方便,筆者使用的命令行版mediainfo,官方也提供了GUI版):
mediainfo source.mp4得到以下輸出,由于之前排查出問題來源于視頻流,因此我做了節(jié)選:
Video ID : 1 Format : AVC Format/Info : Advanced Video Codec Format profile : Baseline@L4 ... Encoding settings : cabac=0 / ref=1 / deblock=0:0:0 / analyse=0:0 / me=dia ...然后查看出現(xiàn)問題的文件:
mediainfo copyright.mp4輸出信息:
Video ID : 1 Format : AVC Format/Info : Advanced Video Codec Format profile : High@L4 ... Encoding settings : cabac=1 / ref=3 / deblock=1:0:0 / analyse=0x3:0x113 / me=hex ...可以看到,兩個文件的編碼器設(shè)置參數(shù)不同,這主要是由于前者先采用了較低版本的Profile,而后面的文件使用了較高版本的Profile造成的。假設(shè)將兩者順序調(diào)換,先使用較高版本Profile的文件,再使用較低版本Profile的文件,是可以正常拼接的。由此可見,高版本可以兼容低版本,而低版本無法兼容高版本。這里順便也列舉一下,不同profile的特性:
| Baseline | 支持I/P 幀,只支持無交錯(Progressive)和CAVLC,一般用于低階或需要額外容錯的應(yīng)用,比如視頻通話、手機視頻等; |
| Main | 支持I/P/B 幀,無交錯(Progressive)和交錯(Interlaced),CAVLC 和CABAC。用于主流消費類電子產(chǎn)品規(guī)格如低解碼(相對而言)的mp4、便攜的視頻播放器、PSP和Ipod等; |
| High | 在Main的基礎(chǔ)上增加了8x8 內(nèi)部預(yù)測、自定義量化、無損視頻編碼和更多的YUV 格式(如4:4:4)。用于廣播及視頻碟片存儲(藍(lán)光影片),高清電視的應(yīng)用。 |
因此,若拼接順序無法改變,則必須將高版本的Profile降下來才可以正常拼接。
ffmpeg -i copyright.mp4 -profile:v baseline -level:v 4 -c:a copy copyright_baseline.mp4此時再進行拼接,恢復(fù)正常
[mov,mp4,m4a,3gp,3g2,mj2 @ 000002252880d580] Auto-inserting h264_mp4toannexb bitstream filter [mp4 @ 0000022528a504c0] Starting second pass: moving the moov atom to the beginning of the file frame= 429 fps=0.0 q=-1.0 Lsize= 3248kB time=00:00:17.17 bitrate=1549.4kbits/s speed= 740x video:3153kB audio:82kB subtitle:0kB other streams:0kB global headers:0kB muxing overhead: 0.373567%參考文獻:
[1]微巖.H264 Profile對比分析
[EB/OL].https://blog.csdn.net/matrix_laboratory/article/details/72764621,2017-05-26.
總結(jié)
以上是生活随笔為你收集整理的FFmpeg拼接文件常见问题的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 视频怎么转换html代码实现,音视频格式
- 下一篇: html当当网上书店,当当网上书店案例代