Jeg bruger Ubuntu, og youtube-dl -kommandoen fungerer helt fint.

Men nu vil jeg kun downloade en del af en video, der er for lang. Så jeg vil kun downloade et par minutter af den video, f.eks. fra minut 13 til minut 17.

Er der nogen måde at gøre det på?

Svar

I tror ikke youtube-dl alene vil gøre, hvad du vil. Du kan dog kombinere det med et kommandolinjeprogram som ffmpeg.

Indhent først den aktuelle URL ved hjælp af youtube -dl:

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

Kopier output fra kommandoen og indsæt den som en del af parameteren -i næste kommando:

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

Parameteren -ss i denne position angiver at kassere al input indtil 15 sekunder i video. Indstillingen -t angiver at fange i 10 sekunder. Resten af kommandoen fortæller, at den skal gemmes som en mp4.

ffmpeg er et populært værktøj og skal være i et af de populære OS-arkiver / pakkeadministratorer.

Kommentarer

  • Så i det væsentlige er du stadig nødt til at downloade hele videoen og beskære den selv
  • Du kan bruge t he -to-indstillingen i stedet for -t, hvis du vil specificere tidspunktet for afslutningen af videosnittet. ffmpeg -i "OUTPUT-OF-FIRST URL" -ss 00:13:00.00 -to 00:17:00.00 -c copy out.mp4
  • @Antony ffmpeg downloader faktisk kun den del, du angiver.
  • @ Antony Så længe du sætter parameteren -ss foran parameteren -i, begynder den at downloade fra det tidspunkt, du angav med -ss. Men hvis du placerer -ss efter -i-parameteren, henter ffmpeg lige fra begyndelsen af videoen og begynder at kode, hvor -ss angiver. Se min redigering af Johnnie ‘ s svar for mere info.
  • ved hjælp af linket leveret af youtube-dl med -g mulighed returnerer altid 403 forbudt for mig. Brug af youtube-dl alene til at downloade videoen fungerer altid som en charme.

Svar

Tilføjelse til Johnnies svar:

Brug youtube-dl --youtube-skip-dash-manifest -g "URL" for at hente video- og lydstrømmene.

Brug nu:

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 skal bruge indstillingen -ss til hver stream. Jeg anbefaler også at gøre det ca. 30 sekunder tidligere og derefter bruge en anden -ss 30 for at undgå at miste nogen nøglerammer. Her er et rigtigt eksempel ved hjælp af en af mine youtube-videoer.

Video

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

Output:

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 klippe fra 43:00 til 50:10, så jeg vil gøre -ss 42:30 (giver mig et par sekunder til at fange en god keyframe) på begge indgange, og lav derefter en -ss 30 efter indgangene for at starte kl. 43:00.

I “ll brug derefter map til at kortlægge videoen 0:v og lyd 1:a (0 betyder første input, hvilket er videoen og 1 betyder det andet input, som er lyden), og vælg derefter mine kodningsindstillinger.

 # 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 til Jakub Vrána for --youtube-skip-dash-manifest løsning.

Kommentarer

  • Tak. Jeg var ikke sikker på, hvordan jeg kunne få lyd til @Johnnie-indlæg. Dit indlæg besvarede det.
  • Hvordan adskiller det sig fer fra at bruge --postprocessor-args direkte i youtube-dl?
  • @daGo – Jeg tror youtube-dl --postprocessor-args vil downloade hele videoen og rediger det derefter ned til det valgte interval, mens dette svar bruger youtube-dl bare for at få nogle specielle webadresser. ffmpeg bruger derefter disse webadresser til kun at downloade det krævede interval. Så hvis du vil udtrække 2 minutter fra en 2 timers forelæsningsvideo, vil dette svar spare dig for en masse download.
  • Dette fungerer med de fleste YT-videoer, men jeg prøver dette med en 9 timers video, der blev tidligere streamet live (og nu afsluttet), og jeg får ” Ugyldige data fundet ved behandling af input “. Hovedforskellen er, at output fra youtube-dl -g er forskelligt. Med de fleste videoer har den strukturen. "https://r3---sn-mv-cvne.googlevideo.com/videoplayback/id/8..." men for denne video har den strukturen. "https://manifest.googlevideo.com/api/manifest/dash/expire/15956..." (afkortet til plads). Ideer til, hvordan man får dette til at fungere?
  • @LeftoverSalad Fundet 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 URLen og -ss, -t gange for at bruge denne kommando. Det opretter argumenterne ved hjælp af både video- og lyd-URLer, der ligner dette svar af @godofgrunts.Ingen citater bruges til $(), fordi dette giver to adskilte argumenter for ffmpeg.

