Làm cách nào để tải xuống một phần video bằng lệnh youtube-dl?


62

Tôi đang sử dụng Ubuntu và lệnh youtube-dl đang hoạt động rất tốt.

Tôi muốn tải xuống chỉ một phần video quá dài. Vì vậy, tôi muốn tải xuống chỉ một vài phút của video. Ví dụ từ 13 phút đến 17 phút.

Có cách nào để làm điều đó

Câu trả lời:


44

Tôi không tin youtube-dlmột mình sẽ làm những gì bạn muốn. Tuy nhiên, bạn có thể kết hợp nó với một tiện ích dòng lệnh như ffmpeg.

Trước tiên hãy lấy URL thực tế bằng youtube-dl:

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

Sao chép đầu ra của lệnh và dán nó như một phần của -itham số của lệnh tiếp theo:

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

Các -sstham số ở vị trí này bang để loại bỏ tất cả các đầu vào lên đến 15 giây vào video. Các -ttùy chọn trạng thái để chụp trong 10 giây. Phần còn lại của lệnh bảo nó lưu dưới dạng mp4.

ffmpeg là một công cụ phổ biến và nên có trong bất kỳ kho lưu trữ / quản lý gói phổ biến nào của HĐH.


8
Vì vậy, về cơ bản, bạn vẫn phải tải xuống toàn bộ video và tự cắt nó
Antony

12
Bạn có thể sử dụng tùy chọn -to thay vì -t nếu bạn muốn chỉ định thời gian kết thúc lát video. ffmpeg -i "OUTPUT-OF-FIRST URL" -ss 00:13:00.00 -to 00:17:00.00 -c copy out.mp4

5
@Antony ffmpegthực sự sẽ chỉ tải xuống phần bạn chỉ định.
akaihola

không lưu âm thanh cho video trong trường hợp của tôi không giống như câu trả lời của @godofgrunts.
daGo

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
Bạn có thể giải thích, những gì nó làm, làm thế nào nó hoạt động?
dùng259412

3
Đây chỉ là phiên bản ngắn gọn hơn của câu trả lời @godofgrunts, sử dụng sed để tiết kiệm thời gian lấy thủ công các URL và sao chép / dán trong thời gian bắt đầu (-ss 00:05). @godofgrunts có một số cờ bổ sung -map 0:v -map 1:a -c:v libx264 -c:a aaccó thể cải thiện chất lượng. Tôi cũng muốn thêm youtube-dl -f bestvideo+bestaudiođể chắc chắn rằng tôi đang có phiên bản chất lượng cao nhất.
Steve Goranson


17

Thêm vào câu trả lời của Johnnie:

Sử dụng youtube-dl -g "URL"để có được các luồng video và âm thanh.

Bây giờ sử dụng:

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

Bạn sẽ cần sử dụng -sstùy chọn cho mỗi luồng. Tôi cũng khuyên bạn nên thực hiện sớm hơn khoảng 30 giây và sau đó sử dụng một -ss 30khung khác để tránh mất bất kỳ khung chính nào. Đây là một ví dụ thực tế sử dụng một trong những video youtube của tôi.

Video

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

Đầu ra:

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/

Tôi muốn cắt giảm từ 43:00 đến 50:10 vì vậy tôi sẽ làm -ss 42:30(cho tôi vài giây để bắt được một khung hình chính) trên cả hai đầu vào và sau đó thực hiện -ss 30sau khi đầu vào bắt đầu lúc 43:00.

Sau đó, tôi sẽ sử dụng mapđể ánh xạ video 0:vvà âm thanh 1:a(0 có nghĩa là đầu vào đầu tiên, đó là video và 1 có nghĩa là đầu vào thứ hai, là âm thanh) và sau đó chọn tùy chọn mã hóa của tôi.

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

1
Cảm ơn. Tôi không chắc chắn làm thế nào để có được âm thanh, cho bài đăng @Johnnie. Bài viết của bạn đã trả lời nó.
Manny_Mar

Ồ, tôi không biết -icờ của ffmpeg có thể lấy URL. gọn gàng
Geremia

Nó khác với việc sử dụng --postprocessor-argstrực tiếp trong youtube-dl như thế nào?
daGo

12

Yêu cầu tính năng này chưa được triển khai trong youtube-dl. Xem vấn đề # 622 và nhiều bản sao của nó trên github.


9

youtube-dl hỗ trợ chuyển các đối số cho bộ xử lý hậu cơ bản (đã được thử nghiệm với phiên bản 2017.08.27.1):

youtube-dl -x --postprocessor-args "-ss 00:13:00.00 -t 00:04:00.00" https://youtu.be/...

Điều này về cơ bản giống như thực hiện quá trình hậu xử lý với ffmpegchính bạn sau khi tải xuống tệp đầu tiên.


4
nhưng điều này vẫn sẽ yêu cầu tải xuống toàn bộ video, sau đó cắt phần mong muốn
Kasparov92

Tôi đang nhận được unable to obtain file audio codec with ffprobelỗi. Bạn có thể vui lòng giúp tôi với điều đó. Tôi đang sử dụng CentOS 7
Hassaan

