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

问题描述 投票:0回答:6

是否可以使用 youtube-dl 从

.m3u8
流文件或其他直播格式下载视频?

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

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

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

Picture

有谁知道这是否可行?

youtube youtube-dl youtube-livestreaming-api
6个回答
136
投票

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

42
投票

无需将任何内容传递给

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
运行。


9
投票

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

3
投票

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


3
投票

快速总结

使用

yt-dlp
代替
youtube-dl

详情

如何下载直播视频?遵循 这里获得最多支持的答案,但现在无论他们使用

yt-dlp
,都使用
youtube-dl

我建议您使用

yt-dlp
而不是
youtube-dl
。它是
youtube-dl
的一个分支,维护得更好,工作也更好。在
youtube-dl
给我带来错误的情况下,
yt-dlp
工作得很好。此外,如果
youtube-dl
42 KiB/秒 的速度下载(几乎包括我每次使用它的时间 - 包括 2022 年 12 月 19 日在 Ubuntu 22.04 上的下载速度),
yt-dlp
86 MiB/秒 的速度下载,正如 22.04 秒前在 Ubuntu 上测试的那样,速度快了 ~2100 倍

于 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 上测试。

我尝试按照此处最受欢迎的答案,但我收到了

ERROR: VUhQ6zEky0o: YouTube said: Invalid parameters.
错误,
youtube-dl
,它对我不起作用。

直播链接示例: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-dl
yt-dlp
工作,只需通过 OBS studio 进行实时屏幕捕获即可。以下是我关于如何执行此操作的详细说明:超级用户:如何使用 OBS studio 进行屏幕捕获(包括保存实时视频或制作操作教程)?.

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


2
投票

截至 2023 年,

youtube-dl
似乎工作正常,但请注意,有时直播流将音频和视频分成不同的流,那么如果您尝试提供
-f <preferred stream code>
,您将只能获得视频或音频。

解决方案就是不传递任何参数,只需

youtube-dl https://address-to-the-stream.m3u8
,它将自动下载最佳质量的视频流,并通过
ffmpeg
将其与最佳音频流透明地合并(在 Windows 10 上测试)。

© www.soinside.com 2019 - 2024. All rights reserved.