ffmpeg那些事 - 合併ts文件爲視頻

針對網絡視頻中使用的ts流技術,可以將文件單獨下載下來,並使用ffmpeg 通過處理 m3u8 文件實現合併視頻的效果。如使用下面命令:

ffmpeg.exe -allowed_extensions ALL -i "a.m3u8" -c copy "b.mp4" 		———— ①

而對於m3u8文件的格式大致如下,可以通過查詢相關資料獲得更相信信息。

#EXTM3U  
#EXT-X-VERSION:3  
#EXT-X-TARGETDURATION:6  
#EXT-X-PLAYLIST-TYPE:VOD  
#EXT-X-MEDIA-SEQUENCE:0  
#EXT-X-KEY:METHOD=AES-128,URI="key.key"  
#EXTINF:5.171,  
ts0.ts  
#EXTINF:2.002,
ts1.ts
...
#EXT-X-ENDLIST

因此,若想實現本地合併,需要下載三類文件:

  1. m3u8文件,一般名稱爲 index.m3u8
  2. m3u8文件中提到的ts文件,即未使用#作爲行起始的名稱文件
  3. 加密文件,一般名稱爲 key.key,即#EXT-X-KEY:METHOD=AES-128中URI指定的文件

現如今遇到了若干處理問題,記錄如下:

一. key.key文件被加密

第一次遇到 key.key 文件通過 base64 加密的問題。當key.key文件被加密後,運行ffmpeg命令時會顯示加載失敗的錯誤信息,這種也與找不到 key.key 文件相似:

Error when loading first segment 'xxx.ts'
index.m3u8: Invalid data found when processing input

二.key.key,ts 路徑錯誤(windows)

如果 m3u8 文件與 key.key 文件放在同一目錄下時,這一切都不是問題。ffmpeg 會使用 絕對路徑 或者 相對於工作目錄相對路徑 進行尋找各個匹配的文件,只要 ffmpeg 認爲 是的話。

若在命令行下使用 ffmpeg 命令,則使用命令行所在起始目錄作爲 工作目錄,並在 m3u8 文件中尋找相對於該 工作目錄ts 文件,如以下命令會使用相對於 f:\cache\ts 目錄尋找文件。

F:\cache\ts>F:\Project\ffmpeg-4.1.3-win64-shared\bin\ffmpeg.exe -allowed_extensions ALL -i "index.m3u8"  -c copy "index.mp4"

Python 語言中,可使用 os.chdir() 先行移動到該工作目錄。

在windows系統下使用相對路徑或者絕對路徑時,

  1. 若是 key.key 文件路徑,若使用 \ 作爲路徑分隔符,則記得要將其轉義,即使用 \\ 表示路徑分隔符,否則絕對會因爲 \ 的轉義功能導致觸發路徑問題而找不到 key.key 文件。
  2. 若是 ts 文件,則正常使用 \ 即可。 因此推薦不論 key.key 文件還是 ts 文件,若表示相對路徑,使用 / 符,省去了考慮轉義的問題。

出於方便考慮,推薦全部使用 / 作爲相對路徑的分隔符。

三.命令行中m3u8文件路徑問題(windows)

在windows系統下執行命令 時,其中指定的m3u8文件路徑,必須使用\作爲路徑分隔符。如下,否則會因爲文件中使用相對路徑導致找不到。

ffmpeg.exe -allowed_extensions ALL -i "f:\cache\info\local.m3u8"  -c copy "f:\abc.mp4"

注意 :以上皆是通過測試總結而來,並基於以下版本信息,若有不妥,請多擔待。

ffmpeg version 4.1.3 Copyright (c) 2000-2019 the FFmpeg developers
built with gcc 8.3.1 (GCC) 20190414
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章