【问题标题】:How do you use youtube-dl to download live streams (that are live)?您如何使用 youtube-dl 下载直播流(即直播)?
【发布时间】:2016-08-30 15:54:38
【问题描述】:

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

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

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

之后它吐出了几行似乎不想正确复制的红色文本,所以我拿了一个 sn-p:

有人知道这是否可行吗?

【问题讨论】:

  • Streamlink 目前似乎可以更好地处理实时流 - 只需添加此内容,因为此问题在搜索结果中居高不下。
  • 今天升级 youtube-dl 后,我注意到无限的直播流(如街头网络摄像头)现在被传递给 ffmpeg(作为播放列表)并且下载似乎工作正常。不幸的是,通过--external-downloader-args "-t 60"并没有将其限制为1分钟,而是按Ctrl+C优雅地完成了下载,并且视频文件没有损坏。

标签: youtube youtube-dl youtube-livestreaming-api


【解决方案1】:

我将使用来自 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 网址。我将在此示例中使用 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

【讨论】:

  • 如果你选择了你喜欢的格式,你可以使用 '$()'(bash 命令替换)代替复制和粘贴:ffmpeg -i $(youtube-dl -f 22 -g https://www.youtube.com/watch\?v\=6aXR-SL5L2o) -c copy omg1.ts
  • 什么是 youtube_live_test?谢谢
  • @mangovn 那只是我所在的目录。为了清楚起见,编辑了答案。
  • 遗憾的是不适用于 3QV 流,例如:konzertzuhaus.at/streaming-konzert/…
【解决方案2】:

无需向ffmpeg 传递任何内容,您只需获取所需的格式即可,在本例中为"95" 格式。

所以一旦你知道它是 95,你只需输入:

youtube-dl -f 95  https://www.youtube.com/watch\?v\=6aXR-SL5L2o

也就是说:

youtube-dl -f <format number> <url>

它将开始在工作目录上生成一个&lt;somename&gt;.&lt;probably mp4&gt;.part,这是部分下载的文件,放开它,只需按&lt;Ctrl-C&gt; 即可停止捕获。

该文件仍将被命名为 &lt;something&gt;.part,将其重命名为 &lt;whatever&gt;.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 我相信这取决于 MP4 文件中某些元数据由于中断而丢失的事实。您是否尝试过使用 VLC 打开它?如果你真的想使用 Windows Media Player,你可以使用一些工具(例如 ffmpeg)修复文件,它应该也可以与 WMP 一起使用。
  • 这样你就不能下载vp9直播了。唉。
【解决方案3】:

某些带有 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-dl --hls-prefer-native your_m3u8_file_url.m3u8 似乎最适合我。它将视频直接下载为 mp4 格式。
【解决方案4】:

我编写了一个小脚本来下载实时 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=$1 
OUTNAME=$2
streamlink --hls-live-restart -o ${OUTNAME} ${URL} best

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

【讨论】:

    【解决方案5】:

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

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

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

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

    youtube-dl 对我来说失败了

    我尝试了#1 answer,但它失败了。示例直播链接: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 直播时尝试了多个直播链接。这对他们中的任何一个都不起作用。我收到了上面的错误消息。

    OBS 工作室效果很好

    (这里是 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. 接下来,我在 2020 年 7 月 25 日按照 Kezz Bracey 的这些说明进行操作:https://photography.tutsplus.com/tutorials/obs-for-screen-recording-quick-start--cms-28549。让我总结一下,加上我自己的一些步骤,如下:
    3. 打开它。第一次打开它时,它会询问您是要优化流媒体还是只优化录制。大多数人会希望选择仅录制的选项。如果您也向观众进行直播,请改为选择该选项。
    4. 现在,在 OBS 主窗口底部的“来源”下,您会看到它是空的。单击 + 图标添加新的视频源。选择“Screen Capture (XSHM)”,如下所示(这些图片来自 Kezz Bracey 上面的说明):

      点击“确定”:

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

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

    【讨论】:

    • 在这里,您下载的不是流,而是屏幕上显示的内容。
    • @JoelGMathew,同意。我的回答没有直接回答确切的问题。相反,它回答了提问者不知道要问的问题,以及当接受的答案不起作用时可能会问的问题。它可以帮助所有那些对这个问题的公认答案不起作用的人——包括我自己,它提供了一种通用的替代方法来做与提问者所问的事情相似的事情,从而以不同的方式解决相同的问题。
    • @GabrielStaples 虽然很可能欢迎为问题提供替代解决方案,但至少可以说,您正在回答“提问者不知道要问的问题”是非常值得怀疑的。您完全忽略了问题本身,它专门询问如何使用 youtube-dl 下载它。您的解决方案会导致有损录制,并且必须在整个录制时间内在监视器中显示视频,更不用说安装其他软件了。对某些人来说可能是一个解决方案,但不能回答问题,而且根本不是一个好的解决方案。
    • 我在这里得到了很多反对意见,但我把这个答案放在这里是因为我收到了 youtube-dlERROR: VUhQ6zEky0o: YouTube said: Invalid parameters. 错误,它对我不起作用。还有其他人收到此错误消息吗?我的方法显然不是下载流,而是记录屏幕上显示的内容,但这就是重点。这是对youtube-dl 有问题的人的解决方法。
    猜你喜欢
    • 1970-01-01
    • 2018-11-14
    • 2016-08-28
    • 1970-01-01
    • 2018-07-03
    • 2019-02-11
    • 2014-02-02
    • 2019-05-10
    • 2018-07-16
    相关资源
    最近更新 更多