วิธีการดาวน์โหลดบางส่วนของวิดีโอด้วยคำสั่ง youtube-dl


61

ฉันใช้ Ubuntu และคำสั่ง youtube-dl ทำงานได้ดีอย่างแน่นอน

ฉันต้องการดาวน์โหลดเฉพาะบางส่วนของวิดีโอที่ยาวเกินไป ดังนั้นฉันต้องการดาวน์โหลดวิดีโอเพียงไม่กี่นาที ตัวอย่างจาก 13 นาทีถึง 17 นาที

มีวิธีใดบ้างที่จะทำเช่นนั้น

คำตอบ:


44

ฉันไม่เชื่อyoutube-dlคนเดียวจะทำในสิ่งที่คุณต้องการ อย่างไรก็ตามคุณสามารถรวมเข้ากับยูทิลิตี้บรรทัดคำสั่งเช่น ffmpeg

ก่อนได้รับ URL จริงโดยใช้ 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
โดยพื้นฐานแล้วคุณยังต้องดาวน์โหลดวิดีโอทั้งหมดและครอบตัดเอง
แอนโทนี

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เพื่อให้แน่ใจว่าฉันได้รับรุ่นที่มีคุณภาพสูงสุด
Steve Goranson

ffmpeg.zeranoe.com/buildsสำหรับ Windows
Wolfpack'08

16

กำลังเพิ่มคำตอบของ Johnnie:

ใช้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

ว้าวฉันไม่ทราบว่าการ-iตั้งค่าสถานะของ ffmpeg อาจใช้ URL เรียบร้อย
เจอเรมี


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/...

นี่เป็นพื้นฐานเหมือนกับการทำ postprocessing ด้วยffmpegตัวคุณเองหลังจากดาวน์โหลดไฟล์ก่อน


4
แต่สิ่งนี้จะยังคงต้องดาวน์โหลดวิดีโอทั้งหมดแล้วตัดส่วนที่ต้องการ
Kasparov92

ฉันได้รับ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 แรก (ซึ่งเชื่อมโยงกับสตรีมวิดีโอ) เพื่อดึงความยาวเนื้อหาทั้งหมดของสตรีมนี้:

$ 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

เราสามารถดาวน์โหลดเฉพาะส่วนเริ่มต้นของเสียง (2nd-URL) ในลักษณะที่คล้ายกัน (ความยาวเนื้อหาจะแตกต่างกัน แต่วินาทีทั้งหมดจะยังคงเหมือนเดิม)

การดาวน์โหลดส่วนตรงกลางจากวิดีโอควรเป็นไปได้ด้วยวิธีนี้ แต่อาจทำได้ยากกว่าเดิมเพราะ YouTube วางข้อมูลเมตาไว้ที่จุดเริ่มต้นของสตรีม (ในสองสามไบต์แรก) และไม่มีอยู่ในสื่อที่ดาวน์โหลด สตรีมจะไม่เล่นเลย

แก้ไข:สิ่งนี้จะใช้งานได้บนเว็บไซต์ที่มีการสนับสนุนการดำเนินการต่อพูด YouTube มันจะไม่ทำงานสำหรับเว็บไซต์อื่น ๆ


0

ใช้พารามิเตอร์--postprocessor-argsเพื่อส่งเอาต์พุตเสียง / วิดีโอไปยังffmpegที่จะแก้ไข (โปรเซสเซอร์) ดังนั้นจำเป็นต้องติดตั้ง ffmpeg

- ผู้โพสต์โปรเซสเซอร์ - argsใช้เวลา 3 ข้อโต้แย้งและค่า (ตัวอย่างเช่นมีมากขึ้นตรวจสอบหน้าคู่มือของ ffmpeg):

  • -ss HH: MM: SS: เวลาเริ่มต้นที่จะใช้
  • - ถึง HH: MM: SS: เวลาสิ้นสุด
  • -t HH: MM: SS: เวลาที่จะใช้

ตัวอย่าง:

  • เริ่มการเข้ารหัสที่ 15 วินาทีและหยุดที่ 1 นาที 20 วินาที

$ youtube-dl - ผู้โพสต์โปรเซสเซอร์ - args "-ss 0: 0: 15 -to 0: 1: 20" '[video_URL]'

  • เริ่มการเข้ารหัสที่ 15 วินาทีและใช้เวลาเพียง 3 นาที 5 วินาทีถัดไป

$ youtube-dl --postpostoror-args "-ss 0: 0: 15 -t 0: 3: 5" '[video_URL]'

PS: youtube-dl จะดาวน์โหลดสื่อทั้งหมดก่อนประมวลผลและลบออกหลังจากนั้น

โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.