使用youtube-dl下载.m3u8流文件或其他直播流格式的视频是否可能?
当我将视频URL复制到YouTube-dl中时,它会输出:
[https @ 0x7fc351416080] inflate return value: -3, incorrect header check
Last message repeated 15 times
之后它会输出几行红色文本,似乎无法正确复制,因此我粘贴了一小段:
有人知道这是否可行吗?
使用youtube-dl下载.m3u8流文件或其他直播流格式的视频是否可能?
当我将视频URL复制到YouTube-dl中时,它会输出:
[https @ 0x7fc351416080] inflate return value: -3, incorrect header check
Last message repeated 15 times
之后它会输出几行红色文本,似乎无法正确复制,因此我粘贴了一小段:
有人知道这是否可行吗?
我将以NASA电视台的这个现场直播为例:
https://www.youtube.com/watch?v=21X5lGlDOfg
首先,列出视频的格式:
youtube-dl --list-formats https://www.youtube.com/watch\?v\=21X5lGlDOfg
[youtube] 21X5lGlDOfg: Downloading webpage
[youtube] 21X5lGlDOfg: Downloading m3u8 information
[youtube] 21X5lGlDOfg: Downloading MPD manifest
[info] Available formats for 21X5lGlDOfg:
format code extension resolution note
91 mp4 256x144 HLS 197k , avc1.42c00b, 30.0fps, mp4a.40.5@ 48k
92 mp4 426x240 HLS 338k , avc1.4d4015, 30.0fps, mp4a.40.5@ 48k
93 mp4 640x360 HLS 829k , avc1.4d401e, 30.0fps, mp4a.40.2@128k
94 mp4 854x480 HLS 1380k , avc1.4d401f, 30.0fps, mp4a.40.2@128k
300 mp4 1280x720 3806k , avc1.4d4020, 60.0fps, mp4a.40.2 (best)
选择您想要下载的格式,并从清单中提取视频的HLS m3u8 URL。 我将在此示例中使用94 mp4 854x480 HLS 1380k,avc1.4d401f,30.0fps,mp4a.40.2 @ 128k
:
youtube-dl -f 94 -g https://www.youtube.com/watch\?v\=21X5lGlDOfg
https://manifest.googlevideo.com/api/manifest/hls_playlist/expire/1592099895/ei/1y_lXuLOEsnXyQWYs4GABw/ip/81.190.155.248/id/21X5lGlDOfg.3/itag/94/source/yt_live_broadcast/requiressl/yes/ratebypass/yes/live/1/goi/160/sgoap/gir%3Dyes%3Bitag%3D140/sgovp/gir%3Dyes%3Bitag%3D135/hls_chunk_host/r5---sn-h0auphxqp5-f5fs.googlevideo.com/playlist_duration/30/manifest_duration/30/vprv/1/playlist_type/DVR/initcwndbps/8270/mh/N8/mm/44/mn/sn-h0auphxqp5-f5fs/ms/lva/mv/m/mvi/4/pl/16/dover/11/keepalive/yes/beids/9466586/mt/1592078245/disable_polymer/true/sparams/expire,ei,ip,id,itag,source,requiressl,ratebypass,live,goi,sgoap,sgovp,playlist_duration,manifest_duration,vprv,playlist_type/sig/AOq0QJ8wRgIhAM2dGSece2shUTgS73Qa3KseLqnf85ca_9u7Laz7IDfSAiEAj8KHw_9xXVS_PV3ODLlwDD-xfN6rSOcLVNBpxKgkRLI%3D/lsparams/hls_chunk_host,initcwndbps,mh,mm,mn,ms,mv,mvi,pl/lsig/AG3C_xAwRQIhAJCO6kSwn7PivqMW7sZaiYFvrultXl6Qmu9wppjCvImzAiA7vkub9JaanJPGjmB4qhLVpHJOb9fZyhMEeh1EUCd-3Q%3D%3D/playlist/index.m3u8
请注意链接可能会不同,它包含一个过期时间戳,在这个例子中是1592099895(大约6小时)。
现在您已经获得了HLS播放列表,您可以在VLC中打开此URL并使用“记录”保存它,或者编写一个小的ffmpeg命令:
ffmpeg -i \
https://manifest.googlevideo.com/api/manifest/hls_playlist/expire/1592099895/ei/1y_lXuLOEsnXyQWYs4GABw/ip/81.190.155.248/id/21X5lGlDOfg.3/itag/94/source/yt_live_broadcast/requiressl/yes/ratebypass/yes/live/1/goi/160/sgoap/gir%3Dyes%3Bitag%3D140/sgovp/gir%3Dyes%3Bitag%3D135/hls_chunk_host/r5---sn-h0auphxqp5-f5fs.googlevideo.com/playlist_duration/30/manifest_duration/30/vprv/1/playlist_type/DVR/initcwndbps/8270/mh/N8/mm/44/mn/sn-h0auphxqp5-f5fs/ms/lva/mv/m/mvi/4/pl/16/dover/11/keepalive/yes/beids/9466586/mt/1592078245/disable_polymer/true/sparams/expire,ei,ip,id,itag,source,requiressl,ratebypass,live,goi,sgoap,sgovp,playlist_duration,manifest_duration,vprv,playlist_type/sig/AOq0QJ8wRgIhAM2dGSece2shUTgS73Qa3KseLqnf85ca_9u7Laz7IDfSAiEAj8KHw_9xXVS_PV3ODLlwDD-xfN6rSOcLVNBpxKgkRLI%3D/lsparams/hls_chunk_host,initcwndbps,mh,mm,mn,ms,mv,mvi,pl/lsig/AG3C_xAwRQIhAJCO6kSwn7PivqMW7sZaiYFvrultXl6Qmu9wppjCvImzAiA7vkub9JaanJPGjmB4qhLVpHJOb9fZyhMEeh1EUCd-3Q%3D%3D/playlist/index.m3u8 \
-c copy output.ts
ffmpeg -i $(youtube-dl -f 22 -g https://www.youtube.com/watch\?v\=6aXR-SL5L2o) -c copy omg1.ts
- fbehrens./youtube-dl -f 22 -g https://www.youtube.com/watch\?v\=___VIDEO_ID___
的命令后,我复制/粘贴输出结果,在浏览器(Brave)中打开URL,最后选择“下载”选项。 - Mauricio无需向 ffmpeg
传递任何内容,您只需获取所需格式即可。在此示例中,它是 "95" 格式。
因此,一旦您知道它是 95,只需键入:
youtube-dl -f 95 https://www.youtube.com/watch\?v\=6aXR-SL5L2o
也就是说:
youtube-dl -f <format number> <url>
它将开始在工作目录生成一个部分下载文件,名称为<somename>.<probably mp4>.part
,让它继续下载,只需按下 <Ctrl-C>
停止下载。
该文件仍将被命名为<something>.part
,将其重命名为<whatever>.mp4
即可完成...
ffmpeg
代码:
ffmpeg -i $(youtube-dl -f <format number> -g <url>) -copy <file_name>.ts
对我也起作用,但声音和视频不同步,仅使用youtube-dl
似乎可以获得更好的结果,尽管它也使用ffmpeg
。
这种方法的缺点是您不能在下载时观看视频,当然您可以打开另一个FF或Chrome,但似乎mplayer
无法处理视频输出直到youtube-dl
/ffmpeg
正在运行。
youtube-dl
步骤中下载,您可以尝试以下方法:$ URL=https://www.arte.tv/fr/videos/078132-001-A/cosmos-une-odyssee-a-travers-l-univers/
$ youtube-dl -F $URL | grep m3u
HLS_XQ_2 m3u8 1280x720 VA-STA, Allemand 2200k
HLS_XQ_1 m3u8 1280x720 VF-STF, Français 2200k
$ CHOSEN_FORMAT=HLS_XQ_1
$ youtube-dl -F "$(youtube-dl -gf $CHOSEN_FORMAT)"
[generic] master: Requesting header
[generic] master: Downloading webpage
[generic] master: Downloading m3u8 information
[info] Available formats for master:
format code extension resolution note
61 mp4 audio only 61k , mp4a.40.2
419 mp4 384x216 419k , avc1.66.30, mp4a.40.2
923 mp4 640x360 923k , avc1.77.30, mp4a.40.2
1737 mp4 720x406 1737k , avc1.77.30, mp4a.40.2
2521 mp4 1280x720 2521k , avc1.77.30, mp4a.40.2 (best)
$ youtube-dl --hls-prefer-native -f 1737 "$(youtube-dl -gf $CHOSEN_FORMAT $URL)" -o "$(youtube-dl -f $CHOSEN_FORMAT --get-filename $URL)"
[generic] master: Requesting header
[generic] master: Downloading webpage
[generic] master: Downloading m3u8 information
[hlsnative] Downloading m3u8 manifest
[hlsnative] Total fragments: 257
[download] Destination: Cosmos_une_odyssee_a_travers_l_univers__HLS_XQ_1__078132-001-A.mp4
[download] 0.9% of ~731.27MiB at 624.95KiB/s ETA 13:13
....
youtube-dl --hls-prefer-native your_m3u8_file_url.m3u8
效果最好。它将视频直接下载为mp4格式。 - jeppoo1我已经写了一个小脚本来下载直播YouTube视频,你可以使用单个命令来执行。该脚本可以简单地调用:
~/ytdl_lv.sh <URL> <output file name>
e.g.
~/ytdl_lv.sh https://www.youtube.com/watch?v=nX0sg1Gp-1 myfile.mp4
#!/bin/bash
# ytdl_lv.sh
# Author Prashant
#
URL=$1
OUTNAME=$2
streamlink --hls-live-restart -o ${OUTNAME} ${URL} best
这里最好的是流媒体质量,它可以是144p(最差)、240p、360p、480p、720p(最佳)。
streamlink
,而这并不起作用:streamlink: command not found
。我猜最后一行应该调用 youtuble-dl
或 yt-dlp
。 - Maxim Suslov本答案已于2022年12月19日完全重写,此前曾收到6个反对票。
如何下载一个直播视频?请参考这里最受欢迎的答案,但现在在原先使用youtube-dl
的地方,请改用yt-dlp
。
我建议您使用yt-dlp
而不是youtube-dl
。它是youtube-dl
的一个分支,维护得更好,功能也更好。在youtube-dl
出现错误的情况下,yt-dlp
可以正常工作。此外,在youtube-dl
下载速度为42 KiB/sec(包括我使用它的每一次,包括2022年12月19日在Ubuntu 22.04上),yt-dlp
的下载速度为86 MiB/sec,即~2100倍快,这是在几秒钟前在Ubuntu 22.04上测试的。
在2022年12月19日在Ubuntu 22.04上进行了测试。
# Install yt-dlp
sudo apt update
sudo apt install yt-dlp
# Use it to download a video
# generally a smaller size; good quality
yt-dlp -f best https://www.youtube.com/watch?v=VUhQ6zEky0o
# bigger size; best quality
yt-dlp https://www.youtube.com/watch?v=VUhQ6zEky0o
请参见我在这里的答案,我在其中更详细地解释了此命令:如何从youtube-dl选择视频质量?。
youtube-dl
出现了哪些错误?测试于2021年3月28日,在Ubuntu 18.04和/或20.04上进行。
我尝试按照这里最受欢迎的答案的方法,但是我使用youtube-dl
时遇到了ERROR: VUhQ6zEky0o: YouTube said: Invalid parameters.
错误,并且它对我不起作用。
示例直播链接:https://www.youtube.com/watch?v=VUhQ6zEky0o。我的尝试和失败消息:
$ youtube-dl --list-formats https://www.youtube.com/watch?v=VUhQ6zEky0o
[youtube] VUhQ6zEky0o: Downloading webpage
[youtube] VUhQ6zEky0o: Downloading video info webpage
ERROR: VUhQ6zEky0o: YouTube said: Invalid parameters.
再次,这是上面的错误:
错误:VUhQ6zEky0o:YouTube说:参数无效。
我尝试使用youtube-dl
在多个直播链接上进行操作,但没有一个成功。而是收到了上述的错误信息。
请改用yt-dlp
。
作为最后的办法,如果你无法让youtube-dl
或yt-dlp
正常工作,可以尝试使用OBS Studio进行实时屏幕捕捉。以下是详细的操作指南:Super User: 如何使用OBS Studio进行屏幕捕捉(包括保存实时视频或制作教程)?。
这种方法也非常有效,但显然不是以相同的方式“下载”视频流。
youtube-dl
时遇到了“ERROR: VUhQ6zEky0o: YouTube said: Invalid parameters.”错误,并且它对我不起作用。还有其他人收到这个错误消息吗?我的方法显然没有下载流,而是记录屏幕上显示的内容,但这正是重点。这是那些在使用youtube-dl
时遇到问题的人的解决方法。 - Gabriel Staplesyoutube-dl
似乎工作正常,但请注意有时现场直播将音频和视频分别分成不同的流,然后如果您尝试提供-f <preferred stream code>
,您只会得到视频或音频中的一个。youtube-dl https://address-to-the-stream.m3u8
,它将自动下载最佳质量的视频流,并通过ffmpeg
透明地合并最佳音频流(在Windows 10上测试)。
--external-downloader-args "-t 60"
并没有将其限制为1分钟,但按下Ctrl+C可以优雅地完成下载,视频文件也不会损坏。 - Tomasz Gandor