Jump to content

FFmpeg: codificación audio/vídeo por línea comandos [uso avanzado]


 Share
Followers 4

Recommended Posts

Quedó el bitrate en 988 kb/seg y la calidad del vídeo empeoró bastante.

 

Trataré de usar los comandos que me indicó, pero quedará en avi. Meb hubiera gustado que quedara en el mismo contenedor MP4.

Si no me funciona tendré que seguir usando el Winavi.

 

Muchas gracias

Muy interesante sus aportes.

Saludos

 

Link to post
Share on other sites
hace 4 minutos, ricar2374 dijo:

Quedó el bitrate en 988 kb/seg y la calidad del vídeo empeoró bastante.

 

Trataré de usar los comandos que me indicó, pero quedará en avi. Meb hubiera gustado que quedara en el mismo contenedor MP4.

Si no me funciona tendré que seguir usando el Winavi.

 

Muchas gracias

Muy interesante sus aportes.

Saludos

 

 

Puede cambiar también de contenedor a MP4 con mis comandos (otra cosa es que su TV lo acepte):

 

ffmpeg -i "[nombre_película_original]" -c:v mpeg4 -vtag xvid -qscale:v 3 -c:a copy -f mp4 "[nombre_película_resultante].mp4"

 

Puede aumentar la calidad de imagen cambiando "-qscale:v 3" por "-qscale:v 2". Tenga en cuenta que está codificando con un códec "obsoleto" y poco eficiente hoy en día.

 

Salud.

Link to post
Share on other sites
  • 2 months later...
Hace 1 hora, davidfigueiras20 dijo:

Hola como convertiria un pelicula HEVC en mkv con varias pistas de audio en dts a ac3 con el mismo formato de video?

 

Hola, buenas noches.

 

- Primero debe localizar los identificadores de las distintas pistas del archivo original:

 

           

$ ffmpeg -i "[nombre_archivo_entrada]"

 

- Lo anterior le arrojará un resultado parecido al siguiente:

 


    Stream #0:0: Video: hevc (Main), yuv420p10le, 1920x804 [SAR 1:1 DAR 160:67], 23.98 fps, 23.98 tbr, 1k tbn, 23.98 tbc (default)
    Metadata:
      title           : Video @ 9727 Kbps
    Stream #0:1(spa): Audio: dts (DTS), 48000 Hz, 5.1(side), s16, 1536 kb/s (default) (forced)
    Metadata:
      title           : Spanish (Spain)
    Stream #0:2(eng): Audio: dts (DTS), 48000 Hz, 5.1(side), s16, 1536 kb/s
    Metadata:
      title           : English (USA)
    Stream #0:3(eng): Audio: ac3, 48000 Hz, stereo, s16
    Metadata:
      title           : English commentaries (USA)
    Stream #0:4(spa): Subtitle: ssa (default) (forced)
    Metadata:
      title           : Spanish Forced
    Stream #0:5(spa): Subtitle: ssa
    Metadata:
      title           : Spanish
    Stream #0:6(eng): Subtitle: subrip
    Metadata:
      title           : English
    Stream #0:7(spa): Subtitle: subrip
    Metadata:

      title           : Spanish commentaries


- En el ejemplo mostrado se ve que la pista de vídeo tiene un identificador "0:0", la pista de audio DTS en español tiene el "0:1" y la pista DTS en inglés el identificador "0:2"

 

- Para convertir las dos pista DTS en AC3 manteniendo intacta la pista de vídeo y encapsulándolo todo en un contenedor Matroska(MKV), proceda de la siguiente manera:

 

           

$ ffmpeg -i "[nombre_archivo_entrada]" -map 0:0 -c copy -map 0:1 -c:a ac3 -b:a 640k -map 0:2 -c:a ac3 -b:a 640k "[nombre_archivo_salida].mkv"

 


Salud.

Link to post
Share on other sites
  • 1 month later...
  • 9 months later...

Hola a todos,

 

He descubierto recientemente el FFMpeg y me parece una maravilla. Estoy aprendiendo sus comandos y desde otro foro me han remitido a este tutorial que me parece utilísimo.

 

