如何一次下载.m3u8

Nab*_*.Z. 6 ffmpeg concatenation m3u8

.m3u8在远程主机上有一个文件,其中包含固定数量的块.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,
Run Code Online (Sandbox Code Playgroud)

当我使用此命令时:

# 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
Run Code Online (Sandbox Code Playgroud)

有用。但是它获得逐帧视频,并且需要很长时间。(几乎要花费一些时间来播放视频。)

但是由于所有.ts文件的路径都是已知的。(http://example.com/media_0.ts,http : //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
Run Code Online (Sandbox Code Playgroud)

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

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

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
Run Code Online (Sandbox Code Playgroud)

但是您可以看到结果:

  % 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
Run Code Online (Sandbox Code Playgroud)

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

非常抱歉,下载所有部分,然后确认这不是一个好的解决方案。

编辑2

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

一起下载并连接:

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
Run Code Online (Sandbox Code Playgroud)

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

ffmpeg -f "concat" -i "input.txt" -c copy -y output.ts
Run Code Online (Sandbox Code Playgroud)

input.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'
Run Code Online (Sandbox Code Playgroud)

或者,如果需要,可以使用以下命令:

ffmpeg -f "concat" -safe "0" -protocol_whitelist "file,http,https,tcp,tls" -i "input.txt" -c copy -y output.ts
Run Code Online (Sandbox Code Playgroud)

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

Vla*_*čík 5

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

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


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


Gat*_*spy 1

你可以尝试这个命令:

ffmpeg -y \
  -v warning \
  -loglevel debug \
  -i "https://m3u8.url" \
  -vcodec copy \
  -c copy -f mpegts out.ts
Run Code Online (Sandbox Code Playgroud)

接下来使用此命令将 ts 转换为 mp4:

ffmpeg -i out.ts -acodec copy -vcodec copy out.mp4