如何使用 youtube-dl 命令下载部分视频?

use*_*614 156 linux youtube-dl

我正在使用 Ubuntu,并且该youtube-dl命令运行良好。

但是,现在我只想下载太长的视频的一部分。所以我只想下载该视频的几分钟,例如从第 13 分钟到第 17 分钟。

有没有办法做到这一点?

Joh*_*nie 127

我不相信youtube-dl一个人会做你想做的事。但是,您可以将其与命令行实用程序(如 ffmpeg)结合使用。

首先使用 youtube-dl 获取实际 URL:

youtube-dl -g "https://www.youtube.com/watch?v=V_f2QkBdbRI"
Run Code Online (Sandbox Code Playgroud)

复制命令的输出并将其粘贴为-i下一个命令的参数的一部分:

ffmpeg -ss 00:00:15.00 -i "OUTPUT-OF-FIRST URL" -t 00:00:10.00 -c copy out.mp4
Run Code Online (Sandbox Code Playgroud)

-ss此位置的参数表示丢弃视频中 15 秒内的所有输入。该-t选项声明捕获 10 秒。命令的其余部分告诉它存储为 mp4。

ffmpeg 是一个流行的工具,应该在任何流行的操作系统存储库/包管理器中。

  • 如果要指定结束视频切片的时间,可以使用 -to 选项而不是 -t。`ffmpeg -i "OUTPUT-OF-FIRST URL" -ss 00:13:00.00 -to 00:17:00.00 -c copy out.mp4` (29认同)
  • 所以基本上,你仍然需要下载整个视频并自己裁剪 (23认同)
  • @Antony `ffmpeg` 实际上只会下载您指定的部分。 (18认同)
  • @Antony 只要您将 -ss 参数放在 -i 参数之前,它就会从您用 -ss 指定的时间开始下载。但是,如果将 -ss 放在 -i 参数之后,则 ffmpeg 将从视频的最开始下载并从 -ss 指定的位置开始编码。有关更多信息,请参阅我对约翰尼回答的编辑。 (4认同)
  • 使用 `youtube-dl` 提供的链接和 `-g` 选项将始终为我返回 403 forbidden。单独使用 youtube-dl 来下载视频,总是很有魅力。 (3认同)
  • 未捕获音频 (2认同)

god*_*nts 66

添加约翰尼的回答:

使用youtube-dl --youtube-skip-dash-manifest -g "URL"获得的视频和音频流。

现在使用:

ffmpeg -ss 12:15 -i "1st-URL" -ss 12:15 -i "2nd-URL" -t 5:15 -map 0:v -map 1:a -c:v libx264 -c:a aac output.mkv
Run Code Online (Sandbox Code Playgroud)

您需要-ss为每个流使用该选项。我还建议您提前大约 30 秒执行此操作,然后再使用另一个-ss 30以避免丢失任何关键帧。这是使用我的 YouTube 视频之一的真实示例。

视频

youtube-dl --youtube-skip-dash-manifest -g https://www.youtube.com/watch?v=gESHIrvIQQo
Run Code Online (Sandbox Code Playgroud)

输出:

https://r3---sn-mv-cvne.googlevideo.com/videoplayback/id/80448722bbc8410a/itag/298/source/youtube/requiressl/yes/mn/sn-mv-cvne/ei/BgifWfmmL4iE8wSlv47oCA/mm/31/pl/23/mv/m/ms/au/initcwndbps/11447500/ratebypass/yes/mime/video%2Fmp4/otfp/1/gir/yes/clen/5231968228/lmt/1502479662079137/dur/18575.164/key/dg_yt0/signature/4FFB9B0B7E1703B31F5D07DAD579B55F17EF7BAA.0CB63905C89DD4D33F90CF3AAD728F1ECDFCB9B3/mt/1503594423/ip/206.34.122.70/ipbits/0/expire/1503616102/sparams/ip,ipbits,expire,id,itag,source,requiressl,mn,ei,mm,pl,mv,ms,initcwndbps,ratebypass,mime,otfp,gir,clen,lmt,dur/
https://r3---sn-mv-cvne.googlevideo.com/videoplayback/id/80448722bbc8410a/itag/140/source/youtube/requiressl/yes/mn/sn-mv-cvne/ei/BgifWfmmL4iE8wSlv47oCA/mm/31/pl/23/mv/m/ms/au/initcwndbps/11447500/ratebypass/yes/mime/audio%2Fmp4/otfp/1/gir/yes/clen/295235970/lmt/1502480001536214/dur/18575.243/key/dg_yt0/signature/4CD42047D1D5C714377350905C1CC5CBA37C0009.6EED1FC92D17A096235C32E48F4B15DEF7DD99B0/mt/1503594423/ip/206.34.122.70/ipbits/0/expire/1503616102/sparams/ip,ipbits,expire,id,itag,source,requiressl,mn,ei,mm,pl,mv,ms,initcwndbps,ratebypass,mime,otfp,gir,clen,lmt,dur/
Run Code Online (Sandbox Code Playgroud)

