Jeg bruker Ubuntu, og youtube-dl -kommandoen fungerer helt greit.

Nå vil jeg imidlertid bare laste ned en del av en video som er for lang. Så jeg vil bare laste ned noen få minutter av den videoen, f.eks. fra minutt 13 til minutt 17.

Er det noen måte å gjøre det?

Svar

I tror ikke youtube-dl alene vil gjøre det du vil. Du kan imidlertid kombinere det med et kommandolinjeprogram som ffmpeg.

Først skaff deg den faktiske URL-en ved hjelp av youtube -dl:

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

Kopier utdataene fra kommandoen og lim den inn som en del av -i -parameteren til neste kommando:

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

-ss -parameteren i denne posisjonen angir å forkaste all inngang inntil 15 sekunder i video. Alternativet -t angir å fange i 10 sekunder. Resten av kommandoen ber den lagre som en mp4.

ffmpeg er et populært verktøy og bør være i noen av de populære OS-arkivene / pakkeforvalterne.

Kommentarer

  • Så egentlig må du fortsatt laste ned hele videoen og beskjære den selv
  • Du kan bruke t he -to-alternativet i stedet for -t hvis du vil spesifisere tidspunktet for avslutning av videosnittet. ffmpeg -i "OUTPUT-OF-FIRST URL" -ss 00:13:00.00 -to 00:17:00.00 -c copy out.mp4
  • @Antony ffmpeg laster faktisk bare ned den delen du spesifiserer.
  • @ Antony Så lenge du setter parameteren -ss foran parameteren -i, vil den laste ned fra det tidspunktet du spesifiserte med -ss. Imidlertid, hvis du plasserer -ss etter parameteren -i, vil ffmpeg laste ned helt fra begynnelsen av videoen og starte kodingen der -ss spesifiserer. Se min redigering av Johnnie ‘ sitt svar for mer info.
  • ved å bruke lenken gitt av youtube-dl med -g alternativet vil alltid returnere 403 forbudt for meg. Å bruke youtube-dl alene for å laste ned videoen, vil alltid fungere som en sjarm.

Svar

Legger til Johnnies svar:

Bruk youtube-dl --youtube-skip-dash-manifest -g "URL" for å få video- og lydstrømmer.

Bruk nå:

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 

Du må bruke alternativet -ss for hver strøm. Jeg anbefaler også å gjøre det omtrent 30 sekunder tidligere, og deretter bruke en annen -ss 30 for å unngå å miste noen nøkkelrammer. Her er et virkelig eksempel ved hjelp av en av youtube-videoene mine.

Video

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

Utgang:

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/ 

Jeg ville kutte fra 43:00 til 50:10 så jeg skal gjøre -ss 42:30 (gir meg noen sekunder til å fange en god nøkkelramme) på begge inngangene, og gjør deretter en -ss 30 etter inngangene for å starte 43:00.

Jeg bruker deretter map for å kartlegge videoen 0:v og lyd 1:a (0 betyr første inngang, som er videoen og 1 betyr den andre inngangen, som er lyd), og velg deretter kodingsalternativene mine.

 # 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  

Takk til Jakub Vrána for --youtube-skip-dash-manifest løsning.

Kommentarer

  • Takk. Jeg var ikke sikker på hvordan jeg skulle få lyd for @Johnnie-innlegget. Innlegget ditt svarte på det.
  • Hvordan er det forskjellig fer fra å bruke --postprocessor-args direkte i youtube-dl?
  • @daGo – Jeg tror youtube-dl --postprocessor-args vil laste ned hele videoen og rediger det deretter ned til det valgte området, mens dette svaret bruker youtube-dl bare for å få noen spesielle nettadresser. ffmpeg bruker deretter nettadressene til å laste ned bare ønsket område. Så hvis du vil trekke ut 2 minutter fra en 2-timers forelesningsvideo, vil dette svaret spare deg for mye nedlasting.
  • Dette fungerer med de fleste YT-videoer, men jeg prøver dette med en 9-timers video som ble tidligere streamet live (og nå fullført) og jeg får » Ugyldige data funnet når jeg behandler input «. Hovedforskjellen er at utdataene til youtube-dl -g er forskjellige. Med de fleste videoer har den strukturen. "https://r3---sn-mv-cvne.googlevideo.com/videoplayback/id/8..." men for denne videoen har den strukturen. "https://manifest.googlevideo.com/api/manifest/dash/expire/15956..." (avkortet for mellomrom). Ideer for hvordan du kan få dette til å fungere?
  • @LeftoverSalad Fant en løsning .

Svar

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

Rediger URL og -ss, -t ganger for å bruke denne kommandoen. Den oppretter argumentene ved å bruke både video- og lyd-URL-er, som ligner på dette svaret av @godofgrunts.Ingen anførselstegn brukes til $() fordi dette gir to separate argumenter for ffmpeg.