Kommentarer

  • Kunne du forklare, hvad det gør, hvordan det fungerer?
  • Det ‘ er bare en mere kortfattet version af @ godofgrunts svarer ved hjælp af sed for at spare tid manuelt at gribe URLerne og kopiere / indsætte i starttiderne (-ss 00:05). @godofgrunts har nogle ekstra flag -map 0:v -map 1:a -c:v libx264 -c:a aac, der muligvis forbedrer kvaliteten. Jeg kan også godt lide at tilføje youtube-dl -f bestvideo+bestaudio for at være sikker på, at jeg ‘ får den højeste kvalitetsversion.
  • ffmpeg.zeranoe.com/builds til Windows.
  • ” ekstra flag ” beskæftiger sig med de to streams (video og lyd), som jeg tror, du håndterer forkert – IIUC, de har intet at gøre med at forbedre kvaliteten (godt, at have lyd er sandsynligvis et tegn på forbedret kvalitet :-)) svar af @godofgrunts nedenfor ser ud til at være korrekt.

Svar

youtube-dl understøtter videregivelse af argumenter til den underliggende postprocessor (testet med version 2017.08.27.1):

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

Dette er dybest set det samme som at udføre efterbehandlingen med ffmpeg selv efter først at have downloadet filen.

Kommentarer

  • men det skal stadig gøres wnload hele videoen, og klipp derefter den ønskede del
  • Jeg får unable to obtain file audio codec with ffprobe fejl. Kan du venligst hjælpe mig med det. Jeg bruger CentOS 7
  • Bemærk, at -x flag downloader kun lyden. Udelad det fra kommandoen, hvis du vil have både lyd og video. 🙂
  • Dette fungerer ikke pålideligt, da —postprocessor-args anvendes i flere tilfælde flere gange. Se github.com/ytdl-org/youtube-dl/issues/26863

Svar

Denne funktionsanmodning er endnu ikke implementeret i youtube-dl. Se # 622 udgave og mange dubletter af det på github.

Svar

Brug --postprocessor-args -parameteren til at overføre lyd- / videoudgangen til ffmpeg, der skal redigeres (processoren). Postprocessoren skal være ffmpeg installeret.

--postprocessor-args tager 3 argumenter & værdier (for eksempel er der mere, se manuel side for ffmpeg):

  • -ss HH:MM:SS: starttidspunkt at tage
  • -to HH:MM:SS: sluttid
  • -t HH:MM:SS: tid længde at tage

Eksempler:

  • Start kodning ved 15 sekunder og stop ved 1 minut og 20 sekunder
    $ youtube-dl --postprocessor-args "-ss 0:0:15 -to 0:1:20" "[video_URL]" 
  • Start kodning ved 15 sekunder og tag kun de næste 3 minutter og 5 sekunder
    $ youtube-dl --postprocessor-args "-ss 0:0:15 -t 0:3:5" "[video_URL]" 

PS: youtube-dl downloader hele mediet, før det behandles, og fjerner det efter.

Kommentarer

Svar

Dette svarer ikke helt OPs spørgsmål, men der er mulighed for at downloade en stream fra begyndelsen til en bestemt varighed uden at skulle downloade den komplette stream. Da YouTube yder support til genoptagelse, kan vi anmode om delvis indhold ved hjælp af Range header.

Vi henter først stream-webadresserne:

$ 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 udsende to URLer (hver til video- og lydstrømme).

Send nu en headanmodning til den første URL (som linker til videostrømmen) til hent den samlede indholdslængde for denne stream:

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

Nu deler vi denne samlede indholdslængde med samlede sekunder i videoen (YouTube-videoen har en varighed på 4 min og 7 sekunder, hvilket er 247 sekunder.) for at få indholdslængden på ca. 1 sekund:

64380504 / 247 ≈ 260650

Vi ganger denne værdi med (antal sekunder, vi vil hente fra begyndelsen + 1)

(vi tilføjer en til også groft at tage højde for ekstra plads taget af metadata, der er placeret i begyndelsen af strømmen)

For eksempel for at hente ca. de første 10 sekunder skal du hente den første 260650 * 11 = 2867150 bytes, så vi fremsætter en anmodning med Range header:

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

Dette skal kun downloade den første 10 sekunderDen downloadede fil skal være i stand til at spille, men bedst lade FFmpeg rette de forkerte metadata:

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

Vi kan også kun downloade den indledende del af lyden (2.- URL) på en lignende måde (indholdslængden vil variere, men de samlede sekunder forbliver den samme).

Download af en hvilken som helst midterdel fra videoen bør også være mulig på denne måde, men går sandsynligvis meget vanskeligere, fordi YouTube placerer metadataene i begyndelsen af streamen (i de første par byte) og uden at den er til stede i det downloadede medie, vil streamen slet ikke spille.

