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
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.
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 brukeryoutube-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 tilyoutube-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
- Ja! Veldig rent og lett å huske.
- Dette fungerer ikke pålitelig, da
—postprocessor-args
brukes i flere tilfeller flere ganger. Se github.com/ytdl-org/youtube-dl/issues/26863
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 enmp4
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 foryoutube-dl.exe
. Ogffmpeg
fortalte megInvalid 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
ffmpeg -i "OUTPUT-OF-FIRST URL" -ss 00:13:00.00 -to 00:17:00.00 -c copy out.mp4
ffmpeg
laster faktisk bare ned den delen du spesifiserer.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.