Necesito hacer una conversión un tanto particular y no encuentro concretamente la línea de comandos que necesitaría. Ojalá me podáis ayudar.

 

Partimos de una película completa en MKV de 3840x2160 con HDR. Lo que quiero es:

 

1) Extraer un fragmento seleccionado

2) Convertirlo a 1920x1080

3) Exportarlo a MP4 o a MOV mediante H264 (me da igual bitrate)

4) Mantener el audio tal cual

4) Que mantenga el HDR (esto es lo más importante, ya que otros softwares como el Handbrake me lo hacen pero me salen los colores "washed out" en el vídeo resultante)

 

¿Creéis que se puede hacer?

 

¡GRACIAS!

 

Edited by FoxWMulder
Link to post
Share on other sites
hace 12 horas, FoxWMulder dijo:

Hola a todos,

 

He descubierto recientemente el FFMpeg y me parece una maravilla. Estoy aprendiendo sus comandos y desde otro foro me han remitido a este tutorial que me parece utilísimo.

 

Necesito hacer una conversión un tanto particular y no encuentro concretamente la línea de comandos que necesitaría. Ojalá me podáis ayudar.

 

Partimos de una película completa en MKV de 3840x2160 con HDR. Lo que quiero es:

 

1) Extraer un fragmento seleccionado

2) Convertirlo a 1920x1080

3) Exportarlo a MP4 o a MOV mediante H264 (me da igual bitrate)

4) Mantener el audio tal cual

4) Que mantenga el HDR (esto es lo más importante, ya que otros softwares como el Handbrake me lo hacen pero me salen los colores "washed out" en el vídeo resultante)

 

¿Creéis que se puede hacer?

 

¡GRACIAS!

 

 

Puede Vd. probar lo siguiente:

 

ffmpeg -ss [comienzo_del_fragmento] -to [final_del_fragmento] -i "[nombre_archivo_entrada].mkv" -vf scale=1920:1080 -c:v libx264 -pix_fmt yuv420p10le -x264-params "level=5.2:colorprim=bt2020:colormatrix=bt2020nc:transfer=smpte2084" -crf 22 -preset medium -tune film -c:a copy -sn "[nombre_archivo_salida].mp4"

 

Salud.

Link to post
Share on other sites
hace 13 horas, elmohino dijo:

 

Puede Vd. probar lo siguiente:

 

ffmpeg -ss [comienzo_del_fragmento] -to [final_del_fragmento] -i "[nombre_archivo_entrada].mkv" -vf scale=1920:1080 -c:v libx264 -pix_fmt yuv420p10le -x264-params "level=5.2:colorprim=bt2020:colormatrix=bt2020nc:transfer=smpte2084" -crf 22 -preset medium -tune film -c:a copy -sn "[nombre_archivo_salida].mp4"

 

Salud.

 

¡Gracias, funcionó!

Link to post
Share on other sites
  • 2 months later...

Tengo un archivo de subtítulos confeccionado con Cinelerra GG, que usa el formato miniDVD .udvd, que es idéntico al .sub, y que van sincronizados con fotogramas.

Hay alguna manera de indicar a FFMPEG que convierta este archivo a .srt o .ass pero respetando la velocidad de fotogramas de 25, que es la que uso en el vídeo y no la que usa FFMPEG por defecto que es 23,976.

Porque al convertir se pierde la sincronía. Sé que con Gaupol si puedo solucionar esto de convertir un archivo que está sincronizado por fotogramas a uno que lo esté en código H:M:S:ms, pero me gustaría saber si es posible en ffmpeg.

Muchas gracias por anticipado.

Link to post
Share on other sites
hace 16 horas, Rafa Mar dijo:

Tengo un archivo de subtítulos confeccionado con Cinelerra GG, que usa el formato miniDVD .udvd, que es idéntico al .sub, y que van sincronizados con fotogramas.

Hay alguna manera de indicar a FFMPEG que convierta este archivo a .srt o .ass pero respetando la velocidad de fotogramas de 25, que es la que uso en el vídeo y no la que usa FFMPEG por defecto que es 23,976.

