Používám Ubuntu a příkaz youtube-dl funguje naprosto dobře.

Nyní však chci stáhnout pouze část videa, která je příliš dlouhá. Takže chci stáhnout jen pár minut toho videa, např. od 13. minuty do 17. minuty.

Existuje nějaký způsob, jak to udělat?

Odpovědět

I nevěřte, že youtube-dl bude dělat to, co chcete. Můžete to však zkombinovat s nástrojem příkazového řádku, jako je ffmpeg.

Nejprve získejte skutečnou adresu URL pomocí youtube -dl:

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

Zkopírujte výstup příkazu a vložte jej jako součást parametru -i parametru další příkaz:

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

Parametr -ss v této poloze uvádí, že veškerý vstup vyřadí do 15 sekund do video. Možnost -t uvádí, že se má pořizovat po dobu 10 sekund. Zbytek příkazu říká, že se má ukládat jako mp4.

ffmpeg je populární nástroj a měl by být v některém z oblíbených úložišť / správců balíků OS.

Komentáře

  • Takže v zásadě si stále musíte stáhnout celé video a oříznout ho sami
  • Můžete použít t Možnost -to namísto -t, pokud chcete určit čas ukončení výřezu videa. ffmpeg -i "OUTPUT-OF-FIRST URL" -ss 00:13:00.00 -to 00:17:00.00 -c copy out.mp4
  • @Antony ffmpeg ve skutečnosti stáhne pouze vámi zadanou část.
  • @ Antony Pokud dáte parametr -ss před parametr -i, začne se stahovat od času, který jste zadali pomocí -ss. Pokud však umístíte -ss za parametr -i, pak ffmpeg stáhne od samého začátku videa a začne kódovat z místa, kde -ss určuje. Další informace najdete v mé úpravě odpovědi Johnnie ‚.
  • pomocí odkazu poskytnutého youtube-dl pomocí -g mi vždy vrátí hodnotu 403 zakázanou. Samotné stažení videa pomocí youtube-dl bude vždy fungovat jako kouzlo.

Odpověď

Přidání do Odpověď Johnnie:

Použijte youtube-dl --youtube-skip-dash-manifest -g "URL" k získání video a audio streamů.

Nyní použijte:

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 

Pro každý stream budete muset použít možnost -ss. Doporučuji také provést to asi o 30 sekund dříve a poté použít jiný -ss 30, abyste neztratili žádné klíčové snímky. Zde je skutečný příklad použití jednoho z mých videí na YouTube.

Video

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

Výstup:

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/ 

Chtěl jsem snížit z 43:00 na 50:10, takže udělám -ss 42:30 (což mi dává pár sekund na to, abych zachytil dobrý klíčový snímek) na obou vstupech a poté proveďte -ss 30 po vstupech do 43:00.

Pak použiji map k mapování videa 0:v a zvuku 1:a (0 znamená první vstup, kterým je video, a 1 znamená druhý vstup, kterým je zvuk) a poté vyberte moje možnosti kódování.

 # The first URL video_url="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/" # The second URL audio_url="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/" ffmpeg -ss 42:30 -i "$video_url" -ss 42:30 -i "$audio_url" -map 0:v -map 1:a -ss 30 -t 7:10 -c:v libx264 -c:a aac gog-vs-triv.mkv  

Kredit Jakub Vrána za --youtube-skip-dash-manifest řešení.

Komentáře

  • Díky. Nebyl jsem si jistý, jak získat zvuk, u příspěvku @Johnnie. Váš příspěvek na něj odpověděl.
  • Jak se liší fer from using --postprocessor-args přímo v youtube-dl?
  • @daGo – věřím, že youtube-dl --postprocessor-args stáhne celé video a poté jej upravte do vybraného rozsahu, zatímco tato odpověď používá youtube-dl pouze k získání speciálních adres URL. ffmpeg poté použije tyto adresy URL ke stažení pouze požadovaného rozsahu. Pokud tedy chcete z 2hodinového přednáškového videa extrahovat 2 minuty, tato odpověď vám ušetří spoustu stahování.
  • Funguje to s většinou videí YT, ale zkouším to s 9hodinovým videem, které byl dříve živě streamován (a nyní dokončen) a při zpracování vstupu “ byla nalezena neplatná data „. Hlavní rozdíl spočívá v tom, že výstup youtube-dl -g je jiný. U většiny videí má strukturu. "https://r3---sn-mv-cvne.googlevideo.com/videoplayback/id/8...", ale pro toto video má strukturu. "https://manifest.googlevideo.com/api/manifest/dash/expire/15956..." (zkráceno o mezeru). Nápady, jak to udělat?
  • @LeftoverSalad Nalezeno jedno řešení .

