Wie lade ich einen Teil des Videos mit dem Befehl youtube-dl herunter?

61

Ich benutze Ubuntu und der Befehl youtube-dl funktioniert absolut einwandfrei.

Ich möchte nur einen Teil des Videos herunterladen, der zu lang ist. Also möchte ich nur ein paar Minuten Teil des Videos herunterladen. Beispiel von 13 Minuten bis 17 Minuten.

Gibt es eine Möglichkeit, das zu tun?

user3181614
quelle

Antworten:

44

Ich glaube nicht, dass youtube-dlallein das machen wird, was du willst. Sie können es jedoch mit einem Befehlszeilenprogramm wie ffmpeg kombinieren.

Erwerben Sie zuerst die aktuelle URL mit youtube-dl:

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

Kopieren Sie die Ausgabe des Befehls und fügen Sie sie als Teil des -iParameters des nächsten Befehls ein:

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

Der -ssParameter in dieser Position gibt an, dass alle Eingaben bis zu 15 Sekunden im Video verworfen werden sollen. Die -tOption gibt an, für 10 Sekunden zu erfassen. Der Rest des Befehls teilt ihm mit, dass es als mp4 gespeichert werden soll.

ffmpeg ist ein beliebtes Tool und sollte sich in einem der gängigen Betriebssystem-Repositorys / Paketmanager befinden.

Johnnie
quelle
8
Im Grunde genommen müssen Sie das gesamte Video noch herunterladen und es selbst zuschneiden
Antony
12
Sie können die Option -to anstelle von -t verwenden, wenn Sie die Zeit zum Beenden des Video-Slice angeben möchten. ffmpeg -i "OUTPUT-OF-FIRST URL" -ss 00:13:00.00 -to 00:17:00.00 -c copy out.mp4
7.
5
@Antony ffmpeglädt nur den von Ihnen angegebenen Teil herunter.
Akaihola
17
ffmpeg $(youtube-dl -g 'https://www.youtube.com/watch?v=oHg5SJYRHA0' | sed "s/.*/-ss 00:05 -i &/") -t 01:00 -c copy out.mkv
Steve Goranson
quelle
5
Können Sie erklären, was es macht, wie es funktioniert?
user259412
3
Es ist nur eine knappe Version von @godofgrunts answer, bei der sed verwendet wird, um Zeit zu sparen, indem die URLs manuell abgerufen und in den Startzeiten kopiert / eingefügt werden (-ss 00:05). @godofgrunts hat einige zusätzliche Flags -map 0:v -map 1:a -c:v libx264 -c:a aac, die die Qualität verbessern könnten. Ich möchte auch hinzufügen youtube-dl -f bestvideo+bestaudio, um sicherzustellen, dass ich die hochwertigste Version erhalte.
Steve Goranson
ffmpeg.zeranoe.com/builds für Windows.
Wolfpack'08
16

Hinzufügen zu Johnnies Antwort:

Verwenden Sie youtube-dl -g "URL"diese Option , um Video- und Audiostreams abzurufen.

Jetzt benutzen:

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

Sie müssen die -ssOption für jeden Stream verwenden. Ich empfehle es auch etwa 30 Sekunden früher zu machen und dann eine andere -ss 30zu verwenden, um den Verlust von Schlüsselbildern zu vermeiden. Hier ist ein echtes Beispiel mit einem meiner YouTube-Videos.

Video

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

Ausgabe:

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/

Ich wollte von 43:00 auf 50:10 schneiden, also werde ich -ss 42:30beide Eingaben bearbeiten (mir ein paar Sekunden geben, um einen guten Keyframe zu erhalten) und dann -ss 30nach den Eingaben um 43:00 beginnen.

Ich werde dann verwenden map, um das Video 0:vund Audio zuzuordnen 1:a(0 bedeutet den ersten Eingang, der das Video ist, und 1 bedeutet den zweiten Eingang, der das Audio ist) und dann meine Kodierungsoptionen auswählen.

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
godofgrunts
quelle
Vielen Dank. Ich war mir nicht sicher, wie ich Sound bekommen sollte, für @ Johnnie Post. Ihr Beitrag hat darauf geantwortet.
Manny_Mar
Wow, ich wusste nicht, dass die -iFlagge von ffmpeg URLs aufnehmen kann. ordentlich
Geremia
12

Diese Feature-Anfrage ist in youtube-dl noch nicht implementiert. Siehe Ausgabe 622 und viele Duplikate davon auf Github.

ks1322
quelle
9

youtube-dl unterstützt die Übergabe von Argumenten an den zugrunde liegenden Postprozessor (getestet mit Version 2017.08.27.1):

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

Dies ist im Grunde dasselbe wie die Nachbearbeitung mit Ihnen ffmpegselbst, nachdem Sie die Datei zuerst heruntergeladen haben.

Kevin
quelle
4
Dafür muss aber noch das gesamte Video heruntergeladen und dann der gewünschte Teil geschnitten werden
Kasparov92
Ich bekomme einen unable to obtain file audio codec with ffprobeFehler. Können Sie mir bitte dabei helfen? Ich benutze CentOS 7
Hassaan
3
Beachten Sie, dass das -xFlag nur das Audio herunterlädt. Lassen Sie den Befehl aus, wenn Sie sowohl Audio als auch Video möchten. :)
grooveplex
2