Porque al convertir se pierde la sincronía. Sé que con Gaupol si puedo solucionar esto de convertir un archivo que está sincronizado por fotogramas a uno que lo esté en código H:M:S:ms, pero me gustaría saber si es posible en ffmpeg.

Muchas gracias por anticipado.

 

No conozco ese formato de subtítulo, nunca lo he usado, así que no puedo contestarle convenientemente.

 

Solo le diré que, con los subtítulos que yo manejo, FFmpeg no cambia la velocidad de fotogramas a la hora de convertirlos.

 

Salud.

Link to post
Share on other sites
Hace 1 hora, elmohino dijo:

 

No conozco ese formato de subtítulo, nunca lo he usado, así que no puedo contestarle convenientemente.

 

Solo le diré que, con los subtítulos que yo manejo, FFmpeg no cambia la velocidad de fotogramas a la hora de convertirlos.

 

Salud.

El formato .sub de subtítulos era muy usado en los miniDVD y al ser antiguo todos los reproductores lo reconocen. El problema es que este sincroniza los textos mediante fotogramas y no mediante tiempo, que es como funcionan los que tú debes conocer, como .srt .ssa .ass... por ejemplo. Cuando la sincronía es por tiempo no hay problemas de conversión, pero cuando convierto de un formato con el .sub que va con fotogramas a uno con tiempo, pues ffmpeg usa por defecto la velocidad de 23,976, y si no puedo indicarle que use otra velocidad de fotogramas como base, pues no me sirve para convertir. Y esta era mi pregunta, si en cuestión de subtítulos se podía indicar la velocidad de fotogramas de referencia, como si se puede hacer en un vídeo.

Muchas gracias por tu respuesta.

Link to post
Share on other sites
  • 9 months later...

Impresionante hilo. Gracias por la información

 

Debo concatenar varios pequeños  videos (tres trozos) de unos 40 segundos de duración cada uno, sin que sea necesario sonido. El problema es que cada trozo tiene una procedencia distinta y por lo tanto tienen distintos codecs, contenedores, dimensiones, etc... (algunos son wmv, otros avi, otros mp4 ....) Quiero usar ffmpeg para hacer esta tarea.

 

He conseguido unificar tamaños, codecs... pero a la hora de concatenarlos con :

 

ffmpeg -f concat -safe 0 -i mylist.txt -c copy final.mp4

 

los videos que independientes se ven bien y tienen el mismo tamaño y codec, unidos no se reproducen correctamente. Supongo que un problema es que no consigo unificar los bitrates

 

¿Alguien puede indicarme un procedimiento para intentar que videos tan distintos puedan concatenarse adecuadamente? No pretendo que nadie me lo de "mascado", pero cualquier orientación  será bienvenida. 

Link to post
Share on other sites
Posted (edited)
hace 27 minutos, epicteto dijo:

Impresionante hilo. Gracias por la información

 

Debo concatenar varios pequeños  videos (tres trozos) de unos 40 segundos de duración cada uno, sin que sea necesario sonido. El problema es que cada trozo tiene una procedencia distinta y por lo tanto tienen distintos codecs, contenedores, dimensiones, etc... (algunos son wmv, otros avi, otros mp4 ....) Quiero usar ffmpeg para hacer esta tarea.

 

He conseguido unificar tamaños, codecs... pero a la hora de concatenarlos con :

 

ffmpeg -f concat -safe 0 -i mylist.txt -c copy final.mp4

 

los videos que independientes se ven bien y tienen el mismo tamaño y codec, unidos no se reproducen correctamente. Supongo que un problema es que no consigo unificar los bitrates

 

¿Alguien puede indicarme un procedimiento para intentar que videos tan distintos puedan concatenarse adecuadamente? No pretendo que nadie me lo de "mascado", pero cualquier orientación  será bienvenida. 

Gracias a usted.

 

