gpt4 book ai didi

ffmpeg - 如何一次性下载.m3u8

转载 作者:行者123 更新时间:2023-12-01 16:03:32 25 4
gpt4 key购买 nike

我在远程主机上有一个 .m3u8 文件,其中包含固定数量的 block .ts 文件名,而不是流:

#EXTM3U
#EXT-X-VERSION:3
#EXT-X-TARGETDURATION:11
#EXT-X-MEDIA-SEQUENCE:0
#EXTINF:9.736,
media_0.ts
#EXTINF:9.96,
media_1.ts
#EXTINF:10.0,
media_2.ts
#EXTINF:10.0,
media_3.ts
#EXTINF:10.0,
media_4.ts
#EXTINF:10.2,
media_5.ts
#EXTINF:10.0,

当我使用此命令时:

# ffmpeg -i "http://example.com/chunklist.m3u8" file.mp4

frame= 582 fps=9.4 q=28.0 size= 1536kB time=00:00:23.21 bitrate= 542.1kbits/s dup=2 drop=4 speed=0.375x

它有效。但它获取逐帧视频并且需要很长时间。 (播放视频几乎需要时间。)

但是由于所有 .ts 文件的路径都是已知的。 (http://example.com/media_0.tshttp://example.com/media_1.ts,...)必须有一种方法可以同时获取并合并它们。

但是如何在 ffmpeg 中直接?!

编辑(尝试解决方案):

对于一种解决方案,我知道如何使用 ffmpeg 连接文件。

ffmpeg -i "concat:0.ts|1.ts|2.ts|3.ts|4.ts|5.ts" -c copy output.mp4

这个 ffmpeg 命令非常棒,并且在不到 1 秒的时间内运行!

因此尝试使用以下命令下载带有 CURL 的所有 .ts 文件:

curl \
http://example.com/media_0.ts -o 0.ts \
http://example.com/media_1.ts -o 1.ts \
http://example.com/media_2.ts -o 2.ts \
http://example.com/media_3.ts -o 3.ts \
http://example.com/media_4.ts -o 4.ts \
http://example.com/media_5.ts -o 5.ts

但是你可以看到结果:

  % Total    % Received % Xferd  Average Speed   Time    Time     Time  Current
Dload Upload Total Spent Left Speed
100 687k 100 687k 0 0 75108 0 0:00:09 0:00:09 --:--:-- 74111
100 652k 100 652k 0 0 59404 0 0:00:11 0:00:11 --:--:-- 53400
100 673k 100 673k 0 0 48675 0 0:00:14 0:00:14 --:--:-- 55781
100 657k 100 657k 0 0 63573 0 0:00:10 0:00:10 --:--:-- 62494
100 671k 100 671k 0 0 39019 0 0:00:17 0:00:17 --:--:-- 40863
100 692k 100 692k 0 0 63480 0 0:00:11 0:00:11 --:--:-- 80049

看,总下载时间是 72 秒,而所有部分的总持续时间是 59 秒!这时间很长!

很抱歉,下载所有部分然后连接,这不是一个好的解决方案。

编辑2

我尝试在另一台服务器上使用不同的 URL 获取另一个 .m3u8 文件:

下载并连接在一起:

ffmpeg -i "concat:\
http://184.72.239.149/vod/smil:BigBuckBunny.smil/media_w442897525_b560000_0.ts|\
http://184.72.239.149/vod/smil:BigBuckBunny.smil/media_w442897525_b560000_1.ts|\
http://184.72.239.149/vod/smil:BigBuckBunny.smil/media_w442897525_b560000_2.ts|\
http://184.72.239.149/vod/smil:BigBuckBunny.smil/media_w442897525_b560000_3.ts|\
http://184.72.239.149/vod/smil:BigBuckBunny.smil/media_w442897525_b560000_4.ts|\
http://184.72.239.149/vod/smil:BigBuckBunny.smil/media_w442897525_b560000_5.ts\
" -c copy -y output.ts

另一个带有 input.txt URL 文件的命令。

ffmpeg -f "concat" -i "input.txt" -c copy -y output.ts

输入.txt文件:

file 'http://184.72.239.149/vod/smil:BigBuckBunny.smil/media_w442897525_b560000_0.ts'
file 'http://184.72.239.149/vod/smil:BigBuckBunny.smil/media_w442897525_b560000_1.ts'
file 'http://184.72.239.149/vod/smil:BigBuckBunny.smil/media_w442897525_b560000_2.ts'
file 'http://184.72.239.149/vod/smil:BigBuckBunny.smil/media_w442897525_b560000_3.ts'
file 'http://184.72.239.149/vod/smil:BigBuckBunny.smil/media_w442897525_b560000_4.ts'
file 'http://184.72.239.149/vod/smil:BigBuckBunny.smil/media_w442897525_b560000_5.ts'

或者如果需要的话有时会执行此命令:

ffmpeg -f "concat" -safe "0" -protocol_whitelist "file,http,https,tcp,tls" -i "input.txt" -c copy -y output.ts

最后,由于下载速度不错,可能我的服务器目标带宽有限。 :-(

最佳答案

从 m3u8 播放列表连接多个视频文件的正确方法是

ffmpeg -i "http://example.com/chunklist.m3u8"-codec 复制文件.mp4

<小时/>
  • m3u8 播放列表可以位于网络上或本地目录中
    • 它包含相对于播放列表的文件路径列表
  • -codec copy以避免编码(这需要时间)
  • 容器类型很重要:
    • *.mp4 很好,但从网络获取播放列表时,复用似乎有点慢
    • *.mkv*.ts 最适合我

关于ffmpeg - 如何一次性下载.m3u8,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/47233304/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com