针对网络视频中使用的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