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
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章