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ć
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ć
Odpowiedzi:
Nie wierzę, że youtube-dl
sam 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ęść -i
parametru następnego polecenia:
ffmpeg -i "OUTPUT-OF-FIRST URL" -ss 00:00:15.00 -t 00:00:10.00 -c copy out.mp4
-ss
Parametr w tej pozycji państw, aby odrzucić wszystkie dane wejściowe aż 15 sekundy filmu. Te -t
stany 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.
ffmpeg -i "OUTPUT-OF-FIRST URL" -ss 00:13:00.00 -to 00:17:00.00 -c copy out.mp4
ffmpeg
faktycznie pobierze tylko określoną część.
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
które mogą poprawić jakość. Chciałbym również dodać, youtube-dl -f bestvideo+bestaudio
aby mieć pewność, że otrzymam wersję najwyższej jakości.
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 -ss
opcji dla każdego strumienia. Polecam także zrobienie tego około 30 sekund wcześniej, a następnie użycie innej, -ss 30
aby uniknąć utraty kluczowych klatek. Oto prawdziwy przykład wykorzystania jednego z moich filmów na youtube.
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 30
po danych wejściowych, aby rozpocząć o 43:00.
Następnie użyję map
do zmapowania obrazu 0:v
i 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
-i
flaga ffmpeg może pobierać adresy URL. schludnie
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 ffmpeg
samodzielne przetwarzanie końcowe po pobraniu pliku.
unable to obtain file audio codec with ffprobe
błąd. Czy możesz mi w tym pomóc. Używam CentOS 7
-x
flaga pobiera tylko dźwięk. Pomiń to w poleceniu, jeśli chcesz audio i wideo. :)
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
mp4
-F
aby zobaczyć dostępne formaty i wybierz taki, mp4
który ma oba. np. -f18
lub -f22
zwykle tam są.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 ^c
tutaj), a następnie scalić je ręcznie? Nie sądzę, że to zadziała w przypadku niektórych formatów.
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ą Range
nagłó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 = 2867150
bajty, więc przesyłamy żądanie z Range
nagłó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.
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):
Przykłady:
$ youtube-dl --postprocessor-args "-ss 0: 0: 15 -to 0: 1: 20" '[video_URL]'
$ 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.