¿Cómo descargar una porción de video con el comando youtube-dl?

62

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

Quiero descargar solo una parte del video que es demasiado largo. Así que quiero descargar solo unos minutos del video. Ejemplo de 13 minutos a 17 minutos.

Hay alguna forma de hacer eso

usuario3181614
fuente

Respuestas:

44

No creo que youtube-dlsolo hagas lo que quieras. 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 -iparámetro del siguiente comando:

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

El -ssparámetro en esta posición indica que descarta todas las entradas hasta 15 segundos en el video. La -topción indica capturar durante 10 segundos. El resto del comando le dice que se almacene como un mp4.

ffmpeg es una herramienta popular y debería estar en cualquiera de los repositorios / gestores de paquetes populares del sistema operativo.

Johnnie
fuente
8
Entonces, esencialmente, todavía tienes que descargar todo el video y recortarlo tú mismo
Antony
12
Puede usar la opción -to 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
ˆᵛˆ
55
@Antony en ffmpegrealidad solo descargará la parte que especifique.
akaihola
Que no guarda el audio de un vídeo en mi caso a diferencia de @godofgrunts responder.
daGo
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
fuente
55
¿Podría explicar qué hace y cómo funciona?
user259412
3
Es solo una versión más concisa de la respuesta @godofgrunts, que usa sed para ahorrar tiempo agarrando manualmente las URL y copiando / pegando en los tiempos de inicio (-ss 00:05). @godofgrunts tiene algunas banderas adicionales -map 0:v -map 1:a -c:v libx264 -c:a aacque podrían mejorar la calidad. También me gusta agregar youtube-dl -f bestvideo+bestaudiopara asegurarme de que estoy obteniendo la versión de mayor calidad.
Steve Goranson
ffmpeg.zeranoe.com/builds para Windows.
Wolfpack'08
17

Agregando a la respuesta de Johnnie:

Úselo youtube-dl -g "URL"para obtener las transmisiones de video y audio.

Ahora usa:

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á usar la -ssopción para cada transmisión. También recomiendo hacerlo unos 30 segundos antes y luego usar otro -ss 30para evitar perder fotogramas clave. Aquí hay un ejemplo real usando uno de mis videos de youtube.

Vídeo

youtube-dl -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 capturar un buen fotograma clave) en ambas entradas y luego hacer una entrada -ss 30posterior a las 43:00.

Luego usaré mappara asignar el video 0:vy el audio 1:a(0 significa la primera entrada, que es el video y 1 significa la segunda entrada, que es el audio) y luego elegir mis opciones de codificación.

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
fuente
1
Gracias. No estaba seguro de cómo obtener sonido para la publicación de @Johnnie. Tu publicación lo respondió.
Manny_Mar
Wow, no sabía que la -ibandera de ffmpeg podría tomar URL. aseado
Geremia
¿En qué se diferencia de usar --postprocessor-argsdirectamente en youtube-dl?
daGo
12

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

ks1322
fuente
9

youtube-dl admite pasar 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 postprocesamiento ffmpegcontigo mismo después de descargar el archivo primero.

Kevin
fuente
44
pero esto aún requerirá descargar todo el video, luego cortar la parte deseada
Kasparov92
Estoy recibiendo un unable to obtain file audio codec with ffprobeerror ¿Me pueden ayudar con eso? Estoy usando CentOS 7
Hassaan el
3
Tenga en cuenta que la -xbandera solo descarga el audio. Omítalo desde el comando si desea audio y video. :)
grooveplex
2

Puede descargar desde el principio hasta cierto punto sin descargar todo y editarlo. Esa es la mitad de lo que esta pregunta pregunta:

interrumpir la descarga con ^C

  • Solo he intentado esto con mp4
  • no funcionará con video y audio por separado, necesita un formato con ambos. Por defecto, ytdl a menudo obtiene video y audio por separado, luego los fusiona. Use -Fpara ver los formatos disponibles y elija uno mp4que tenga ambos. por ejemplo, -f18o -f22generalmente están ahí.
  • tendrá que estimar a partir del porcentaje descargado (que no es lineal; la tasa de compresión varía con el tiempo).

Si. Es un hack .

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

hiperpallium
fuente
1

Esto no responde completamente la pregunta de OP, pero hay una manera 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ículums, podríamos solicitar contenido parcial usando el Rangeencabezado.

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 secuencias de video y audio).

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

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

Ahora, dividimos esta duración total del contenido por el total de segundos en el video (el video de YouTube tiene una duración de 4 minutos y 7 segundos, que es de 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 obtener desde el principio + 1)

(agregamos uno para tener en cuenta aproximadamente el espacio extra ocupado por los metadatos que se coloca al comienzo de la transmisión)

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

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

Esto solo debería descargar los primeros 10 segundos. El archivo descargado debería poder reproducirse, pero es mejor dejar que FFmpeg repare 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 manera similar (la duración del contenido sería diferente, pero el total de segundos sería el mismo).

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

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

ritiek
fuente
0

Use el parámetro --postprocessor-args para pasar la salida de audio / video a ffmpeg a editar (el procesador), por lo que necesita instalar ffmpeg.

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

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

Ejemplos:

  • Comience a codificar a los 15 segundos y deténgase a los 1 minutos y 20 segundos

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

  • Comience a codificar a los 15 segundos y tome solo los siguientes 3 minutos 5 segundos

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

PD: youtube-dl descargará todo el contenido multimedia antes de procesarlo y lo eliminará después.

niainaLens
fuente