Kommentarer

  • Kan du forklare, hva det gjør, hvordan det fungerer?
  • Det ‘ er bare en mer kortfattet versjon av @ Godofgrunts svarer ved å bruke sed for å spare tid manuelt å fange URL-ene og kopiere / lime inn i starttidene (-ss 00:05). @godofgrunts har noen ekstra flagg -map 0:v -map 1:a -c:v libx264 -c:a aac som kan forbedre kvaliteten. Jeg liker også å legge til youtube-dl -f bestvideo+bestaudio for å være sikker på at jeg ‘ får den høyeste kvalitetsversjonen.
  • ffmpeg.zeranoe.com/builds for Windows.
  • » ekstra flagg » tar for seg de to strømmer (video og lyd) som jeg tror du mishandler – IIUC de har ingenting å gjøre med å forbedre kvaliteten (vel, å ha lyd er sannsynligvis et tegn på forbedret kvalitet :-)) svar av @godofgrunts nedenfor ser ut til å være riktig.

Svar

youtube-dl støtter overføring av argumenter til den underliggende postprosessoren (testet med versjon 2017.08.27.1):

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

Dette er i utgangspunktet det samme som å gjøre etterbehandlingen med ffmpeg selv etter å ha lastet ned filen først.

Kommentarer

  • men dette vil fortsatt kreve å gjøre last ned hele videoen, og kutt deretter ønsket del
  • Jeg får unable to obtain file audio codec with ffprobe feil. Kan du hjelpe meg med det? Jeg bruker CentOS 7
  • Merk at -x -flagget laster bare ned lyden. Utelat det fra kommandoen hvis du vil ha både lyd og video. 🙂
  • Dette fungerer ikke pålitelig, da —postprocessor-args brukes i flere tilfeller flere ganger. Se github.com/ytdl-org/youtube-dl/issues/26863

Svar

Denne funksjonsforespørselen er ennå ikke implementert i youtube-dl. Se # 622 utgave og mange duplikater av det på github.

Svar

Bruk --postprocessor-args -parameteren for å overføre lyd- / videoutgangen til ffmpeg som skal redigeres (prosessoren). Postprosessoren må være ffmpeg installert.

--postprocessor-args tar 3 argumenter & verdier (for eksempel, det er mer, sjekk manuell side for ffmpeg):

  • -ss HH:MM:SS: starttid å ta
  • -to HH:MM:SS: sluttid
  • -t HH:MM:SS: tid lengde å ta

Eksempler:

  • Start kodingen på 15 sekunder og stopp på 1 minutt og 20 sekunder
    $ youtube-dl --postprocessor-args "-ss 0:0:15 -to 0:1:20" "[video_URL]" 
  • Start kodingen på 15 sekunder og ta bare de neste 3 minuttene og 5 sekundene
    $ youtube-dl --postprocessor-args "-ss 0:0:15 -t 0:3:5" "[video_URL]" 

PS: youtube-dl laster ned hele mediet før det behandles, og fjerner det etter.

Kommentarer

Svar

Dette svarer ikke helt på OPs spørsmål, men det er en måte å laste ned en strøm fra begynnelse til en bestemt varighet uten å måtte laste ned hele strømmen. Siden YouTube tilbyr CV-støtte, kan vi be om delvis innhold ved hjelp av Range -overskriften.

Vi henter først stream-nettadressene:

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

Dette skal sende ut to URL-er (hver for video- og lydstrømmer).

Send nå en headforespørsel til den første URL-en (som lenker til videostrømmen) til hent den totale innholdslengden for denne strømmen:

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

Nå deler vi denne totale innholdslengden med totalt sekunder i videoen (YouTube-videoen har en varighet på 4 min og 7 sekunder som er 247 sekunder.) for å få innholdslengden på 1 sekund:

64380504 / 247 ≈ 260650

Vi multipliserer denne verdien med (antall sekunder vi ønsker å hente fra begynnelsen + 1)

(vi legger til en for også å grovt ta hensyn til ekstra plass tatt av metadata som plasseres i begynnelsen av strømmen)

For eksempel for å hente omtrent de første 10 sekundene, må du hente de første 260650 * 11 = 2867150 byte, så vi gjør en forespørsel med Range header:

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

Dette skal bare laste ned den første 10 sek.Den nedlastede filen skal kunne spilles av, men best kan FFmpeg fikse feil metadata:

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

Vi kan også laste ned bare den første delen av lyden (2.- URL) på en lignende måte (innholdslengden vil variere, men det totale antallet sekunder vil forbli den samme).

Nedlasting av en hvilken som helst midtdel fra videoen burde også være mulig på denne måten, men det går sannsynligvis mye vanskeligere fordi YouTube plasserer metadataene i begynnelsen av strømmen (i de første byte), og uten at den er tilstede i det nedlastede mediet, vil ikke strømmen spille i det hele tatt.

EDIT: Dette fungerer bare på nettsteder med CV-støtte, si YouTube. Det fungerer ikke for andre nettsteder.

Svar

