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

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

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

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

有什么办法可以做到这一点吗?

答案1

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

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

youtube-dl -g "https://www.youtube.com/watch?v=V_f2QkBdbRI"

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

ffmpeg -ss 00:00:15.00 -i "OUTPUT-OF-FIRST URL" -t 00:00:10.00 -c copy out.mp4

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

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

答案2

添加到约翰尼的回答:

用于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

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

视频

youtube-dl --youtube-skip-dash-manifest -g https://www.youtube.com/watch?v=gESHIrvIQQo

输出:

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/

我想从 43:00 切到 50:10,所以我要-ss 42:30在两个输入上执行(给我几秒钟的时间来捕获良好的关键帧),然后-ss 30在输入之后执行 a 以从 43:00 开始。

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

# The first URL
video_url="https://r3---sn-mv-cvne.googlevideo.com/videoplayback/id/80448722bbc8410a/itag/298/source/youtube/requiressl/yes/pl/23/ei/5wCfWY6dBeOj8gSSxZaACQ/mv/m/initcwndbps/5055000/ms/au/mm/31/mn/sn-mv-cvne/ratebypass/yes/mime/video%2Fmp4/otfp/1/gir/yes/clen/5231968228/lmt/1502479662079137/dur/18575.164/key/dg_yt0/beids/%5B9466591%5D/mt/1503592562/signature/8CCFBF5CAB97341D0CB1F34E85AB6EE20FC7A03E.7679F39A8603CF41A95F10232E2A921EB0774101/ip/206.34.122.70/ipbits/0/expire/1503614279/sparams/ip,ipbits,expire,id,itag,source,requiressl,pl,ei,mv,initcwndbps,ms,mm,mn,ratebypass,mime,otfp,gir,clen,lmt,dur/"
# The second URL
audio_url="https://r3---sn-mv-cvne.googlevideo.com/videoplayback/id/80448722bbc8410a/itag/140/source/youtube/requiressl/yes/pl/23/ei/5wCfWY6dBeOj8gSSxZaACQ/mv/m/initcwndbps/5055000/ms/au/mm/31/mn/sn-mv-cvne/ratebypass/yes/mime/audio%2Fmp4/otfp/1/gir/yes/clen/295235970/lmt/1502480001536214/dur/18575.243/key/dg_yt0/beids/%5B9466591%5D/mt/1503592562/signature/4AACC8E27F9036D36D4D623A771A9F2BAC4674BA.7E4F4FB4DC023E3FE491A991F0F9F2329648DE9D/ip/206.34.122.70/ipbits/0/expire/1503614279/sparams/ip,ipbits,expire,id,itag,source,requiressl,pl,ei,mv,initcwndbps,ms,mm,mn,ratebypass,mime,otfp,gir,clen,lmt,dur/"
ffmpeg -ss 42:30 -i "$video_url" -ss 42:30 -i "$audio_url" -map 0:v -map 1:a -ss 30 -t 7:10 -c:v libx264 -c:a aac gog-vs-triv.mkv

归功于雅库布·弗拉纳的解决--youtube-skip-dash-manifest方案。


编辑:我经常这样做,我创建了一个脚本,我将在此处包含该脚本。我已经从 改为 ,youtube-dl原因yt-dlp对于本文来说并不是非常重要,但如果您想继续使用它,可以替换yt-dlp为。youtube-dl

clip-youtube.sh

#!/bin/bash
#Arguments: URL, Time stamp -5 seconds, length of clip, video file name

readarray -t urls <<< "$(yt-dlp --youtube-skip-dash-manifest -g "$1")"
ffmpeg -ss $2 -i "${urls[0]}" -ss $2 -i "${urls[1]}" -ss 5 -map 0:v -map 1:a -c:v libx264 -c:a aac -t $3 $4

用法示例:

./clip-youtube.sh "https://www.youtube.com/watch?v=aqz-KE-bpKQ" 3:05 11 squashed.mp4

答案3

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

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

答案4

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

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

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

例子:

  • 15秒开始编码,1分20秒停止
    $ youtube-dl --postprocessor-args "-ss 0:0:15 -to 0:1:20" '[video_URL]'
    
  • 从 15 秒开始编码,只需要接下来的 3 分 5 秒
    $ youtube-dl --postprocessor-args "-ss 0:0:15 -t 0:3:5" '[video_URL]'
    

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

相关内容