Estoy usando Ubuntu y el comando youtube-dl funciona absolutamente bien.

Sin embargo, ahora quiero descargar solo una parte de un video que es demasiado largo. Así que quiero descargar solo unos minutos de ese video, p. Ej. del minuto 13 al minuto 17.

¿Hay alguna forma de hacerlo?

Responder

I no crea que youtube-dl solo hará lo que usted quiere. Sin embargo, puede combinarlo con una utilidad de línea de comandos como ffmpeg.

Primero, adquiera la URL real usando youtube -dl:

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

Copie el resultado del comando y péguelo como parte del parámetro -i del siguiente comando:

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

El parámetro -ss en esta posición indica descartar todas las entradas hasta 15 segundos en el video. La opción -t indica capturar durante 10 segundos. El resto del comando le dice que se almacene como mp4.

ffmpeg es una herramienta popular y debería estar en cualquiera de los repositorios / administradores de paquetes de SO más populares.

Comentarios

  • Así que, esencialmente, todavía tienes que descargar el video completo y recortarlo tú mismo
  • Puede utilizar t he -to opción en lugar de -t si desea especificar el tiempo para finalizar el segmento de video. ffmpeg -i "OUTPUT-OF-FIRST URL" -ss 00:13:00.00 -to 00:17:00.00 -c copy out.mp4
  • @Antony ffmpeg en realidad solo descargará la parte que especifique.
  • @ Antony Siempre que coloque el parámetro -ss antes del parámetro -i, comenzará a descargarse desde el momento que especificó con -ss. Sin embargo, si coloca -ss después del parámetro -i, ffmpeg se descargará desde el principio del video y comenzará a codificar desde donde -ss especifica. Consulte mi edición de la respuesta de Johnnie ‘ para obtener más información.
  • utilizando el vínculo proporcionado por youtube-dl con el -g siempre devolverá 403 prohibido para mí. Usar youtube-dl solo para descargar el video, siempre funcionará como un encanto.

Responder

Agregar a Respuesta de Johnnie:

Use youtube-dl --youtube-skip-dash-manifest -g "URL" para obtener las transmisiones de video y audio.

Ahora use:

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 

Deberá utilizar la opción -ss para cada transmisión. También recomiendo hacerlo unos 30 segundos antes y luego usar otro -ss 30 para no perder ningún fotograma clave. Aquí hay un ejemplo real usando uno de mis videos de YouTube.

Video

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

Salida:

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/ 

Quería cortar de 43:00 a 50:10, así que «voy a hacer -ss 42:30 (dándome unos segundos para captar un buen fotograma clave) en ambas entradas y luego haz un -ss 30 después de las entradas para comenzar a las 43:00.

Luego usaré map para mapear el video 0:v y el audio 1:a (0 significa primera entrada, que es el vídeo y 1 significa la segunda entrada, que es el audio) y luego elijo mis opciones de codificació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  

Crédito a Jakub Vrána por el --youtube-skip-dash-manifest solución.

Comentarios

  • Gracias. No estaba seguro de cómo obtener sonido, por la publicación de @Johnnie. Tu publicación respondió.
  • ¿En qué se diferencia? ¿Por qué no usar --postprocessor-args directamente en youtube-dl?
  • @daGo – Creo que youtube-dl --postprocessor-args descargará el video completo y luego edítelo hasta el rango seleccionado, mientras que esta respuesta usa youtube-dl solo para obtener algunas URL especiales. ffmpeg luego usa esas URL para descargar solo el rango requerido. Entonces, si desea extraer 2 minutos de un video de una conferencia de 2 horas, esta respuesta le ahorrará muchas descargas.
  • Esto funciona con la mayoría de los videos de YouTube, pero estoy intentando esto con un video de 9 horas que anteriormente se transmitió en vivo (y ahora se completó) y obtengo » Se encontraron datos no válidos al procesar la entrada «. La principal diferencia es que la salida de youtube-dl -g es diferente. Con la mayoría de los videos tiene la estructura. "https://r3---sn-mv-cvne.googlevideo.com/videoplayback/id/8..." pero para este video tiene la estructura. "https://manifest.googlevideo.com/api/manifest/dash/expire/15956..." (truncado para el espacio). ¿Ideas sobre cómo hacer que esto funcione?
  • @LeftoverSalad Encontró una solución .

Respuesta

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

Edite la URL y -ss, -t veces para usar este comando. Crea los argumentos, usando URL de video y audio, similar a esta respuesta de @godofgrunts.No se utilizan comillas para $() porque esto produce dos argumentos separados para ffmpeg.