El bitrate no suele ser importante. Lo importante es que se asegure de que las dimensiones en píxeles sean las mismas en los tres vídeos, que sus códecs de vídeo sean los mismos, que sus códecs de audio sean los mismos, que la frecuencia en kHz del audio (-ar 44100, -ar 48000, etc.) sea la misma, que el número de canales (-ac 1, -ac 2, -ac 6, -ac 8, etc.) sean los mismos, que tengan el mismo número de audios, que tengan el mismo número de subtítulos (y que estos sean del mismo formato) y, por supuesto, que tengan el mismo contenedor.

 

Una vez lo haya hecho, pruebe lo siguiente:

 

$ ffmpeg -i "concat:vídeo01.mp4|vídeo02.mp4|vídeo03.mp4" -c copy vídeo_de_salida.mp4

 

Salud.

Edited by elmohino
Link to post
Share on other sites

Gracias por la respuesta

 

MIs tres vídeos son .mp4, tienen el mismo codec (h264) y las mismas dimensiones. Lo único que creo que les diferencia es el bitrate, por eso pensé que era lo que me da problemas..

 

He eliminado el sonido de todos porque no lo necesito y así me ahorro problemas. He probado el comando que me aconseja y el resultado es que solo se ve el primero de los videos, los otros desaparecen. Esta es la información que saco de cada uno de ellos cuando los reproduzco aisladamente a través de la consola:

 

PRIMER VIDEO

 (+) Video --vid=1 (*) (h264 540x304 29.970fps)
VO: [gpu] 540x304 => 540x304 yuv420p

----

SEGUNDO VIDEO

 (+) Video --vid=1 (*) (h264 540x304 30.000fps)
VO: [gpu] 540x304 => 540x304 yuv420p

---

TERCER VIDEO

 (+) Video --vid=1 (*) (h264 540x304 30.000fps)
VO: [gpu] 540x304 => 540x304 yuv420p

 

Como se puede ver, solo hay una ligera diferencia en el bitrate de uno de ellos.
 

Link to post
Share on other sites
hace 24 minutos, epicteto dijo:

Gracias por la respuesta

 

MIs tres vídeos son .mp4, tienen el mismo codec (h264) y las mismas dimensiones. Lo único que creo que les diferencia es el bitrate, por eso pensé que era lo que me da problemas..

 

He eliminado el sonido de todos porque no lo necesito y así me ahorro problemas. He probado el comando que me aconseja y el resultado es que solo se ve el primero de los videos, los otros desaparecen. Esta es la información que saco de cada uno de ellos cuando los reproduzco aisladamente a través de la consola:

 

PRIMER VIDEO

 (+) Video --vid=1 (*) (h264 540x304 29.970fps)
VO: [gpu] 540x304 => 540x304 yuv420p

----

SEGUNDO VIDEO

 (+) Video --vid=1 (*) (h264 540x304 30.000fps)
VO: [gpu] 540x304 => 540x304 yuv420p

---

TERCER VIDEO

 (+) Video --vid=1 (*) (h264 540x304 30.000fps)
VO: [gpu] 540x304 => 540x304 yuv420p

 

Como se puede ver, solo hay una ligera diferencia en el bitrate de uno de ellos.
 

Eso a lo que Ud. se refiere no es el bitrate sino los frames per second (fps), es decir, "fotogramas por segundo", algo tampoco determinante para impedir la concatenación.

 

Si no consigue de ninguna manera unir los tres vídeos con FFMpeg, puede usar las MKVToolNix para unirlos con éxito en un Matroska (.mkv) y, a continuación, pasar ese Matroska a MP4 con FFMpeg:

 

$ mkvmerge -o vídeo_de_salida.mkv vídeo01.mp4 +vídeo02.mp4 +vídeo03.mp4

$ ffmpeg -i vídeo.mkv -c copy vídeo_de_salida.mp4

Salud.

Link to post
Share on other sites

Hola

 

Tengo que unificar muchos vídeos de corta duración. Además hacer una transición entre algunos de ellos.

 

Para ello uso ffmpeg 2 veces y funcionan bien, pero  además de la pérdida de tiempo creo que se pierde calidad por tener que codificar 2 veces

 

