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 đó
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:
Tôi không tin youtube-dl
mộ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 -i
tham 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 -ss
tham 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 -t
tù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.
ffmpeg -i "OUTPUT-OF-FIRST URL" -ss 00:13:00.00 -to 00:17:00.00 -c copy out.mp4
ffmpeg
thực sự sẽ chỉ tải xuống phần bạn chỉ định.
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
có 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.
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 -ss
tù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 30
khung 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.
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 30
sau khi đầu vào bắt đầu lúc 43:00.
Sau đó, tôi sẽ sử dụng map
để ánh xạ video 0:v
và â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
-i
cờ của ffmpeg có thể lấy URL. gọn gàng
--postprocessor-args
trực tiếp trong youtube-dl như thế nào?
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.
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 ffmpeg
chính bạn sau khi tải xuống tệp đầu tiên.
unable to obtain file audio codec with ffprobe
lỗi. Bạn có thể vui lòng giúp tôi với điều đó. Tôi đang sử dụng CentOS 7
-x
cờ chỉ tải xuống âm thanh. Bỏ qua nó từ lệnh nếu bạn muốn cả âm thanh và video. :)
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
mp4
-F
để xem các định dạng có sẵn và chọn một định dạng có mp4
cả hai. ví dụ -f18
hoặc -f22
thường ở đóĐú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 ^c
như ở đâ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.
Đ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 Range
tiê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 = 2867150
byte đầu tiên , vì vậy chúng tôi đưa ra yêu cầu với Range
tiê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.
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):
Ví dụ:
$ youtube-dl --post Processor-args "-ss 0: 0: 15 -to 0: 1: 20" '[video_URL]'
$ 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.