Odpověď

ffmpeg $(youtube-dl -g "https://www.youtube.com/watch?v=oHg5SJYRHA0" | sed "s/.*/-ss 00:05 -i &/") -t 01:00 -c copy out.mkv 

Upravte adresu URL a -ss, -t krát použít tento příkaz. Vytváří argumenty pomocí URL videa i zvuku, podobně jako tato odpověď od @godofgrunts.Pro $() se nepoužívají uvozovky, protože to vytváří dva oddělené argumenty pro ffmpeg.

Komentáře

  • Mohl byste vysvětlit, co dělá, jak to funguje?
  • Je to ‚ pouze stručnější verzí @ godofgrunts answer, using sed to save some time manually grabping the URLs and copying / pasting in the start times (-ss 00:05). @godofgrunts má několik dalších příznaků -map 0:v -map 1:a -c:v libx264 -c:a aac, které mohou zlepšit kvalitu. Také bych rád přidal youtube-dl -f bestvideo+bestaudio, abych se ujistil, že ‚ získávám verzi v nejvyšší kvalitě.
  • ffmpeg.zeranoe.com/builds pro Windows.
  • Příznaky “ “ vypořádat se se dvěma proudy (video a audio), které podle vás špatně zacházíte – IIUC nemají nic společného se zlepšováním kvality (no, mít zvuk je pravděpodobně známkou vylepšené kvality :-)) odpověď od @godofgrunts níže se zdá být správná.

Odpověď

youtube-dl podporuje předávání argumentů podkladovému postprocesoru (testováno s verzí 2017.08.27.1):

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

To je v zásadě stejné jako provádění postprocesingu s ffmpeg po prvním stažení souboru.

Komentáře

  • , ale to bude i nadále vyžadovat stáhněte si celé video a poté ořízněte požadovanou část
  • Zobrazuje se mi chyba unable to obtain file audio codec with ffprobe. Můžete mi s tím prosím pomoci? Používám CentOS 7
  • Všimněte si, že příznak -x stáhne pouze zvuk. Vynechejte to z příkazu, pokud chcete zvuk i video. 🙂
  • To nebude spolehlivě fungovat, protože —postprocessor-args je v některých případech použit vícekrát. Viz github.com/ytdl-org/youtube-dl/issues/26863

Odpověď

Tento požadavek na funkci zatím není v youtube-dl implementován. Viz problém č. 622 a mnoho jeho duplikátů na githubu.

Odpovědět

Pomocí parametru --postprocessor-args předejte audio / video výstup do ffmpeg, který chcete upravit (procesor). Postprocesor musí být ffmpeg nainstalován.

--postprocessor-args vyžaduje 3 argumenty & hodnoty (například je jich více, zkontrolujte ruční stránku ffmpeg):

  • -ss HH:MM:SS: čas zahájení
  • -to HH:MM:SS: čas ukončení
  • -t HH:MM:SS: čas délka:

Příklady:

  • Začněte kódovat v 15 sekundách a zastavte v 1 minutě 20 sekundách
    $ youtube-dl --postprocessor-args "-ss 0:0:15 -to 0:1:20" "[video_URL]" 
  • Začněte kódovat za 15 sekund a trvejte jen další 3 minuty 5 sekund
    $ youtube-dl --postprocessor-args "-ss 0:0:15 -t 0:3:5" "[video_URL]" 

PS: youtube-dl před zpracováním stáhne celé médium a poté jej odstraní.

Komentáře

Odpověď

