Jak pobrać część wideo za pomocą komendy youtube-dl?

61

Korzystam z Ubuntu, a polecenie youtube-dl działa absolutnie dobrze.

Chcę pobrać tylko część filmu, która jest za długa. Więc chcę pobrać tylko kilka minut filmu. Przykład od 13 minut do 17 minut.

Czy istnieje jakiś sposób, aby to zrobić

użytkownik3181614
źródło

Odpowiedzi:

44

Nie wierzę, że youtube-dlsam zrobi, co chcesz. Można go jednak połączyć z narzędziem wiersza polecenia, takim jak ffmpeg.

Najpierw uzyskaj rzeczywisty adres URL za pomocą youtube-dl:

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

Skopiuj dane wyjściowe polecenia i wklej je jako część -iparametru następnego polecenia:

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

-ssParametr w tej pozycji państw, aby odrzucić wszystkie dane wejściowe aż 15 sekundy filmu. Te -tstany możliwość przechwytywania przez 10 sekund. Reszta polecenia każe przechowywać go jako MP4.

ffmpeg jest popularnym narzędziem i powinno znajdować się w dowolnym popularnym repozytorium / menedżerze pakietów.

Johnnie
źródło
8
Zasadniczo nadal musisz pobrać cały film i przyciąć go sam
Antony
12
Możesz użyć opcji -to zamiast -t, jeśli chcesz określić czas zakończenia wycinka wideo. ffmpeg -i "OUTPUT-OF-FIRST URL" -ss 00:13:00.00 -to 00:17:00.00 -c copy out.mp4
5
@Antony ffmpegfaktycznie pobierze tylko określoną część.
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
Steve Goranson
źródło
5
Czy możesz wyjaśnić, co to działa, jak to działa?
user259412
3
Jest to po prostu bardziej zwięzła wersja odpowiedzi @godofgrunts, wykorzystująca sed, aby zaoszczędzić trochę czasu, ręcznie chwytając adresy URL i kopiując / wklejając w czasie rozpoczęcia (-ss 00:05). @godofgrunts ma dodatkowe flagi, -map 0:v -map 1:a -c:v libx264 -c:a aacktóre mogą poprawić jakość. Chciałbym również dodać, youtube-dl -f bestvideo+bestaudioaby mieć pewność, że otrzymam wersję najwyższej jakości.
Steve Goranson
ffmpeg.zeranoe.com/builds dla Windows.
Wolfpack'08
16

Dodając do odpowiedzi Johnniego:

Służy youtube-dl -g "URL"do pobierania strumieni wideo i audio.

Teraz użyj:

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

Musisz użyć tej -ssopcji dla każdego strumienia. Polecam także zrobienie tego około 30 sekund wcześniej, a następnie użycie innej, -ss 30aby uniknąć utraty kluczowych klatek. Oto prawdziwy przykład wykorzystania jednego z moich filmów na youtube.

Wideo

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

Wynik:

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/

Chciałem obniżyć z 43:00 do 50:10, więc zrobię -ss 42:30(dając mi kilka sekund, aby złapać dobrą klatkę kluczową) na obu wejściach, a następnie zrobię to -ss 30po danych wejściowych, aby rozpocząć o 43:00.

Następnie użyję mapdo zmapowania obrazu 0:vi dźwięku 1:a(0 oznacza pierwsze wejście, którym jest wideo, a 1 oznacza drugie wejście, którym jest audio), a następnie wybiorę moje opcje kodowania.

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
godofgrunts
źródło
Dzięki. Nie byłem pewien, jak uzyskać dźwięk dla postu @Johnnie. Twój post odpowiedział na to.
Manny_Mar
Wow, nie wiedziałem, że -iflaga ffmpeg może pobierać adresy URL. schludnie
Geremia
12

To żądanie funkcji nie jest jeszcze zaimplementowane w youtube-dl. Zobacz numer 622 i wiele jego duplikatów na github.

ks1322
źródło
9

youtube-dl obsługuje przekazywanie argumentów do podstawowego postprocesora (testowany z wersją 2017.08.27.1):

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

Jest to w zasadzie to samo, co ffmpegsamodzielne przetwarzanie końcowe po pobraniu pliku.