我想从 43:00 剪辑到 50:10,所以我要-ss 42:30在两个输入上做(给我几秒钟的时间来捕捉一个好的关键帧),然后在输入后做一个-ss 30从 43:00 开始。

然后我将map用于映射视频0:v和音频1:a(0 表示第一个输入,即视频,1 表示第二个输入,即音频),然后选择我的编码选项。

ffmpeg -ss 12:15 -i "1st-URL" -ss 12:15 -i "2nd-URL" -t 5:15 -map 0:v -map 1:a -c:v libx264 -c:a aac output.mkv
Run Code Online (Sandbox Code Playgroud)

信贷的Jakub沃拉纳--youtube-skip-dash-manifest解决方案。

  • @daGo - 我相信 `youtube-dl --postprocessor-args` 会下载整个视频,然后将其编辑到选定的范围,而这个答案使用 `youtube-dl` 只是为了获取一些特殊的 URL。`ffmpeg` 然后使用这些 URL 只下载所需的范围。因此,如果您想从 2 小时的讲座视频中提取 2 分钟,此答案将为您节省大量下载时间。 (4认同)
  • 谢谢。对于@Johnnie 帖子,我不确定如何获得声音。你的帖子回答了它。 (2认同)
  • 这适用于大多数 YT 视频,但我正在尝试使用之前直播(现在已完成)的 9 小时视频进行此操作,并且我收到“处理输入时发现无效数据”。主要区别在于`youtube-dl -g`的输出不同。对于大多数视频,它都有结构。`"https://r3---sn-mv-cvne.googlevideo.com/videoplayback/id/8..."` 但对于这个视频它有结构。`"https://manifest.googlevideo.com/api/manifest/dash/expire/15956..."`(因空格而被截断)。关于如何使这项工作的想法? (2认同)

Ste*_*son 41

ffmpeg $(youtube-dl -g 'https://www.youtube.com/watch?v=oHg5SJYRHA0' | sed 's/^/-ss 00:05 -i /') -t 01:00 -c copy out.mkv
Run Code Online (Sandbox Code Playgroud)

编辑 URL 和-ss,-t使用此命令的次数。它使用视频和音频 URL 创建参数,类似于@godofgrunts 的这个答案。不使用引号,$()因为这会为生成两个单独的参数ffmpeg

  • 你能解释一下,它是做什么的,它是如何工作的? (8认同)
  • 这只是@godofgrunts 答案的更简洁版本,使用 sed 来节省一些时间手动抓取 URL 并在开始时间复制/粘贴(-ss 00:05)。@godofgrunts 有一些额外的标志`-map 0:v -map 1:a -c:v libx264 -c:a aac` 可能会提高质量。我还想添加 `youtube-dl -f bestvideo+bestaudio` 以确保我获得最高质量的版本。 (5认同)

小智 37

youtube-dl 支持将参数传递给底层后处理器(使用 2017.08.27.1 版本测试):

youtube-dl -x --postprocessor-args "-ss 00:13:00.00 -t 00:04:00.00" https://youtu.be/...

这和ffmpeg先下载文件后自己做后处理基本一样。

  • 但这仍然需要下载整个视频,然后剪切所需的部分 (9认同)
  • 请注意,`-x` 标志仅下载音频。如果您需要音频和视频,请从命令中省略它。:) (8认同)
  • 这不会可靠地工作,因为在某些情况下“-postprocessor-args”会被多次应用。请参阅 https://github.com/ytdl-org/youtube-dl/issues/26863 (2认同)

小智 27

本地方式 (YT-DLP)

yt-dlp是 的精神继承者youtube-dl,支持安装 ffmpeg。

只会下载您指定的视频部分,适合低带宽或长视频!


最快的

它接受时间戳或秒:

yt-dlp.exe --download-sections "*6:02-6:22"

它只会下载指定的部分(到最近的关键帧)。


精确关键帧

如果您需要精确的开始/停止时间(尽管较慢):

yt-dlp.exe --download-sections "*1:22:22-inf" --force-keyframes-at-cuts

