你如何使用 youtube-dl 下载直播流(直播)?

How do you use youtube-dl to download live streams (that are live)?

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

当我将视频 URL 复制到 YouTube-dl 时,它显示:

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

之后它吐出几行红色文本,似乎不想正确复制,所以我截取了一个片段:

有人知道这是否可行吗?

我将使用来自 NASA TV 的直播活动作为示例:

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

请注意 link 可能不同,它包含到期时间戳,在本例中为 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 传递任何内容,您只需获取所需的格式即可,在本例中,它是 "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 是 运行.

有些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
....

我已经写了一个小脚本来下载直播的 youtube 视频,你也可以使用单个命令。 脚本可以简单地调用它,

~/ytdl_lv.sh <URL> <output file name>

例如

~/ytdl_lv.sh https://www.youtube.com/watch?v=nX0sg1Gp-1 myfile.mp4

脚本如下,

#!/bin/bash 

# ytdl_lv.sh
# Author Prashant
# 

URL= 
OUTNAME=
streamlink --hls-live-restart -o ${OUTNAME} ${URL} best

这里最好的是流质量,也可以是 144p(最差)、240p、360p、480p、720p(最好)

我把这个答案放在这里是因为我在使用 youtube-dl 时遇到了 ERROR: VUhQ6zEky0o: YouTube said: Invalid parameters. 错误,它对我不起作用。还有其他人收到此错误消息吗?我的方法显然不是下载流,而是记录屏幕上显示的内容,但这就是重点。对于那些遇到 youtube-dl.

问题的人来说,这是一种解决方法

如何下载 YouTube(或任何其他流媒体服务)直播(通过屏幕截图)

这个问题是 Google search for "linux download youtube live stream" 中排名第一的问题,所以我会在这里回答,即使 youtube-dl 对我来说失败了。

我真的不在乎我使用什么工具。我只是想让它工作。

youtube-dl 对我来说失败了

我尝试了 , but it fails. Sample live stream link: 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.

同样,这是上面的错误:

ERROR: VUhQ6zEky0o: YouTube said: Invalid parameters.

我在 youtube-dl 直播时尝试了多个直播链接。它对他们中的任何一个都不起作用。我收到了上面的错误消息。

OBS Studio 效果很好

(这里是 OBS Studio 的一般安装和设置说明,包括配置视频和音频源以及进行屏幕录制和音频捕获)

所以,我使用了 OBS Studio,效果非常好!方法如下:

  1. 安装它。它是跨平台的(Windows、Mac 和 Linux),并且 质量非常高 并且 得到很好的支持,附优秀安装说明。到这里获取安装链接:https://obsproject.com/
    1. 它也是免费和开源的,免费(不是一回事),两者都很棒。
    2. 源代码:https://github.com/obsproject/obs-studio
    3. 许可证为 GPL v2.0:https://github.com/obsproject/obs-studio/blob/master/COPYING
    4. 我在 Linux Ubuntu 18.04 和 20.04,所以我在这里使用了 Ubuntu 说明:https://obsproject.com/wiki/install-instructions#linux。在撰写本文时,他们是:
      sudo apt install ffmpeg
      sudo apt install v4l2loopback-dkms
      sudo add-apt-repository ppa:obsproject/obs-studio
      sudo apt update
      sudo apt install obs-studio
      
  2. 接下来,我按照 Kezz Bracey 于 2020 年 7 月 25 日发布的这些说明进行操作:https://photography.tutsplus.com/tutorials/obs-for-screen-recording-quick-start--cms-28549。我总结一下,加上自己的一些步骤,如下:
  3. 打开它。第一次打开它时,它会询问您是要优化 streaming 还是只优化 recording。大多数人会希望选择仅用于 录音 的选项。如果您也向观众直播,请选择该选项。
  4. 现在,在 OBS 主 window 底部的“来源”下,您会看到它是空的。单击 + 图标添加新的视频源。选择“屏幕捕获 (XSHM)”,如下所示(这些图像是从 Kezz Bracey 上面的说明中借用的):

    点击“确定”:

    再次点击“确定”:
  5. 点击右下角的“设置”:

    单击左侧窗格中的“输出”--> 设置或记下你的“记录路径”(我喜欢将我的设置为 home/USERNAME/Videos/OBS)--> 可选地选中“生成文件名而不 space”(我这样做)--> 点击“确定”。
  6. 返回主屏幕,在底部的“音频混合器”部分下,您应该看到“桌面音频”,它是从您的计算机内部播放的任何音频,以及“Mic/Aux”,它是您计算机的麦克风或 Aux 插孔拾取的任何环境音频。通常,为了制作视频教程之类的东西,您需要将这两个音频源都打开,这样您就可以通过视频说话并解释您在做什么,并且它会清晰地记录来自计算机也通过“桌面音频”来源。
    1. 如果您在说话时通过耳机聆听从计算机传出的宁静禅宗音乐,那么您可能希望关闭“桌面音频”,这样只有您能听到它,而不是录音,或者,如果您正在录制 YouTube 或其他直播,您需要关闭“Mic/Aux”,这样您就不会在录制中添加环境噪音——您只会得到视频音频。
    2. 因此,单击扬声器图标以关闭 Mic/Aux 音频输入,如下所示。它现在将显示一个带 X 的红色图标,表示它已关闭:
  7. 单击此底部窗格右侧的“开始录制”按钮。现在,打开您的 YouTube 直播,全屏显示,瞧!您正在现场录制,通过视频的屏幕捕获和音频的“桌面音频”捕获。
  8. 完成后,单击“停止录制”按钮(以前是“开始录制”按钮),或单击计算机右上角的 OBS 工作室图标(至少 Ubuntu) , 然后选择“停止录制”:
  9. 导航到您在上面设置的“录制路径”,瞧!有你的录像!