To na otázku OP úplně neodpovídá, ale existuje způsob, jak stáhnout stream od začátku do určité doby, aniž byste museli stahovat celý stream. Protože YouTube poskytuje podporu obnovení, mohli bychom požádat o částečný obsah pomocí záhlaví Range.

Nejprve načteme adresy URL streamu:

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

Měly by se vygenerovat dvě adresy URL (každá pro video a audio streamy).

Nyní pošlete požadavek na hlavu na první adresu URL (která odkazuje na stream videa) na načíst celkovou délku obsahu tohoto streamu:

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

Nyní tuto celkovou délku obsahu vydělíme celkovým počtem sekund ve videu (video na YouTube má délku 4 min a 7 s, což je 247 sekund.) k získání přibližně délky obsahu 1 sekundy:

64380504 / 247 ≈ 260650

Tuto hodnotu vynásobíme s (počet sekund, které chceme načíst od začátku + 1)

(přidáme jednu, abychom zhruba zohlednili další prostor zabraný metadaty, která jsou umístěna na začátku streamu)

Chcete-li například načíst přibližně prvních 10 sekund, budete muset načíst prvních 260650 * 11 = 2867150 bajtů, takže podáme požadavek s Range záhlaví:

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

Mělo by se stáhnout pouze první 10 sStažený soubor by měl být schopen přehrát, ale nejlépe nechte FFmpeg opravit nesprávná metadata:

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

Můžeme také stáhnout pouze počáteční část zvuku (2. – URL) podobným způsobem (délka obsahu by se lišila, ale celkový počet sekund by zůstal stejný).

Stahování jakékoli střední části videa by mělo být také možné tímto způsobem, ale bude pravděpodobně mnohem složitější, protože YouTube umístí metadata na začátek streamu (v prvních několika bajtech) a aniž by byl přítomen na staženém médiu, stream se vůbec nepřehraje.

EDIT: Funguje to pouze na webech s podporou obnovení, řekněme YouTube. U ostatních webů to nefunguje.

Odpověď

Můžete si je stáhnout od začátku až do bodu bez stažení celé věci a úpravy. To je polovina toho, na co se tato otázka ptá:

přerušit stahování ^C

  • Zkoušel jsem to pouze s mp4
  • nebudu pracovat se samostatným videem a zvuk, potřebujete formát s oběma. Ve výchozím nastavení ytdl často získá samostatné video a zvuk a poté je sloučí. Pomocí -F zobrazíte dostupné formáty a vyberte mp4 který má obojí. např. -f18 nebo -f22 jsou obvykle tam.
  • „Budu muset odhadnout podle staženého procenta (což není lineární; rychlost komprese se časem mění).

Ano. Je to hack .

Další otázka: Pokud chcete samostatné formáty videa a zvuku, můžete si stáhnout část každého zvlášť (pomocí ^c jako zde) a potom je sloučit ručně? Nemyslím si, že to u některých formátů nebude fungovat.

Odpovědět

Vytvořil jsem skript implementující odpověď @godofgrunts zde

 #!/bin/bash #taken from https://unix.stackexchange.com/a/388148/48971 if [ $# -lt 4 ]; then echo "Usage: $0 <youtube"s URL> <HH:mm:ss from time> <HH:mm:ss to time> <output_file_name>" echo "e.g.:" echo "$0 https://www.youtube.com/watch?v=T1n5gXIPyws 00:00:25 00:00:42 intro.mp4" exit 1 fi echo "processing..." from=$(date "+%s" -d "UTC 01/01/1970 $2") to=$(date "+%s" -d "UTC 01/01/1970 $3") from_pre=$(($from - 30)) if [ $from_pre -lt 0 ] then from_pre=0 fi from_pre_command_print=$(date -u "+%T" -d @$from_pre) from_command_print=$(date -u "+%T" -d @$(($from - $from_pre)))$(grep -o "\..*" <<< $2) to_command_print=$(date -u "+%T" -d @$(($to - $from_pre)))$(grep -o "\..*" <<< $3) command="ffmpeg " for uri in $(youtube-dl -g $1) do command+="-ss $from_pre_command_print -i $uri " done command+="-ss $from_command_print -to $to_command_print $4" echo "downloading with the following command:" echo "$command" $command  