Sie können vom Start bis zu einem Punkt herunterladen, ohne das Ganze herunterzuladen und zu bearbeiten. Das ist die Hälfte dessen, was diese Frage stellt:

Unterbrechen Sie den Download mit ^C

  • Ich habe das nur mit probiert mp4
  • funktioniert nicht mit getrenntem Video und Audio, Sie benötigen ein Format mit beiden. Standardmäßig erhält ytdl oft getrennte Video- und Audioinhalte und führt diese zusammen. Verwenden Sie -Fdiese Option , um die verfügbaren Formate anzuzeigen und wählen Sie ein Format mp4mit beiden Formaten aus . zB -f18oder -f22sind normalerweise da.
  • Sie müssen anhand des heruntergeladenen Prozentsatzes schätzen (was nicht linear ist; die Komprimierungsrate variiert mit der Zeit).

Ja. Es ist ein Hack .

Weitere Frage: Wenn Sie die getrennten Video- und Audioformate möchten, können Sie einen Teil von jedem separat herunterladen ( ^cwie hier) und sie dann manuell zusammenführen? Ich denke nicht, dass es für einige Formate funktionieren wird.

Hyperpallium
quelle
1

Dies beantwortet die Frage von OP nicht vollständig, aber es gibt eine Möglichkeit, einen Stream von Anfang an bis zu einer bestimmten Dauer herunterzuladen, ohne den gesamten Stream herunterladen zu müssen. Da YouTube Unterstützung für Lebensläufe bietet, können wir mithilfe des RangeHeaders Teilinhalte anfordern .

Wir holen uns zuerst die Stream-URLs:

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

Dies sollte zwei URLs ausgeben (jeweils für Video- und Audiostreams).

Senden Sie nun eine Head-Anfrage an die erste URL (die auf den Videostream verweist), um die Gesamtlänge des Inhalts dieses Streams abzurufen:

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

Nun teilen wir diese Gesamtlänge des Inhalts durch die Gesamtsekunden des Videos (das YouTube-Video hat eine Dauer von 4 Minuten und 7 Sekunden, was 247 Sekunden entspricht), um ungefähr die Inhaltslänge von 1 Sekunde zu erhalten:

64380504 / 247 ≈ 260650

Wir multiplizieren diesen Wert mit (Anzahl der Sekunden, die wir von Anfang an + 1 abrufen möchten)

(Wir fügen eine hinzu, um auch den zusätzlichen Speicherplatz zu berücksichtigen, den Metadaten am Anfang des Streams belegen.)

Um beispielsweise ungefähr die ersten 10 Sekunden abzurufen, müssen Sie die ersten 260650 * 11 = 2867150Bytes abrufen, sodass wir eine Anfrage mit dem RangeHeader stellen:

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

Dies sollte nur die ersten 10 Sekunden herunterladen. Die heruntergeladene Datei sollte wiedergegeben werden können. Am besten lassen Sie FFmpeg die falschen Metadaten korrigieren:

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

Wir können auch nur den ersten Teil des Audios (2nd-URL) auf ähnliche Weise herunterladen (die Länge des Inhalts würde sich unterscheiden, die Gesamtsekunden würden jedoch gleich bleiben).

Das Herunterladen eines mittleren Teils des Videos sollte ebenfalls auf diese Weise möglich sein, ist jedoch wahrscheinlich sehr viel kniffliger, da YouTube die Metadaten am Anfang des Streams (in den ersten Bytes) platziert, ohne dass sie in den heruntergeladenen Medien vorhanden sind Stream wird überhaupt nicht abgespielt.

BEARBEITEN: Dies funktioniert nur auf Websites mit Resume-Unterstützung, z. B. YouTube. Für andere Websites funktioniert es nicht.

Ritiek
quelle
0

Verwenden Sie den Parameter --postprocessor-args , um die Audio- / Videoausgabe an das zu bearbeitende ffmpeg (den Prozessor) zu übergeben. Daher muss ffmpeg installiert sein.

--postprocessor-args akzeptiert 3 Argumente & Werte (zum Beispiel gibt es mehr, siehe Handbuchseite von ffmpeg):

  • -ss HH: MM: SS: Startzeit
  • -zu HH: MM: SS: Endzeit
  • -t HH: MM: SS: Zeitdauer

Beispiele:

  • Starten Sie die Codierung nach 15 Sekunden und stoppen Sie nach 1 Minute und 20 Sekunden

$ youtube-dl --postprocessor-args "-ss 0: 0: 15 -to 0: 1: 20" '[video_URL]'

  • Beginnen Sie mit der Codierung nach 15 Sekunden und benötigen Sie nur die nächsten 3 Minuten und 5 Sekunden

$ youtube-dl --postprocessor-args "-ss 0: 0: 15 -t 0: 3: 5" '[video_URL]'

PS: youtube-dl lädt das gesamte Medium vor der Verarbeitung herunter und entfernt es anschließend.

NiainaLens
quelle