3
Lưu ý rằng -xcờ chỉ tải xuống âm thanh. Bỏ qua nó từ lệnh nếu bạn muốn cả âm thanh và video. :)
grooveplex

2

Bạn có thể tải xuống từ đầu đến một điểm mà không cần tải xuống toàn bộ và chỉnh sửa. Đó là một nửa những gì câu hỏi này yêu cầu:

làm gián đoạn việc tải xuống với ^C

  • Tôi chỉ thử điều này với mp4
  • sẽ không hoạt động với video và âm thanh riêng biệt, bạn cần một định dạng với cả hai. Theo mặc định, ytdl thường có video và âm thanh riêng biệt, sau đó hợp nhất chúng lại. Sử dụng -Fđể xem các định dạng có sẵn và chọn một định dạng có mp4cả hai. ví dụ -f18hoặc -f22thường ở đó
  • bạn sẽ phải ước tính từ phần trăm được tải xuống (không phải là tuyến tính; tốc độ nén thay đổi theo thời gian).

Đúng. Đó là một hack .

Câu hỏi thêm: nếu bạn muốn các định dạng video và âm thanh riêng biệt, bạn có thể tải xuống một phần riêng biệt (sử dụng ^cnhư ở đây), sau đó hợp nhất chúng theo cách thủ công không? Tôi không nghĩ rằng nó sẽ làm việc cho một số định dạng.


1

Điều này không hoàn toàn trả lời câu hỏi của OP nhưng có cách để tải xuống một luồng từ đầu đến một khoảng thời gian cụ thể mà không phải tải xuống luồng hoàn chỉnh. Vì YouTube cung cấp hỗ trợ tiếp tục, chúng tôi có thể yêu cầu một phần nội dung bằng Rangetiêu đề.

Trước tiên chúng tôi tìm nạp các URL luồng:

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

Điều này sẽ xuất hai URL (mỗi URL cho luồng video và âm thanh).

Bây giờ gửi yêu cầu đầu đến URL đầu tiên (liên kết đến luồng video) để tìm nạp tổng chiều dài nội dung của luồng này:

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

Bây giờ, chúng tôi chia tổng thời lượng nội dung này cho tổng số giây trong video (video YouTube có thời lượng 4 phút và 7 giây là 247 giây.) Để có được thời lượng nội dung là 1 giây:

64380504 / 247 ≈ 260650

Chúng tôi nhân giá trị này với (số giây chúng tôi muốn tìm nạp từ đầu + 1)

(chúng tôi thêm một tài khoản đại khái để có thêm không gian được lấy bởi siêu dữ liệu được đặt ở đầu luồng)

Ví dụ: để tìm nạp khoảng 10 giây đầu tiên, bạn sẽ cần tìm nạp các 260650 * 11 = 2867150byte đầu tiên , vì vậy chúng tôi đưa ra yêu cầu với Rangetiêu đề:

$ curl "1st-URL" -H "Range: bytes=0-2867150" -o ten_secs.mp4

Điều này chỉ nên tải xuống trong 10 giây đầu tiên. Tệp đã tải xuống có thể phát nhưng tốt nhất hãy để FFmpeg sửa siêu dữ liệu không chính xác:

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

Chúng tôi cũng chỉ có thể tải xuống phần ban đầu của âm thanh (URL thứ 2) theo cách tương tự (độ dài nội dung sẽ khác nhau nhưng tổng số giây sẽ giữ nguyên).

Tải xuống bất kỳ phần giữa nào từ video cũng có thể theo cách này nhưng có lẽ sẽ khó khăn hơn nhiều vì YouTube đặt siêu dữ liệu ở đầu luồng (trong một vài byte đầu tiên) và không có trong phương tiện được tải xuống, stream sẽ không chơi gì cả.

EDIT: Điều này sẽ chỉ hoạt động trên các trang web có hỗ trợ tiếp tục, nói YouTube. Nó sẽ không hoạt động cho các trang web khác.


0

Sử dụng tham số --post Processor-args để chuyển đầu ra âm thanh / video sang ffmpeg để được chỉnh sửa (bộ xử lý), do đó cần cài đặt ffmpeg.

--post Processor-args lấy 3 đối số & giá trị (ví dụ: có nhiều hơn, kiểm tra trang thủ công của ffmpeg):

  • -ss HH: MM: SS: thời gian bắt đầu
  • -to HH: MM: SS: thời gian kết thúc
  • -t HH: MM: SS: thời gian kéo dài

Ví dụ:

  • Bắt đầu mã hóa ở 15 giây và dừng lại sau 1 phút 20 giây

$ youtube-dl --post Processor-args "-ss 0: 0: 15 -to 0: 1: 20" '[video_URL]'

  • Bắt đầu mã hóa ở 15 giây và chỉ mất 3 phút tiếp theo 5 giây

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

PS: youtube-dl sẽ tải xuống toàn bộ phương tiện trước khi xử lý và xóa nó sau.

Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.