inf表示到视频结束。


部分

下载标题为的部分"03. Symphony No. 6, Op. 68 (Pastoral): III. Allegro"

yt-dlp.exe --download-sections "03.*"


多个部分

下载多个部分:

yt-dlp.exe --download-sections "03.*" --download-sections "05.*" -o "%(title)s-%(section_title)s.%(ext)s"


关于速度的注意事项

此方法下载和转码速度非常慢。

下载整个视频并使用 ffmpeg 进行分割可能会更快。

我肯定会在很长的视频很短的片段中使用这种方法。


ks1*_*322 23

此功能请求尚未在 youtube-dl 中实现。请参阅#622 问题及其在 github 上的许多重复项。


小智 18

使用该--postprocessor-args参数传递ffmpeg要编辑的音频/视频输出(处理器)。需要ffmpeg安装后处理器。

--postprocessor-args需要 3 个参数和值(例如,还有更多,请查看 的手册页ffmpeg):

  • -ss HH:MM:SS : 开始时间
  • -to HH:MM:SS : 时间结束
  • -t HH:MM:SS : 需要的时间长度

例子:

PS: youtube-dl将在处理之前下载整个媒体,然后将其删除。

  • 这不会可靠地工作,因为在某些情况下“-postprocessor-args”会被多次应用。请参阅 https://github.com/ytdl-org/youtube-dl/issues/26863 (2认同)

rit*_*iek 8

这并不能完全回答 OP 的问题,但是有一种方法可以从头下载流到特定持续时间,而无需下载完整的流。由于 YouTube 提供简历支持,我们可以使用Range标头请求部分内容。

我们首先获取流 URL:

$ youtube-dl -g https://www.youtube.com/watch?v=yysk8s2vih8
https://r1---sn-npoeenee.googlevideo.com/videoplayback?source=youtu...
https://r1---sn-npoeenee.googlevideo.com/videoplayback?source=youtu...
Run Code Online (Sandbox Code Playgroud)

这应该输出两个 URL(每个 URL 用于视频和音频流)。

现在向第一个 URL(链接到视频流)发送 head 请求以获取该流的总内容长度:

$ curl "1st-URL" -sI | grep Content-Length
Content-Length: 64380504
Run Code Online (Sandbox Code Playgroud)

现在,我们将这个总内容长度除以视频中的总秒数(YouTube 视频的持续时间为 4 分 7 秒,即 247 秒。)以获得大约 1 秒的内容长度:

64380504 / 247 ? 260650

我们将此值乘以(我们想要从头开始获取的秒数 + 1)

(我们添加一个也粗略地考虑了放置在流开头的元数据所占用的额外空间)

例如,要获取大约前 10 秒的数据,您需要获取第一个260650 * 11 = 2867150字节,因此我们使用Range标头发出请求:

$ curl "1st-URL" -H "Range: bytes=0-2867150" -o ten_secs.mp4
Run Code Online (Sandbox Code Playgroud)

这应该只下载前 10 秒。下载的文件应该可以播放,但最好让 FFmpeg 修复不正确的元数据:

$ ffmpeg -i ten_secs.mp4 -c copy corrected_ten_secs.mp4
Run Code Online (Sandbox Code Playgroud)

我们还可以以类似的方式仅下载音频的初始部分(第二个 URL)(内容长度会有所不同,但总秒数将保持不变)。

从视频中下载任何中间部分也应该可以通过这种方式进行,但可能会更加棘手,因为 YouTube 将元数据放在流的开头(在前几个字节中)并且它没有出现在下载的媒体中,流根本不会播放。

编辑:这仅适用于支持简历的网站,例如 YouTube。它不适用于其他网站。


小智 7

对于所有不想使用多个命令的懒人,请执行以下操作:

youtube-dl https://www.youtube.com/watch?v=MJD39Aja1Is --external-downloader ffmpeg --external-downloader-args "-ss 00:00:10.00 -t 00:01:00.00"
Run Code Online (Sandbox Code Playgroud)

您现在可以组合选项,youtube-dl.exe例如ffmpeg选择格式、删除视频和剪切音频文件等(也许剪切视频文件然后转换为音频文件,无论先发生什么)

youtube-dl -f 251 https://www.youtube.com/watch?v=MJD39Aja1Is -x --external-downloader ffmpeg --external-downloader-args "-ss 00:00:10.00 -t 00:01:00.00"
Run Code Online (Sandbox Code Playgroud)

注意:在 Twitch 等 HLS 视频上,您还需要添加--hls-prefer-ffmpeg才能使其正常工作。