如何使用youtube-dl下载(正在直播的)直播流?

102

使用youtube-dl下载.m3u8流文件或其他直播流格式的视频是否可能?

当我将视频URL复制到YouTube-dl中时,它会输出:

[https @ 0x7fc351416080] inflate return value: -3, incorrect header check
Last message repeated 15 times

之后它会输出几行红色文本,似乎无法正确复制,因此我粘贴了一小段:

图片

有人知道这是否可行吗?


4
目前来看,Streamlink 更好地处理直播流。我之所以提及这一点,是因为这个问题在搜索结果中排名较高。 - mijiturka
5
今天更新了youtube-dl以后,我发现无限直播流(如街道网络摄像头)现在被作为播放列表传递给了ffmpeg,下载似乎正常工作。不幸的是,传递--external-downloader-args "-t 60"并没有将其限制为1分钟,但按下Ctrl+C可以优雅地完成下载,视频文件也不会损坏。 - Tomasz Gandor
6个回答

132

我将以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

25
如果你已经选择了你喜欢的格式,可以使用“$()”(bash命令替换)而不是复制和粘贴:ffmpeg -i $(youtube-dl -f 22 -g https://www.youtube.com/watch\?v\=6aXR-SL5L2o) -c copy omg1.ts - fbehrens
4
也许您希望在这里使用NASA电视台的直播作为示例,因为它已经连续19个月实时播出,所以该链接将在相当长的一段时间内保持不变。 - Fabian Röling
我收到了“ERROR: VUhQ6zEky0o: YouTube said: Invalid parameters.”的错误提示。我的命令是“youtube-dl --list-formats https://www.youtube.com/watch?v=VUhQ6zEky0o”。 - Gabriel Staples
有没有一种方法可以从开始录制现场直播?在YouTube网页上,可以将视频排队从开头播放,但是youtube-dl似乎从当前时刻开始录制。 - gone
1
执行类似 ./youtube-dl -f 22 -g https://www.youtube.com/watch\?v\=___VIDEO_ID___ 的命令后,我复制/粘贴输出结果,在浏览器(Brave)中打开URL,最后选择“下载”选项。 - Mauricio
显示剩余6条评论

40

无需向 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正在运行。


在直播过程中,复制了正在下载的.part文件并将其格式更改为.mp4。然而,Windows Media Player显示文件格式无法识别。有什么解决方法吗?或者最好在直播结束后运行命令? - qwertynik
@qwertynik 我认为这取决于由于中断而导致MP4文件中缺少某些元数据。你尝试过使用VLC打开它吗?如果你真的想使用Windows Media Player,你可以使用一些工具(例如ffmpeg)修复该文件,然后它也应该能在WMP上正常工作。 - Kubuntuer82
这样你就无法下载VP9实时流了。唉。 - Валерий Заподовников

8
一些使用m3u流媒体的网站无法在单个 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
....

4
对我而言,命令youtube-dl --hls-prefer-native your_m3u8_file_url.m3u8效果最好。它将视频直接下载为mp4格式。 - jeppoo1

3

我已经写了一个小脚本来下载直播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-dlyt-dlp - Maxim Suslov
当然,它是streamlink的包装器。 您需要使用“apt install streamlink”安装streamlink。 - Prashant Adlinge

2

本答案已于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

最后的办法:使用OBS Studio进行实时屏幕捕捉

作为最后的办法,如果你无法让youtube-dlyt-dlp正常工作,可以尝试使用OBS Studio进行实时屏幕捕捉。以下是详细的操作指南:Super User: 如何使用OBS Studio进行屏幕捕捉(包括保存实时视频或制作教程)?

这种方法也非常有效,但显然不是以相同的方式“下载”视频流。


13
在这里,你下载的不是流媒体本身,而是显示在你屏幕上的内容。 - Joel G Mathew
1
@JoelGMathew,同意。我的回答并没有直接回答确切的问题。相反,它回答了提问者不知道该问的问题,以及当被接受的答案不起作用时可能会问的问题。它可以帮助所有那些被这个问题的被接受答案所困扰的人——包括我自己,并且提供了一种通用的替代方法来做类似于提问者所要求的事情,从而以不同的方式解决了同样的问题。 - Gabriel Staples
3
尽管提供问题的另一种解决方案可能是受欢迎的,但说你正在回答“提问者不知道要问什么问题”的说法至少是值得质疑的。你完全忽略了问题本身,它明确地询问如何使用youtube-dl进行下载。你的解决方案会导致有损录制,并且必须在整个录制时间内将视频显示在监视器上,更不用说安装另一个软件了。虽然对某些人可能是一种解决方案,但并没有回答问题,也不是一个特别好的解决方案。 - Wheepy
我在这里得到了很多负评,但我放置这个答案是因为我使用youtube-dl时遇到了“ERROR: VUhQ6zEky0o: YouTube said: Invalid parameters.”错误,并且它对我不起作用。还有其他人收到这个错误消息吗?我的方法显然没有下载流,而是记录屏幕上显示的内容,但这正是重点。这是那些在使用youtube-dl时遇到问题的人的解决方法。 - Gabriel Staples
1
这就像是说“既然你的本田雅阁今天发动不了,我提供一个解决方案,教你如何用3D打印零件自己造一辆车。”谢谢? - user2040158
显示剩余2条评论

2
截至2023年,youtube-dl似乎工作正常,但请注意有时现场直播将音频和视频分别分成不同的流,然后如果您尝试提供-f <preferred stream code>,您只会得到视频或音频中的一个。
解决方案是简单地不传递任何参数,只需youtube-dl https://address-to-the-stream.m3u8,它将自动下载最佳质量的视频流,并通过ffmpeg透明地合并最佳音频流(在Windows 10上测试)。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接