Du kan laste ned fra start til et punkt uten laste ned hele greia og redigere. Det er halvparten av det dette spørsmålet stiller:

avbryt nedlastingen med ^C

  • Jeg har bare prøvd dette med mp4
  • vil ikke jobbe med egen video og lyd, trenger du et format med begge. Som standard får ytdl ofte separat video og lyd, og slår dem sammen. Bruk -F for å se de tilgjengelige formatene, og velg en mp4 som har begge deler. f.eks. -f18 eller -f22 er vanligvis der.
  • deg «Jeg må estimere fra nedlastet prosentandel (som ikke er lineær; kompresjonshastigheten varierer over tid).

Ja. Det» sa hack .

Ytterligere spørsmål: Hvis du vil ha de separate video- og lydformatene, kan du laste ned deler av hver for seg (ved hjelp av ^c som her), og deretter slå dem sammen manuelt? Jeg tror ikke det vil fungere i noen formater.

Svar

Jeg laget et skript som implementerer @godofgrunts svar her

 #!/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  

Jeg lastet den også opp til Gitlab s utdrag

Svar

Jeg lagde en kolbe-app som kan til det du vil. Jeg vet at innlegget er gammelt, men problemet vedvarer.

Du finner det her

Det kan analyseres tekst for YouTube-lenker også. Du leverer bare for eksempel:

YouTube.com/blahblah start-1:20 

Dette vil laste ned en video fra 0-1: 22 (litt forskjeller kan oppstå på grunn av nøkkelbilder). Den kan også laste ned hele videoer, bare utelate tidsintervallet i så fall.

Svar

For alle late karene som ikke «t vil bruke mer enn en kommando, gjør følgende:

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" 

Du kan nå kombinere alternativene for youtube-dl.exe og ffmpeg som å velge format, fjerne video og kutte lydfilen osv. (kanskje kutte videofilen og enn å konvertere til en lydfil, uansett hva som skjer først)

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" 

Kommentarer

  • kommandoen din fungerer ikke på GNU / Linux: vi bruker youtube-dl i stedet for youtube-dl.exe. Og ffmpeg fortalte meg Invalid duration specification for ss: 00.00.10.00, det skal være -ss 00:00:30.00 med kolon i stedet for perioder bortsett fra den siste.
  • @ ewin-goisot Jeg beklager, dette skjedde fordi jeg ikke ‘ t kopierte hele kommandoen etter tes ting det. Nå skal det fungere. problemet var tidsdefinisjonen. det må være 00: 00: 00.00 2 ganger dobbeltpoeng, enn bare 1 poeng. som hh: mm: ss.ms
  • med 00:00:00.0, det fungerer bedre, jeg kan laste ned en del av videoen. Jeg har fortsatt et problem (med kommandoen din og de fleste andre): den laster ned 5 eller 10 sekunder for mye. Løsningen er gitt på @godofgrunts ‘ s svar: -ss 42:30 -i "$video_url" -ss 42:30 -i "$audio_url" -map 0:v -map 1:a -ss 30 starter 30 sekunder før delen starter og legger til en -ss 30 på slutten. Så jeg må bruke -ss flere ganger på samme kommando. Er det en måte å gjøre det samme med --external-downloader-args?
  • ah, beklager, jeg er ikke så kjent med å blande forskjellige strømmer. men hvis du vil ta bare det beste lyd- og videomaterialet til den samme videoen, kan du i stedet gjøre det med youtube-dl

Svar

For å legge til i @hyperpallium svar: OP nevnte ikke videoen han lastet ned måtte være fra YouTube.

YouTube er latterlig begrensende med videoene deres, de delte lyd- og videostrømmer i forskjellige filer, og de sporer deg / selger dataene dine; Derfor kan man ha vanskeligheter med metoden for å laste ned den delvis og deretter trykke Ctrl + C .

Med youtube-dl versjon 2020.11.17 i Microsoft Windows versjon 10.0.17134.1304 lastet jeg ned en del av en video fra archive.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...] 

MKV-filen jeg endte med var » 00:22:57 » i » total varighet «, men det endte etter 34 sekunder. MP4-videoen jeg endte opp med var 00:00:34 sekunder i total varighet, endte etter 34 sekunder, og videoen og lyden ble spilt helt bra / som tiltenkt.

Full cmd.exe loggen er her

Så i sammendrag, kjør

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

(alternativ --abort-on-unavailable-fragment kan være viktig når du ender med å avbryte nedlastingen med Ctrl + C ), la den laste ned litt, og trykk deretter på Ctrl + C .

Valgfritt: Gi nytt navn til [file].mkv.part fil til [file].mkv. Det er sannsynligvis også valgfritt å konvertere MKV til MP4.

Svar

Noen lagde et batch script (for Windows) som laster ned filen og trekker ut ønsket del:

@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 

Legg igjen en kommentar

Din e-postadresse vil ikke bli publisert. Obligatoriske felt er merket med *