我正在尝试通过 ffmpeg 下载 m3u8 播放列表(其中包含 1.ts、2.ts、...、xxx.ts)。我使用两种不同的方法进行下载:
- 直接下载:
ffmpeg -i "https://filelocation/chunked/myfile.m3u8" -codec copy filename_v1.mp4
- 将所有 .ts 块下载到本地;创建一个列出所有 .ts 文件的 .txt 文件;合并为一个 .ts 文件;转换为 .mp4 文件:
for i in {1..xxx}; do curl "https://filelocation/chunked/$i.ts" -o "$i.ts"; done;
for i in `\ls *.ts | sort -V`; do echo "file '$i'"; done >> list.txt
ffmpeg -f concat -i list.txt -c copy filename_v2.ts
ffmpeg -i filename_v2.ts filename_v2.mp4
我最终得到的两个 mp4 文件大小相差很大,filename_v2.mp4 大约是 filename_v1.mp4 大小的 1/10(假设每个块约为 5MB,我有 100 个,filename_v1.mp4 约为 500MB,而 filename_v2.mp4 约为 50MB);此外,filename_v2.mp4 的持续时间会比 filename_v1.mp4 略短。这是为什么?这种方法是不是“错误”的?
答案1
该命令ffmpeg -i filename_v2.ts filename_v2.mp4
重新压缩媒体。它不再是源数据。
相反,在生成 list.txt 时,删除file
并使用echo "$i"
然后运行,
ffmpeg -f mpegts -i concatf:list.txt -c copy filename_v2.mp4