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


61

我正在使用Ubuntu,并且youtube-dl命令绝对正常。

我只想下载太长的视频部分。所以我只想下载视频的几分钟。示例从13分钟到17分钟。

有什么办法吗

Answers:


43

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

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

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

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

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

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

ffmpeg是一种流行的工具,应该在任何流行的OS系统信息库/程序包管理器中。


8
因此,从本质上讲,您仍然必须下载整个视频并自行裁剪
Antony

12
如果要指定结束视频片段的时间,则可以使用-to选项而不是-t。 ffmpeg -i "OUTPUT-OF-FIRST URL" -ss 00:13:00.00 -to 00:17:00.00 -c copy out.mp4
ˆᵛˆ

5
@Antony ffmpeg实际上只会下载您指定的部分。
akaihola

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

5
您能否解释一下它的作用,原理?
user259412

3
它只是@godofgrunts答案的更简洁的版本,使用sed可以节省一些时间,以手动获取URL并在开始时间进行复制/粘贴(-ss 00:05)。@godofgrunts有一些额外的标志-map 0:v -map 1:a -c:v libx264 -c:a aac,可能会提高质量。我还想补充一点youtube-dl -f bestvideo+bestaudio,以确保获得最高质量的版本。
史蒂夫·戈兰森


16

添加到约翰尼的答案:

使用youtube-dl -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 -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在43:00之后开始输入。

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

ffmpeg -ss 42:30 -i "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/" -ss 42:30 -i "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/" -map 0:v -map 1:a -ss 30 -t 7:10 -c:v libx264 -c:a aac gog-vs-triv.mkv

谢谢。对于@Johnnie帖子,我不确定如何获取声音。您的帖子回答了。
Manny_Mar

哇,我不知道ffmpeg的-i标志可以使用URL。整洁
Geremia


9

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先下载文件后自己进行后处理相同。


4
但这仍然需要下载整个视频,然后剪切所需的部分
Kasparov92 '18

unable to obtain file audio codec with ffprobe出错了。你能帮我吗 我正在使用CentOS 7
Hassaan,

3
请注意,该-x标志仅下载音频。如果您同时需要音频和视频,请从命令中忽略它。:)
grooveplex

2

您可以从头开始下载,而无需下载整个内容并进行编辑。这是这个问题要求的一半:

使用中断下载 ^C

  • 我只是尝试过 mp4
  • 无法使用单独的视频和音频,因此您需要同时使用两者的格式。默认情况下,ytdl通常会获取单独的视频和音频,然后将它们合并。使用-F看格式提供,并选择mp4有两种。例如-f18-f22通常在那里。
  • 您必须根据下载的百分比(不是线性的;压缩率随时间变化)进行估算。

是。这是一个骇客

进一步的问题:如果您确实想要单独的视频和音频格式,是否可以分别下载每种格式的一部分(使用^c此处),然后手动合并它们?我认为它不适用于某些格式。


1

这不能完全回答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...

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

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

$ curl "1st-URL" -sI | grep Content-Length
Content-Length: 64380504

现在,我们将总内容长度除以视频中的总秒数(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

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

$ ffmpeg -i ten_secs.mp4 -c copy corrected_ten_secs.mp4

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

也可以通过这种方式从视频中下载任何中间部分,但是这样做可能会更加棘手,因为YouTube将元数据放置在流的开头(前几个字节),而没有将元数据显示在下载的媒体中,流根本不会播放。

编辑: YouTube说,这仅在具有简历支持的网站上有效。它不适用于其他网站。


0

使用--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]'

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

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.