Youtube-dl komutu ile videonun bir kısmını nasıl indirebilirim?


61

Ubuntu kullanıyorum ve youtube-dl komutu kesinlikle iyi çalışıyor.

Videonun yalnızca çok uzun bir bölümünü indirmek istiyorum. Bu yüzden videonun sadece birkaç dakikalık bölümünü indirmek istiyorum. 13 dakikadan 17 dakikaya kadar örnek.

Bunu yapmanın bir yolu var mı?

Yanıtlar:


44

İstediğin şeyi youtube-dlyalnız yapacağına inanmıyorum . Ancak, ffmpeg gibi bir komut satırı yardımcı programı ile birleştirebilirsiniz.

İlk önce youtube-dl komutunu kullanarak gerçek URL'yi alın:

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

Komutun çıktısını kopyalayın ve bir -isonraki komutun parametresinin bir parçası olarak yapıştırın :

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

-ssBu pozisyon eyaletlerde parametre video içine 15 saniye kadar tüm giriş yukarı atmak. -tOpsiyon devletler 10 saniye yakalamak için. Komutun geri kalanı mp4 olarak saklamasını söyler.

ffmpeg popüler bir araçtır ve popüler OS depolarından / paket yöneticilerinden herhangi birinde olmalıdır.


8
Yani aslında, tüm videoyu indirmek ve kendiniz kırpmak zorundasınız
Antony

12
Video dilimini bitirme zamanını belirtmek istiyorsanız -t yerine -to seçeneğini kullanabilirsiniz. ffmpeg -i "OUTPUT-OF-FIRST URL" -ss 00:13:00.00 -to 00:17:00.00 -c copy out.mp4
ˆᵛˆ

5
@Antony ffmpegaslında yalnızca belirttiğiniz bölümü indirecektir.
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
Ne işe yaradığını, nasıl çalıştığını açıklayabilir misiniz?
user259412 15:17

3
Sadece URL'leri manuel olarak kapmak ve başlangıç ​​saatlerinde kopyalamak / yapıştırmak için biraz zaman kazanmak için sed kullanarak cevap vermek için godofgrunts yanıtının daha kısa versiyonudur (-ss 00:05). @godofgrunts, -map 0:v -map 1:a -c:v libx264 -c:a aackaliteyi artırabilecek ilave bayraklara sahiptir. Ayrıca youtube-dl -f bestvideo+bestaudioen yüksek kalitede sürüm aldığımdan emin olmak istiyorum.
Steve Goranson


16

Johnnie'nin cevabına ekleyerek:

youtube-dl -g "URL"Video ve ses akışlarını almak için kullanın .

Şimdi kullan:

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

-ssHer akış için seçeneği kullanmanız gerekir . Ayrıca, yaklaşık 30 saniye önce yapmayı ve sonra -ss 30anahtar kareleri kaybetmemek için başka bir tane kullanmanızı öneririm . İşte youtube videolarımdan birini kullanarak gerçek bir örnek.

Video

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

Çıktı:

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'den 50: 10'a kadar kesmek istedim, bu yüzden her iki girişte de yapacağım -ss 42:30(iyi bir ana kare yakalamak için bana birkaç saniye vererek) ve ardından -ss 30girişlerden 43: 00'da başlamak için bir süre sonra yapacağım .

Sonra mapvideoyu 0:vve sesi eşlemek için kullanacağım 1:a(0, video olan ilk giriş, video olan 1, ses olan ikinci giriş anlamına gelir) ve sonra kodlama seçeneklerimi seçeceğim.

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

Teşekkürler. @Johnnie post için nasıl ses alacağımı bilmiyordum. Mesajınız cevapladı.
Manny_Mar

Vay, ffmpeg'in -ibayrağının URL'leri alabileceğini bilmiyordum . temiz
Geremia

12

Bu özellik isteği henüz youtube-dl'de uygulanmadı. Bakınız # 622 sayısı ve bunun birçok kopyası için github.


9

youtube-dl Temel işlem sonrası işlemciye argümanların aktarılmasını destekler (2017.08.27.1 sürümüyle test edilmiştir):

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

Bu, temel olarak ffmpegdosyayı ilk indirdikten sonra kendinizle yapılan son işlemleri yapmakla aynıdır .


4
ama bu yine de tüm videoyu indirmeyi gerektirecek, daha sonra istenen kısmı kesecek
Kasparov92

Ben alıyorum unable to obtain file audio codec with ffprobehata. Bana bu konuda yardımcı olabilir misiniz? CentOS 7
Hassaan