Comentarios

  • ¿Podría explicar qué hace y cómo funciona?
  • Es ‘ es solo una versión más concisa de @ godofgrunts responde, usando sed para ahorrar algo de tiempo capturando manualmente las URL y copiando / pegando en las horas de inicio (-ss 00:05). @godofgrunts tiene algunos indicadores adicionales -map 0:v -map 1:a -c:v libx264 -c:a aac que pueden mejorar la calidad. También me gusta agregar youtube-dl -f bestvideo+bestaudio para asegurarme de ‘ obteniendo la versión de mayor calidad.
  • ffmpeg.zeranoe.com/builds para Windows.
  • Las » indicadores adicionales » trata con las dos transmisiones (video y audio) que creo que está manejando mal – IIUC no tienen nada que ver con mejorar la calidad (bueno, tener sonido es probablemente una marca de calidad mejorada :-)) respuesta de @godofgrunts a continuación parece ser correcta.

Respuesta

youtube-dl admite el paso de argumentos al postprocesador subyacente (probado con la versión 2017.08.27.1):

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

Esto es básicamente lo mismo que hacer el posprocesamiento con ffmpeg después de descargar el archivo primero.

Comentarios

  • pero esto aún requerirá hacerlo wncargue el video completo, luego corte la parte deseada
  • Recibo el error unable to obtain file audio codec with ffprobe. ¿Puedes ayudarme con eso? Estoy usando CentOS 7
  • Tenga en cuenta que el indicador -x descarga solo el audio. Omitirlo del comando si desea tanto audio como video. 🙂
  • Esto no funcionará de manera confiable, ya que —postprocessor-args se aplica varias veces en algunos casos. Ver github.com/ytdl-org/youtube-dl/issues/26863

Respuesta

Esta solicitud de función aún no está implementada en youtube-dl. Consulte el número 622 y muchos duplicados en github.

Respuesta

Utilice el parámetro --postprocessor-args para pasar la salida de audio / video a ffmpeg para editarla (el procesador). El postprocesador debe estar ffmpeg instalado.

--postprocessor-args toma 3 argumentos & valores (por ejemplo, hay más, consulte la página del manual de ffmpeg):

  • -ss HH:MM:SS: hora de inicio para tomar
  • -to HH:MM:SS: hora de finalización
  • -t HH:MM:SS: hora tiempo necesario

Ejemplos:

  • Comience a codificar a los 15 segundos y deténgase en 1 minuto 20 segundos
    $ youtube-dl --postprocessor-args "-ss 0:0:15 -to 0:1:20" "[video_URL]" 
  • Comience a codificar a los 15 segundos y solo tome los siguientes 3 minutos 5 segundos
    $ youtube-dl --postprocessor-args "-ss 0:0:15 -t 0:3:5" "[video_URL]" 

PS: youtube-dl descargará todos los medios antes de procesarlos y los eliminará después.

Comentarios

Respuesta

Esto no responde completamente a la pregunta de OP, pero hay una forma de descargar una transmisión desde el principio hasta una duración específica sin tener que descargar la transmisión completa. Dado que YouTube brinda soporte para currículum vitae, podríamos solicitar contenido parcial usando el encabezado Range.

Primero buscamos las URL de transmisión:

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

Esto debería generar dos URL (cada una para transmisiones de video y audio).

Ahora envíe una solicitud de encabezado a la primera URL (que enlaza con la transmisión de video) a buscar la longitud total del contenido de esta transmisión:

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

Ahora, dividimos la longitud total del contenido por el total de segundos en el video (el video de YouTube tiene una duración de 4 min y 7 segundos, que son 247 segundos) para obtener aproximadamente la duración del contenido de 1 segundo:

64380504 / 247 ≈ 260650

Multiplicamos este valor con (número de segundos que queremos recuperar desde el principio + 1)

(agregamos uno para tener en cuenta aproximadamente el espacio adicional que ocupan los metadatos que se colocan al comienzo de la transmisión)

Por ejemplo, para obtener aproximadamente los primeros 10 segundos, deberá obtener los primeros 260650 * 11 = 2867150 bytes, por lo que hacemos una solicitud con el encabezado Range:

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

Esto solo debería descargar el primero 10 segundosEl archivo descargado debería poder reproducirse, pero es mejor dejar que FFmpeg corrija los metadatos incorrectos:

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

También podemos descargar solo la parte inicial del audio (2nd- URL) de una manera similar (la longitud del contenido sería diferente, pero el total de segundos permanecería igual).

La descarga de cualquier parte intermedia del video también debería ser posible de esta manera, pero probablemente sea mucho más complicado porque YouTube coloca los metadatos al principio de la transmisión (en los primeros bytes) y sin que estén presentes en los medios descargados, la transmisión no se reproducirá en absoluto.

EDITAR: Esto solo funcionará en sitios web con soporte para currículums, digamos YouTube. No funcionará para otros sitios web.

Respuesta