Také jsem jej nahrál na úryvky Gitlab

Odpovědět

Vytvořil jsem baňkovou aplikaci, která dokáže to, co chcete. Vím, že příspěvek je starý, ale problém přetrvává.

Najdete ho zde

Může analyzovat text i pro odkazy na YouTube. Stačí zadat např .:

YouTube.com/blahblah start-1:20 

Tím se stáhne video od 0: 1: 22 (kvůli klíčovým snímkům mohou nastat malé rozdíly). Může také stahovat celá videa, ale v takovém případě časový interval vynechejte.

Odpověď

Pro všechny líné lidi, kteří ne „Nechcete použít více než jeden příkaz, proveďte následující:

youtube-dl.exe https://www.youtube.com/watch?v=MJD39Aja1Is --external-downloader ffmpeg --external-downloader-args "-ss 00:00:10.00 -t 00:01:00.00" 

Nyní můžete kombinovat možnosti youtube-dl.exe a ffmpeg jako je výběr formátu, odstranění videa a ořezání zvukového souboru atd. (možná oříznutí video souboru a než převod na zvukový soubor, cokoli se stane dříve)

youtube-dl.exe -f 251 https://www.youtube.com/watch?v=MJD39Aja1Is -x --external-downloader ffmpeg --external-downloader-args "-ss 00:00:10.00 -t 00:01:00.00" 

Komentáře

  • váš příkaz nefunguje na GNU / Linuxu: používáme youtube-dl místo youtube-dl.exe. A ffmpeg mi řekl Invalid duration specification for ss: 00.00.10.00, mělo by to být -ss 00:00:30.00 s dvojtečkami místo teček s výjimkou posledního.
  • @ ewin-goisot omlouvám se, stalo se to, protože jsem ‚ t po testu zkopíroval celý příkaz ting to. Nyní by to mělo fungovat. problémem byla definice času. musí to být 00: 00: 00,00 2krát dvojitý bod, než jen 1 bod. jako hh: mm: ss.ms
  • s 00:00:00.0, funguje to lépe, mohu si stáhnout část videa. Stále mám problém (s vaším příkazem a většinou ostatních): stahuje se příliš 5 nebo 10 sekund. Řešení je uvedeno v odpovědi @godofgrunts ‚: -ss 42:30 -i "$video_url" -ss 42:30 -i "$audio_url" -map 0:v -map 1:a -ss 30 počínaje 30 sekund před začátkem porce a přidáním -ss 30 na konci. Takže musím použít několikrát možnost -ss na stejný příkaz. Existuje způsob, jak udělat totéž s --external-downloader-args?
  • omlouvám se, míchání různých proudů nejsem tak dobře obeznámen. ale pokud si chcete pořídit jen ten nejlepší zvukový a obrazový materiál ze stejného videa, můžete to udělat pomocí youtube-dl.

Odpovědět

Chcete-li přidat odpověď na @hyperpallium: OP nezmínil, že video, které stahuje, musí být z YouTube.

YouTube je se svými videi směšně omezující, rozdělili audio a video streamy do různých souborů a sledují vás / prodávají vaše data; proto by mohlo dojít k potížím s metodou jeho stahování, částečně pak stiskem Ctrl + C .

S youtube-dl verzí 2020.11.17 v systému Microsoft Windows verze 10.0.17134.1304 jsem stáhl část videa z archivu.org:

E:\cs>youtube-dl --abort-on-unavailable-fragment https://archive.org/download/beastars-season-1-1080p/%5BHCS%5D%20Beastars%20-%2003%20%5B1080p%5D.mkv [generic] [HCS] Beastars - 03 [1080p]: Requesting header [redirect] Following redirect to https://ia601504.us.archive.org/14/items/beastars-season-1-1080p/%5BHCS%5D%20Beastars%20-%2003%20%5B1080p%5D.mkv [generic] [HCS] Beastars - 03 [1080p]: Requesting header WARNING: Falling back on generic information extractor. [generic] [HCS] Beastars - 03 [1080p]: Downloading webpage WARNING: URL could be a direct video link, returning it as such. [download] Destination: [HCS] Beastars - 03 [1080p]-[HCS] Beastars - 03 [1080p].mkv [download] 2.3% of 513.77MiB at 839.68KiB/s ETA 10:12 ERROR: Interrupted by user E:\cs>ren "[HCS] Beastars - 03 [1080p]-[HCS] Beastars - 03 [1080p].mkv.part" "[HCS] Beastars - 03 [1080p]-[HCS] Beastars - 03 [1080p].mkv" E:\cs>ffmpeg -i "[HCS] Beastars - 03 [1080p]-[HCS] Beastars - 03 [1080p].mkv" "[HCS] Beastars - 03 [1080p].mp4" ffmpeg version N-91990-g49c67e79ca Copyright (c) 2000-2018 the FFmpeg developers built with gcc 8.2.1 (GCC) 20180813 [stdout text] Stream #0:1(jpn): Audio: aac (LC) (mp4a / 0x6134706D), 48000 Hz, stereo, fltp, 128 kb/s (default) Metadata: encoder : Lavc58.30.100 aac [matroska,webm @ 0000020c8f28a2c0] Read errorme=00:00:33.96 bitrate=2099.5kbits/s speed=0.0185x frame= 823 fps=0.3 q=-1.0 Lsize= 9677kB time=00:00:34.56 bitrate=2293.8kbits/s speed=0.0147x video:9134kB audio:519kB subtitle:0kB other streams:0kB global headers:0kB muxing overhead: 0.248960% [libx264 @ 0000020c8f3423c0] frame I:25 Avg QP:14.71 size: 56865 [stdout] E:\cs>youtube-dl -v [debug] System config: [] [debug] User config: [] [debug] Custom config: [] [debug] Command-line args: ["-v"] [debug] Encodings: locale cp1252, fs mbcs, out cp437, pref cp1252 [debug] youtube-dl version 2020.11.17 [debug] Python version 3.4.4 (CPython) - Windows-10-10.0.17134 [debug] exe versions: ffmpeg 3.4, ffprobe N-91990-g49c67e79ca [debug] Proxy map: {} Usage: youtube-dl [OPTIONS] URL [URL...] 

Soubor MKV, ve kterém jsem skončil, byl “ 00:22:57 “ v “ celková doba trvání „, ale skončila po 34 sekundách. Video ve formátu MP4, které jsem skončil, bylo celkem 00:00:34 s, skončilo po 34 sekundách a video a zvuk byly přehrávány zcela v pořádku / podle plánu.

Plné cmd.exe protokol je zde

Souhrnně tedy spusťte

youtube-dl --abort-on-unavailable-fragment [URL to video file] 

(volba --abort-on-unavailable-fragment může být důležitá, protože stahování přerušíte Ctrl + C ), nechte to chvíli stáhnout, pak stiskněte Ctrl + C .

Volitelné: přejmenujte [file].mkv.part soubor do [file].mkv. Konverze MKV na MP4 je pravděpodobně také volitelná.

Odpověď

Někdo vytvořil dávkový skript (pro Windows), který stáhne soubor a extrahuje požadovanou část:

@ECHO off :Input ECHO. SET url= ECHO Enter Youtube-url: SET /P url= IF "%url%" EQU "" GOTO End IF "%url: =%" NEQ "%url%" GOTO Input ECHO Enter start time (in seconds, or in hh:mm:ss[.xxx] form): SET /P start= ECHO Enter duration (in seconds, or in hh:mm:ss[.xxx] form): SET /P dur= ECHO. FOR /F "delims==" %%A IN ("youtube-dl.exe --no-warnings --get-filename "%url%"") DO SET filename=%%A FOR /F %%B IN ("youtube-dl.exe -g "%url%"") DO ( ffmpeg.exe -hide_banner -ss "%start%" -i "%%B" -c copy -t "%dur%" "%filename%" ) GOTO Input :End 

Napsat komentář

Vaše e-mailová adresa nebude zveřejněna. Vyžadované informace jsou označeny *