針對網絡視頻中使用的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
因此,若想實現本地合併,需要下載三類文件:
- m3u8文件,一般名稱爲 index.m3u8
- m3u8文件中提到的ts文件,即未使用#作爲行起始的名稱文件
- 加密文件,一般名稱爲 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系統下使用相對路徑或者絕對路徑時,
- 若是 key.key 文件路徑,若使用
\
作爲路徑分隔符,則記得要將其轉義,即使用\\
表示路徑分隔符,否則絕對會因爲\
的轉義功能導致觸發路徑問題而找不到key.key
文件。 - 若是 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