EDIT: Dette fungerer kun på websteder med CV-understøttelse, siger f.eks. YouTube. Det fungerer ikke for andre websteder.

Svar

Du kan downloade fra starten op til et punkt uden downloade det hele og redigere. Det er halvdelen af, hvad dette spørgsmål stiller:

afbryde download med ^C

  • Jeg har kun prøvet dette med mp4
  • vandt ikke arbejde med separat video og lyd har du brug for et format med begge. Som standard får ytdl ofte separat video og lyd og fletter dem derefter. Brug -F for at se de tilgængelige formater, og vælg en mp4 der har begge dele. f.eks. -f18 eller -f22 er der normalt.
  • dig “Jeg bliver nødt til at estimere ud fra den downloadede procentdel (som ikke er lineær; kompressionshastigheden varierer over tid).

Ja. Det” er hack .

Yderligere spørgsmål: Hvis du vil have de separate video- og lydformater, kan du downloade en del af hver separat (ved hjælp af ^c som her) og derefter flette dem manuelt? Jeg tror ikke, det fungerer i nogle formater.

Svar

Jeg lavede et script til implementering af @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 uploadede den også til Gitlab “s uddrag

Svar

Jeg lavede en kolbe-app, der kan til det, du vil have. Jeg ved, at indlægget er gammelt, men problemet vedvarer.

Du kan finde det her

Det kan analyseres tekst til YouTube-links. Du leverer f.eks .:

YouTube.com/blahblah start-1:20 

Dette downloader en video fra 0-1: 22 (der kan opstå lidt forskelle på grund af keyframes). Det kan også downloade hele videoer, bare i det tilfælde udelade tidsintervallet.

Svar

For alle de dovne fyre, der ikke “t ønsker at bruge mere end en kommando, gø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 nu kombinere indstillingerne for youtube-dl.exe og ffmpeg som at vælge format, fjerne video og klippe lydfil osv. (måske klippe videofilen og end konvertere til en lydfil, uanset hvad der sker 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

  • din kommando fungerer ikke på GNU / Linux: vi bruger youtube-dl i stedet for youtube-dl.exe. Og ffmpeg fortalte mig Invalid duration specification for ss: 00.00.10.00, det skulle være -ss 00:00:30.00 med kolon i stedet for perioder bortset fra den sidste.
  • @ ewin-goisot Jeg er ked af, dette skete, fordi jeg ikke ‘ t kopierede hele kommandoen efter tes ting det. Nu skal det fungere. problemet var tidsdefinitionen. det skal være 00: 00: 00.00 2 gange dobbeltpoint end kun 1 point. som hh: mm: ss.ms
  • med 00:00:00.0, det fungerer bedre, jeg kan downloade en del af videoen. Jeg har stadig et problem (med din kommando og de fleste andre): det downloader 5 eller 10 sekunder for meget. Løsningen gives på @godofgrunts ‘ s svar: -ss 42:30 -i "$video_url" -ss 42:30 -i "$audio_url" -map 0:v -map 1:a -ss 30 startende 30 sekunder før delens start og tilføjelse af en -ss 30 i slutningen. Så jeg er nødt til at bruge -ss flere gange på den samme kommando. Er der en måde at gøre det samme med --external-downloader-args?
  • ah undskyld, jeg er ikke så fortrolig med at blande forskellige strømme. men hvis du bare vil tage det bedste lyd- og videomateriale af den samme video, kan du i stedet gøre det med youtube-dl

Svar

For at tilføje til @hyperpallium svar: OP nævnte ikke den video, han downloadede, skulle være fra YouTube.

YouTube er latterligt begrænsende med deres videoer, de delte lyd- og videostreams i forskellige filer, og de sporer dig / sælger dine data; derfor kunne man have problemer med metoden til at downloade den delvis og derefter ramme Ctrl + C .

Med youtube-dl version 2020.11.17 i Microsoft Windows version 10.0.17134.1304 downloadede jeg en del af 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 ” samlet varighed “, men det sluttede efter 34 sekunder. MP4-videoen, jeg endte med, var 00:00:34 sekunder i samlet varighed, sluttede efter 34 sekunder, og videoen og lyden blev spillet helt fint / som beregnet.

Fuld cmd.exe log er her

Så i resumé kør

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

(option --abort-on-unavailable-fragment kan være vigtigt, da du ender med at afbryde download med Ctrl + C ), lad det downloade lidt, og tryk derefter på Ctrl + C .

Valgfrit: omdøb [file].mkv.part fil til [file].mkv. At konvertere MKV til MP4 er sandsynligvis også valgfrit.

Svar

Nogen lavede et batch script (til Windows), der downloader filen og udtrækker den ønskede 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 

Skriv et svar

Din e-mailadresse vil ikke blive publiceret. Krævede felter er markeret med *