ฉันใช้ Ubuntu และคำสั่ง youtube-dl ทำงานได้ดีอย่างแน่นอน
ฉันต้องการดาวน์โหลดเฉพาะบางส่วนของวิดีโอที่ยาวเกินไป ดังนั้นฉันต้องการดาวน์โหลดวิดีโอเพียงไม่กี่นาที ตัวอย่างจาก 13 นาทีถึง 17 นาที
มีวิธีใดบ้างที่จะทำเช่นนั้น
ฉันใช้ Ubuntu และคำสั่ง youtube-dl ทำงานได้ดีอย่างแน่นอน
ฉันต้องการดาวน์โหลดเฉพาะบางส่วนของวิดีโอที่ยาวเกินไป ดังนั้นฉันต้องการดาวน์โหลดวิดีโอเพียงไม่กี่นาที ตัวอย่างจาก 13 นาทีถึง 17 นาที
มีวิธีใดบ้างที่จะทำเช่นนั้น
คำตอบ:
ฉันไม่เชื่อ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 / ผู้จัดการแพคเกจยอดนิยมใด ๆ
ffmpeg -i "OUTPUT-OF-FIRST URL" -ss 00:13:00.00 -to 00:17:00.00 -c copy out.mp4
ffmpeg
จะดาวน์โหลดเฉพาะส่วนที่คุณระบุเท่านั้น
ffmpeg $(youtube-dl -g 'https://www.youtube.com/watch?v=oHg5SJYRHA0' | sed "s/.*/-ss 00:05 -i &/") -t 01:00 -c copy out.mkv
-map 0:v -map 1:a -c:v libx264 -c:a aac
ที่อาจปรับปรุงคุณภาพ ฉันต้องการเพิ่มyoutube-dl -f bestvideo+bestaudio
เพื่อให้แน่ใจว่าฉันได้รับรุ่นที่มีคุณภาพสูงสุด
กำลังเพิ่มคำตอบของ 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
-i
ตั้งค่าสถานะของ ffmpeg อาจใช้ URL เรียบร้อย
คำขอคุณลักษณะนี้ยังไม่ได้ใช้งานใน youtube-dl ดูที่# 622 ปัญหาและซ้ำซ้อนกับ github
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
ตัวคุณเองหลังจากดาวน์โหลดไฟล์ก่อน
unable to obtain file audio codec with ffprobe
ข้อผิดพลาด คุณช่วยฉันด้วยได้ไหม ฉันใช้ CentOS 7
-x
ตั้งค่าสถานะดาวน์โหลดเสียงเท่านั้น งดเว้นจากคำสั่งหากคุณต้องการทั้งเสียงและวิดีโอ :)
คุณสามารถดาวน์โหลดได้ตั้งแต่เริ่มต้นจนถึงจุดโดยไม่ต้องดาวน์โหลดทุกอย่างและแก้ไข นั่นเป็นครึ่งหนึ่งของสิ่งที่คำถามนี้ถาม:
ขัดจังหวะการดาวน์โหลดด้วย
^C
mp4
-F
เพื่อดูรูปแบบที่มีและเลือกรูปแบบmp4
ที่มีทั้งคู่ เช่น-f18
หรือ-f22
มักจะมีใช่. มันแฮ็ค
คำถามเพิ่มเติม: หากคุณต้องการรูปแบบวิดีโอและเสียงแยกจากกันคุณสามารถดาวน์โหลดบางส่วนแยกกัน (ใช้^c
เป็นที่นี่) แล้วรวมมันด้วยตนเองได้หรือไม่ ฉันไม่คิดว่ามันจะใช้ได้กับบางรูปแบบ
นี่ไม่ได้ตอบคำถามของ 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 มันจะไม่ทำงานสำหรับเว็บไซต์อื่น ๆ
ใช้พารามิเตอร์--postprocessor-argsเพื่อส่งเอาต์พุตเสียง / วิดีโอไปยังffmpegที่จะแก้ไข (โปรเซสเซอร์) ดังนั้นจำเป็นต้องติดตั้ง ffmpeg
- ผู้โพสต์โปรเซสเซอร์ - argsใช้เวลา 3 ข้อโต้แย้งและค่า (ตัวอย่างเช่นมีมากขึ้นตรวจสอบหน้าคู่มือของ ffmpeg):
ตัวอย่าง:
$ youtube-dl - ผู้โพสต์โปรเซสเซอร์ - args "-ss 0: 0: 15 -to 0: 1: 20" '[video_URL]'
$ youtube-dl --postpostoror-args "-ss 0: 0: 15 -t 0: 3: 5" '[video_URL]'
PS: youtube-dl จะดาวน์โหลดสื่อทั้งหมดก่อนประมวลผลและลบออกหลังจากนั้น