¿se podría juntar todo para usar ffmpeg una sola vez? Estas son las dos instrucciones que uso y que me gustaría poder ejecutar juntas

 

ffmpeg -i entrada.mp4 -ss 00:00:00 -to 00:00:40 -vcodec libx264 -profile:v baseline -pix_fmt yuv420p -filter:v fps=25 -an -vf scale=750:416,setsar=1:1.8 salida.mp4

ffmpeg -i salida.mp4 -vf "fade=t=in:st=0:d=3,fade=t=out:st=37:d=3" -c:a copy final.mp4

 

 

Link to post
Share on other sites
hace 2 horas, epicteto dijo:

Hola

 

Tengo que unificar muchos vídeos de corta duración. Además hacer una transición entre algunos de ellos.

 

Para ello uso ffmpeg 2 veces y funcionan bien, pero  además de la pérdida de tiempo creo que se pierde calidad por tener que codificar 2 veces

 

¿se podría juntar todo para usar ffmpeg una sola vez? Estas son las dos instrucciones que uso y que me gustaría poder ejecutar juntas

 


ffmpeg -i entrada.mp4 -ss 00:00:00 -to 00:00:40 -vcodec libx264 -profile:v baseline -pix_fmt yuv420p -filter:v fps=25 -an -vf scale=750:416,setsar=1:1.8 salida.mp4

ffmpeg -i salida.mp4 -vf "fade=t=in:st=0:d=3,fade=t=out:st=37:d=3" -c:a copy final.mp4

 

 

Pruebe lo siguiente:

 

$ ffmpeg -i entrada.mp4 -ss 00:00:00 -to 00:00:40 -vcodec libx264 -profile:v baseline -pix_fmt yuv420p -filter:v fps=25 -an -vf scale=750:416,setsar=1:1.8,fade=t=in:st=0:d=3,fade=t=out:st=37:d=3 salida.mp4

 

Salud.

Link to post
Share on other sites

Hola

 

¿sabe alguien de que modo podría añadir una imagen al principio de un vídeo, del modo más eficiente posible con ffmpeg u otro programa similar? Lo tengo que hacer muchas veces

 

La imagen sería una captura del propio video, por lo cual no habría problemas de incompatibilidad de dimensiones

 

Me gustaría que además entre ambos hubiera un fade, pero esto no sería absolutamente necesario

 

En los ejemplos que he visto parece que es imprescindible renderizar/codificar

 

Yo intento hacer un pequeño video con la imagen 

 

ffmpeg -loop 1 -i imagen.jpg -t 00:00:02  -vcodec libx264 -profile:v baseline -pix_fmt yuv420p  video.mp4

pero luego tengo problemas a veces para concatenar este video con el principal con:

 

mkvmerge -o salida.mkv video1 + video2

Gracias

Edited by epicteto
Link to post
Share on other sites
Posted (edited)
hace 7 horas, epicteto dijo:

Hola

 

¿sabe alguien de que modo podría añadir una imagen al principio de un vídeo, del modo más eficiente posible con ffmpeg u otro programa similar? Lo tengo que hacer muchas veces

 

La imagen sería una captura del propio video, por lo cual no habría problemas de incompatibilidad de dimensiones

 

Me gustaría que además entre ambos hubiera un fade, pero esto no sería absolutamente necesario

 

En los ejemplos que he visto parece que es imprescindible renderizar/codificar

 

Yo intento hacer un pequeño video con la imagen 

 




ffmpeg -loop 1 -i imagen.jpg -t 00:00:02  -vcodec libx264 -profile:v baseline -pix_fmt yuv420p  video.mp4

pero luego tengo problemas a veces para concatenar este video con el principal con:

 




mkvmerge -o salida.mkv video1 + video2

Gracias

 

Hay dos maneras: una sin recodificar (puede que dé problemas en algunos reproductores de vídeo) y otra recodificando (más compatible con reproductores)


# SIN RECODIFICAR:

 

Primero crear el vídeo a partir de la imagen fija con fundidos de entrada y/o salida:

 