Puedes descargar desde el inicio hasta un punto sin descargando todo y editando. Eso es la mitad de lo que pregunta esta pregunta:

interrumpa la descarga con ^C

  • Solo he probado esto con mp4
  • no funciona con un video separado y audio, necesita un formato con ambos. De forma predeterminada, ytdl a menudo obtiene video y audio separados, luego los combina. Use -F para ver los formatos disponibles y elija un mp4 que tiene ambos. Por ejemplo, -f18 o -f22 suelen estar allí.
  • «Tendré que estimar a partir del porcentaje descargado (que no es lineal; la tasa de compresión varía con el tiempo).

Sí. Es un truco .

Pregunta adicional: si desea los formatos de audio y video separados, ¿podría descargar parte de cada uno por separado (usando ^c como aquí) y luego fusionarlos manualmente? No creo que funcione para algunos formatos.

Respuesta

Hice un script implementando @godofgrunts answer aquí

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

También lo cargué en fragmentos de código de Gitlab «

Respuesta

Hice una aplicación de matraz que puede hacer lo que quieras. Sé que la publicación es antigua, pero el problema persiste.

Puede encontrarla aquí

Puede analizar texto para enlaces de YouTube también. Simplemente proporcione, por ejemplo:

YouTube.com/blahblah start-1:20 

Esto descargará un video de 0-1: 22 (pueden surgir pequeñas diferencias debido a fotogramas clave). También puede descargar videos completos, simplemente omita el intervalo de tiempo en ese caso.

Respuesta

Para todos los perezosos que no «No desea utilizar más de un comando, haga lo siguiente:

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" 

Ahora puede combinar las opciones de youtube-dl.exe y ffmpeg les gusta elegir el formato, eliminar el video y cortar el archivo de audio, etc. (tal vez cortar el archivo de video y luego convertirlo en un archivo de audio, pase lo que pase primero)

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" 

Comentarios

  • su comando no funciona en GNU / Linux: usamos youtube-dl en lugar de youtube-dl.exe. Y ffmpeg me dijo Invalid duration specification for ss: 00.00.10.00, debe ser -ss 00:00:30.00 con dos puntos en lugar de puntos, excepto el último.
  • @ ewin-goisot Lo siento, esto sucedió porque no ‘ t copiar y pegar todo el comando después de tes tinglo. Ahora debería funcionar. el problema era la definición del tiempo. tiene que ser 00: 00: 00.00 2 veces el doble punto, que solo 1 punto. como hh: mm: ss.ms
  • con 00:00:00.0, funciona mejor, puedo descargar una parte del video. Todavía tengo un problema (con su comando y la mayoría de los demás): descarga 5 o 10 segundos de más. La solución se da en la respuesta de @godofgrunts ‘: -ss 42:30 -i "$video_url" -ss 42:30 -i "$audio_url" -map 0:v -map 1:a -ss 30 comenzando 30 segundos antes de que comience la porción y agregando un -ss 30 al final. Entonces necesito usar varias veces la opción -ss en el mismo comando. ¿Hay alguna manera de hacer lo mismo con --external-downloader-args?
  • Ah, lo siento, no estoy tan familiarizado con la mezcla de diferentes flujos. pero si desea tomar el mejor material de audio y video del mismo video, puede hacerlo con youtube-dl en su lugar

Responder

Para agregar a @hyperpallium respuesta: OP no mencionó que el video que estaba descargando tenía que ser de YouTube.

YouTube es ridículamente restrictivo con sus videos, dividieron el flujos de audio y video en diferentes archivos, y lo rastrean / venden sus datos; por lo tanto, uno podría tener dificultades con el método de descargarlo en parte y luego presionar Ctrl + C .

Con youtube-dl versión 2020.11.17 en Microsoft Windows versión 10.0.17134.1304 descargué parte de un video de 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...] 

El archivo MKV con el que terminé era » 00:22:57 » en » duración total «, pero terminó después de 34 segundos. El video MP4 con el que terminé tenía una duración total de 00:00:34 segundos, terminó después de 34 segundos, y el video y el audio se reprodujeron completamente bien / según lo previsto.

Completo cmd.exe el registro está aquí

En resumen, ejecute

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

(la opción --abort-on-unavailable-fragment puede ser importante ya que terminas interrumpiendo la descarga con Ctrl + C ), déjelo descargar por un momento, luego presione Ctrl + C .

Opcional: cambie el nombre de [file].mkv.part archivo a [file].mkv. La conversión de MKV a MP4 probablemente también sea opcional.

Respuesta

Alguien hizo un secuencia de comandos por lotes (para Windows) que descarga el archivo y extrae la parte deseada:

@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 

Deja una respuesta

Tu dirección de correo electrónico no será publicada. Los campos obligatorios están marcados con *