3
Not -xbayrağı ses sadece indirir. Hem ses hem de video istiyorsanız komuttan çıkar. :)
grooveplex

2

Bir noktaya kadar baştan indirebilirsiniz olmadan her şeyi ve düzenleme indirmek. Bu sorunun ne dediğinin yarısı:

indirmeyi kes ^C

  • Bunu sadece denedim mp4
  • ayrı video ve ses ile çalışmaz, her ikisiyle de bir biçime ihtiyacınız vardır. Varsayılan olarak ytdl, genellikle ayrı video ve ses alır, daha sonra bunları birleştirir. Kullanılabilir -Fbiçimleri görmek için kullanın ve mp4her ikisine de sahip olanı seçin . örneğin -f18veya -f22genellikle oradalar.
  • indirilen yüzde değerinden tahmin etmeniz gerekir (bu doğrusal değildir; sıkıştırma oranı zamana göre değişir).

Evet. Bu bir kesmek .

Daha fazla soru: Ayrı video ve ses formatları istiyorsanız, her birinin bir kısmını ayrı ayrı indirebilir ( ^cburada olduğu gibi) ve sonra bunları manuel olarak birleştirebilir misiniz? Bazı formatlar için işe yarayacağını sanmıyorum.


1

Bu OP'nin sorusunu tam olarak cevaplamıyor, ancak akışın tamamını indirmeye gerek kalmadan bir akışı baştan belirli bir süreye indirmenin bir yolu var. YouTube özgeçmiş desteği sağladığından, Rangebaşlığı kullanarak kısmi içerik talep edebiliriz .

Önce akış URL’lerini getiriyoruz:

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

Bu, iki URL (her biri video ve ses akışları için) vermelidir.

Şimdi, bu akışın toplam içerik uzunluğunu almak için ilk URL'ye (video akışına bağlanan) bir kafa isteği gönderin:

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

Şimdi, bu toplam içerik uzunluğunu videodaki toplam saniyeye bölüyoruz (YouTube videosu 4 dakikalık bir süreye ve 24 saniye olan 7 saniyeye sahiptir).

64380504 / 247 ≈ 260650

Bu değeri ile çarpıyoruz (en başından + 1 almak istediğimiz saniye sayısı)

(Akışın başında yer alan meta verilerin aldığı fazladan alanı da kabaca hesaba katarız)

Örneğin, yaklaşık ilk 10 saniyeyi getirmek için ilk 260650 * 11 = 2867150baytları almanız gerekir , bu nedenle Rangebaşlık ile bir istek yapacağız :

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

Bu sadece ilk 10 saniyeyi indirmelidir. İndirilen dosya oynatılmalı, ancak FFmpeg yanlış meta verileri düzeltsin!

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

Ayrıca, sesin yalnızca ilk kısmını (2. URL) benzer bir şekilde indirebiliriz (içerik uzunluğu farklılık gösterebilir ancak toplam saniye aynı kalır).

Herhangi bir orta kısmı videodan indirmek de bu şekilde mümkün olmalı, ancak YouTube çok fazla daha zorlu olacak çünkü YouTube meta verileri akışın başlangıcına (ilk birkaç baytta) ve indirilen medyada bulunmadan yerleştiriyor Akış hiç oynamaz.

EDIT: Bu, yalnızca özgeçmiş desteği olan web sitelerinde çalışacak, diyor YouTube. Diğer web siteleri için çalışmaz.


0

Kullanım --postprocessor-bağımsız değişken ses / video çıkışı geçmek için parametre ffmpeg düzenlenecek (işlemcisi), bu nedenle yüklü ffmpeg gerekir.

- postprocessor-args 3 argüman ve değer alır (örneğin, daha fazlası, ffmpeg kılavuz sayfasını kontrol edin):

  • -ss HH: MM: SS: alma zamanı
  • -HH: MM: SS: bitiş zamanı
  • -T HH: MM: SS: Alınacak zaman

Örnekler:

  • Kodlamaya 15 saniyede başla ve 1 dakika 20 saniyede dur

$ youtube-dl - yayın işlemcisi-args "-ss 0: 0: 15 - 0: 1: 20" '[video_URL]'

  • Kodlamaya 15 saniyede başla ve sadece bir sonraki 3 dakika 5 saniye sür.

$ youtube-dl - yayın işlemcisi-args "-ss 0: 0: 15 -t 0: 3: 5" '[video_URL]'

Not: youtube-dl işlemden önce tüm medyayı indirecek ve sonra silecektir.

Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.