sábado, 6 de octubre de 2012

Dividir un fichero de vídeo (AVI, FLV,...) usando Mencoder y Mplayer


Mencoder es un programa codificador de vídeo, que nos permite dividir un fichero multimedia (p.ej: AVI) en varios ficheros AVI más pequeños.

Vamos a dividir el fichero de vídeo manteniendo los mismos códecs de vídeo y audio.

Mencoder también acepta otros formatos diferentes del AVI, también podremos cortarlos, pero el resultado serán ficheros en formato AVI.


SEPARAR UN FICHERO EN DOS PARTES

P.ej: Vamos a separar el fichero foo.avi en foo1.avi(duración 600 segundos) y el resto en foo2.avi

Siguiendo las indicaciones de la página man de mencoder, podríamos utilizar las siguientes opciones:
$ mencoder foo.avi -o foo1.avi -oac copy -ovc copy -endpos 600
$ mencoder foo.avi -o foo3.avi -oac copy -ovc copy -ss 600


opciones de mencoder:

foo.avi es el fichero de entrada

-o foo1.avi indica el fichero de salida

-oac copy significa que usemos el mismo códec de audio
-ovc copy significa que usemos el mismo códec de vídeo

-endpos <[[hh:]mm:]ss[.ms]|size[b|kb|mb]>
Para en el instante o la posición del byte determinados.

Ejemplos:
-endpos 56 # Para a los 56 segundos.
-endpos 01:10:00 # Para en 1 hora y 10 minutos.
-ss 10 -endpos 56 # Para en 1 minuto y 6 segundos.
$ mplayer -endpos 100mb # Para la reproducción despés de leer 100MB del fichero de entrada.
$ mencoder -endpos 100mb # Codifica sólo 100 MB.

Entonces, -endpos 600 indica que codifique los primeros 600 segundos de vídeo.


-ss <time>
Salta al instante de tiempo determinado.

Ejemplos:
-ss 56 # Salta al segundo 56.
-ss 01:10:00 # Salta 1 hora y 10 minutos.


Podríamos usar tramas en lugar de tiempo o tamaño:
-frames <número>
Reproduce/convierte sólo las primeras <número> tramas, y termina.


DIVIDIR UN FICHERO EN TRES PARTES O MÁS


Si queremos dividir el fichero en más de dos ficheros, debemos usar --ss junto con -endpos.

P.ej: Separar foo.avi en foo1.avi(300 segundos de duración), foo2.avi(100 segundos) y el resto en foo3.avi
$ mencoder foo.avi -o foo1.avi -oac copy -ovc copy -endpos 300
$ mencoder foo.avi -o foo2.avi -oac copy -ovc copy -ss 300 -endpos 100
$ mencoder foo.avi -o foo3.avi -oac copy -ovc copy -ss 400


*** SIN EMBARGO NO VA A FUNCIONAR!!! ***

Si simplemente dividiremos el fichero multimedia AVI especificando segundos o número de tramas, obtenemos una división imprecisa. El resultado no es una división en el punto exacto que le indicamos a mencoder, y las partes no encajarán bien entre sí.

Eso ocurre porque las divisiones con mencoder deberían usar las tramas clave como referencia.
Una trama clave o I-frame es una trama que puede ser decodificada por sí misma, independiente de las tramas adyacentes.

Por suerte mplayer nos permite detectar las I-frames. Leemos la página de manual de mplayer acerca del filtro de vídeo framestep.
$ man mplayer


framestep=I|[i]step
Reproduce sólo cada n tramas o cada intra trama (trama clave).

Si llamas al filtro con I (mayúscula) como parámetro, entonces sólo las tramas clave son renderizadas.
En los DVDs implica generalmente una de cada 12 ó 15 tramas(IBBPBBPBBPBBPBB).
En los AVI, indican cada cambio de escena, o según el valor de keyint (ver -lavopts keyint=valor si usamos MEncoder para dividir el vídeo).

Cuando se encuentra una trama clave, se imprime la cadena 'I!' seguida de una nueva línea, mostrando así el tiempo(en segundos) y el número de trama de la trama clave. (Esta información nos será útil para dividir el AVI.).


Probamos el filtro de vídeo framestep:
$ mplayer -vf framestep=I foo.avi
Movie-Aspect is 1.88:1 - prescaling to correct movie aspect.
VO: [xv] 512x272 => 512x272 Planar YV12
I!
A:  12.0 V:  12.0 A-V:  0.000 ct:  0.008 301/301  1%  0%  0.4% 1 0                                                            $
I!
A:  15.0 V:  15.0 A-V:  0.000 ct:  0.008 377/377  1%  0%  0.4% 1 0                                                            $
I!
A:  27.0 V:  27.0 A-V:  0.000 ct:  0.008 677/677  2%  0%  0.5% 1 0

Muestra después de V:, el tiempo de vídeo en segundos.


DIVIDIR EN DOS PARTES, BASÁNDONOS EN EL TAMAÑO Y UTILIZANDO CORRECTAMENTE LAS I-FRAMES.


P.ej: Queremos dividir el fichero AVI en dos partes, una parte de 300 MB de tamaño

Ejecutamos mplayer para averiguar dónde están siguadas las I-frames:
$ mplayer -framedrop -endpos 300mb -vf framestep=I foo.avi

Avanzamos cerca del final y obtenemos:
I!
A:2360.0 V:2360.0 A-V:  0.000 ct:  0.042 59000/59000  3%  0%  0.8% 0 0
I!
A:2362.8 V:2362.8 A-V:  0.000 ct:  0.042 59072/59072  3%  0%  0.8% 0 0

IMPORTANTE: Los datos de la I-frame aparecen antes de I!.
Así que la última I-frame aparece a los 2360.0 segundos.
Usaremos el tiempo de vídeo en segundos de esta última I-frame: 2360.0

$ mencoder foo.avi -o foo1.avi -endpos 2360.0 -ovc copy -oac copy
$ mencoder foo.avi -o foo2.avi -ss 2360.0 -ovc copy -oac copy


NOTA:
Algunas veces obtengo este error al codificar un archivo de vídeo:
1 duplicate frame(s)!
Este problema se resuelve cambiando el códec de audio: -oac mp3lame
(Ésto cambiará el tamaño del fichero multimedia)
http://darkmind2007.blogspot.com/2011/04/mencoder-1-duplicate-frames.html


REFERENCIA


$ man mencoder


TRADUCIDO DE

Split a Media Video File (AVI, FLV,...) using Mencoder and Mplayer


PUEDE QUE TAMBIÉN LE INTERESE:


Cómo UNIR dos ficheros .AVI usando MENCODER


No hay comentarios:

Publicar un comentario