我正在使用 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
将在处理之前下载整个媒体,然后将其删除。