$ ffmpeg -loop 1 -i imagen.jpg -t 00:00:05 -vcodec libx264 -profile:v baseline -pix_fmt yuv420p -vf "fade=t=in:st=0:d=1,fade=t=out:st=4:d=1" video_imagen_fija.mp4

 

A continuación cambiar de contenedor MP4 a TS:

 

$ ffmpeg -i video_imagen_fija.mp4 -c copy -bsf:v h264_mp4toannexb -f mpegts video_imagen_fija.ts

 

Seguidamente hacer lo mismo con el vídeo de imagen en movimiento:

 

$ ffmpeg -i video_imagen_en_movimiento.mp4 -c copy -bsf:v h264_mp4toannexb -f mpegts video_imagen_en_movimiento.ts

 

Por último concatenar los dos vídeos TS guardándolos en contenedor MP4:

 

$ ffmpeg -i "concat:video_imagen_fija.ts|video_imagen_en_movimiento.ts" -c copy video_de_salida.mp4


# RECODIFICANDO:

 

Primero crear el vídeo a partir de la imagen fija con fundidos de entrada y/o salida:

 

$ ffmpeg -loop 1 -i imagen.jpg -t 00:00:05 -vcodec libx264 -profile:v baseline -pix_fmt yuv420p -vf "fade=t=in:st=0:d=1,fade=t=out:st=4:d=1" video_imagen_fija.mp4

 

A continuación se pasaría a unir el vídeo de imagen fija con el vídeo de imagen en movimiento, recodificando. El archivo de salida debe ser en Matroska (.mkv):

 

$ ffmpeg -i video_imagen_fija.mp4 -i video_imagen_en_movimiento.mp4 -filter_complex '[0:0] [1:0] concat=n=2:v=1:a=0' -vcodec libx264 -profile:v baseline -pix_fmt yuv420p video_de_salida.mkv

 

Una vez terminada la codificación, pasar, si se desea, el archivo Matroska a MP4:

 

$ ffmpeg -i video_de_salida.mkv -c copy video_de_salida.mp4

 

 

Salud.

Edited by elmohino
Link to post
Share on other sites

 

 

 

Hola. 

 

Al crear un vídeo desde una imagen con:

 

ffmpeg -loop 1 -i imagen.jpg -t 00:00:05 -vcodec libx264 -profile:v baseline -pix_fmt yuv420p -vf "fade=t=in:st=0:d=1,fade=t=out:st=4:d=1" video_imagen_fija.mp4

 

A veces me encuentro con que alguna de las dimensiones de la imagen es impar y da error. Para solucionarlo añado en -vf:

 

"pad=ceil(iw/2)*2:ceil(ih/2)*2"

Y se soluciona el problema haciéndose el vídeo. Lógicamente cambia las dimensiones, y por lo tanto ya no puedo concatenarlo mediante:

 

 

$ ffmpeg -i video_imagen_fija.mp4 -i video_imagen_en_movimiento.mp4 -filter_complex '[0:0] [1:0] concat=n=2:v=1:a=0' -vcodec libx264 -profile:v baseline -pix_fmt yuv420p video_de_salida.mkv

 

Porque la imagen en una captura  de video_imagen_en_movimiento.mp4, y este vídeo sigue teniendo una de sus dimensiones impar. Debería aplicar el mismo pad=ceil al vídeo inicial, pero por más pruebas que he hecho no sé como integrarlo con el filtro concat. ¿podéis ayudarme?

 

Por otro lado, en el vídeo final se conserva el sonido, pero se adelanta a la imagen tanto como la duración del vídeo que he creado e insertado delante. ¿se podría  retrasar el audio final n segundos?

 

Saludos y gracias

 

 

 

 

 

 

 

Edited by epicteto
Link to post
Share on other sites

Create an account or sign in to comment

You need to be a member in order to leave a comment

Create an account

Sign up for a new account in our community. It's easy!

Register a new account

Sign in

Already have an account? Sign in here.

Sign In Now
 Share
×
×
  • Create New...