86

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

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

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

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

图片

有谁知道这是否可能?

4

5 回答 5

114

我将使用来自 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

请注意,链接可能不同,它包含过期时间戳,在本例中为 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
于 2016-05-06T14:24:18.513 回答
33

无需向ffmpeg您传递任何内容,只需获取所需的格式即可,在此示例中,它是“95”格式。

因此,一旦您知道它是95,您只需输入:

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

也就是说:

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

它将开始在工作目录 a 上生成,<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正在运行。

于 2017-04-22T17:05:30.573 回答
7

某些带有 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
....
于 2019-08-29T20:39:16.097 回答
5

我编写了一个小脚本来下载实时 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(最好)

于 2020-05-14T17:54:40.040 回答
1

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

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

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

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

youtube-dl对我来说失败了

我尝试了#1 答案,但它失败了。示例直播链接: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 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. 接下来,我在 2020 年 7 月 25 日按照 Kezz Bracey 的以下说明进行操作:https ://photography.tutsplus.com/tutorials/obs-for-screen-recording-quick-start--cms-28549 。让我总结一下,加上我自己的一些步骤,如下:
  3. 打开它。第一次打开它时,它会询问您是要优化流式传输还是仅录制。大多数人会想要选择仅录制的选项。如果您也向观众进行直播,请改为选择该选项。
  4. 现在,在 OBS 主窗口的底部,在“Sources”下,您会看到它是空的。单击+图标以添加新的视频源。选择“Screen Capture (XSHM)”,如下图所示(这些图片来自上面 Kezz Bracey 的说明): 点击“OK”: 再次点击“OK”:
    在此处输入图像描述

    在此处输入图像描述

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