Kevin
źródło
4
ale nadal będzie to wymagać pobrania całego filmu, a następnie wycięcia żądanej części
Kasparov92
Dostaję unable to obtain file audio codec with ffprobebłąd. Czy możesz mi w tym pomóc. Używam CentOS 7
Hassaan
3
Pamiętaj, że -xflaga pobiera tylko dźwięk. Pomiń to w poleceniu, jeśli chcesz audio i wideo. :)
grooveplex
2

Możesz pobierać od początku do punktu bez pobierania całej rzeczy i edycji. To połowa tego, o co pyta to pytanie:

przerwać pobieranie za pomocą ^C

  • Próbowałem tylko z tym mp4
  • nie będzie działać z osobnym wideo i audio, potrzebujesz formatu z obydwoma. Domyślnie ytdl często pobiera osobne wideo i audio, a następnie łączy je. Użyj, -Faby zobaczyć dostępne formaty i wybierz taki, mp4który ma oba. np. -f18lub -f22zwykle tam są.
  • musisz oszacować na podstawie pobranego procentu (który nie jest liniowy; stopień kompresji zmienia się w czasie).

Tak. To jest hack .

Dalsze pytanie: jeśli chcesz osobnych formatów audio i wideo, czy możesz pobrać część każdego z nich osobno (używając ^ctutaj), a następnie scalić je ręcznie? Nie sądzę, że to zadziała w przypadku niektórych formatów.

hyperpallium
źródło
1

To nie do końca odpowiada na pytanie OP, ale istnieje sposób, aby pobrać strumień od początku do określonego czasu trwania bez konieczności pobierania całego strumienia. Ponieważ YouTube zapewnia obsługę wznowienia, możemy poprosić o częściowe treści za pomocą Rangenagłówka.

Najpierw pobieramy adresy URL strumienia:

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

Powinno to wygenerować dwa adresy URL (każdy dla strumieni wideo i audio).

Teraz wyślij zapytanie na pierwszy adres URL (który prowadzi do strumienia wideo), aby pobrać całkowitą długość treści tego strumienia:

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

Teraz dzielimy tę całkowitą długość treści przez całkowitą liczbę sekund w filmie (czas trwania filmu w YouTube wynosi 4 minuty i 7 sekund, co stanowi 247 sekund), aby w przybliżeniu uzyskać długość 1 sekundy:

64380504 / 247 ≈ 260650

Mnożymy tę wartość przez (liczbę sekund, którą chcemy pobrać od początku + 1)

(dodajemy jeden, aby z grubsza uwzględnić dodatkowe miejsce zajmowane przez metadane, które są umieszczane na początku strumienia)

Na przykład, aby pobrać około pierwszych 10 sekund, musisz pobrać pierwsze 260650 * 11 = 2867150bajty, więc przesyłamy żądanie z Rangenagłówkiem:

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

Powinno to pobrać tylko pierwsze 10 sekund. Pobrany plik powinien być w stanie odtworzyć, ale najlepiej pozwolić FFmpeg naprawić nieprawidłowe metadane:

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

Możemy również pobrać w podobny sposób tylko początkową część dźwięku (2. URL) (długość treści byłaby różna, ale całkowite sekundy pozostałyby takie same).

Pobieranie jakiejkolwiek środkowej części z filmu powinno być również możliwe w ten sposób, ale prawdopodobnie staje się znacznie trudniejsze, ponieważ YouTube umieszcza metadane na początku strumienia (w pierwszych kilku bajtach) i bez obecności w pobranych mediach Strumień w ogóle nie będzie odtwarzany.

EDYCJA: Będzie to działać tylko na stronach internetowych z obsługą wznowienia, powiedzmy YouTube. To nie będzie działać na innych stronach internetowych.

ritiek
źródło
0

Użyj parametru --postprocessor-args , aby przekazać wyjście audio / wideo do edytora ffmpeg (procesor), więc musisz zainstalować ffmpeg.

--postprocessor-args przyjmuje 3 argumenty i wartości (na przykład, jest więcej, sprawdź stronę podręcznika ffmpeg):

  • -ss GG: MM: SS: czas rozpoczęcia
  • -do GG: MM: SS: czas zakończenia
  • -t GG: MM: SS: czas na podjęcie

Przykłady:

  • Rozpocznij kodowanie po 15 sekundach i zatrzymaj po 1 minutach 20 sekundach

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

  • Rozpocznij kodowanie po 15 sekundach i zajmij tylko kolejne 3 minuty 5 sekund

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

PS: youtube-dl pobierze całe media przed ich przetworzeniem i usunie po nim.

niainaLens
źródło