Nota: publiqué la misma pregunta en stackoverflow poco tiempo antes, cuando todavía no he encontrado esta comunidad. Vuelvo a publicar esto ya que la pregunta es más adecuada para esta comunidad.
1. Lo que probé
Tengo algunos archivos .MTS (formato AVCHD) grabados con mi cámara AVCHD . Su especificación es como se muestra a continuación:
$ ffprobe 140612_Canon-00000.MTS
ffprobe version 2.2.1 Copyright (c) 2007-2014 the FFmpeg developers
(snip)
Input #0, mpegts, from '140612_Canon-00000.MTS':
Duration: 00:48:58.40, start: 0.800300, bitrate: 5563 kb/s
Program 1
Stream #0:0[0x1011]: Video: h264 (High) (HDMV / 0x564D4448),
yuv420p, 1440x1080 [SAR 4:3 DAR 16:9],
29.97 fps, 29.97 tbr, 90k tbn, 59.94 tbc
Stream #0:1[0x1100]: Audio: ac3 (AC-3 / 0x332D4341), 48000 Hz,
stereo, fltp, 256 kb/s
Presta atención a la parte de framerate / timebase: 29.97 fps, 29.97 tbr, 90k tbn, 59.94 tbc
Ahora me gustaría convertir este archivo a archivo .mp4, sin volver a codificar la transmisión de video H264 , por otro lado, con la transcodificación de su transmisión de audio a AAC . Así que probé el siguiente comando:
ffmpeg -i 140612_Canon-00000.MTS -t 60 -y -vcodec copy -acodec libfaac -ab 128k 140612_Canon-00001.MTS.mp4
2. Resultado
y la especificación del archivo de salida es como se muestra a continuación:
$ ffprobe 140612_Canon-00000.MTS.mp4
Input #0, mov,mp4,m4a,3gp,3g2,mj2, from '140612_Canon-00000.MTS.mp4':
Metadata:
major_brand : isom
minor_version : 512
compatible_brands: isomiso2avc1mp41
encoder : Lavf55.33.100
Duration: 00:01:00.04, start: 0.021333, bitrate: 4590 kb/s
Stream #0:0(und): Video: h264 (High) (avc1 / 0x31637661), yuv420p,
1440x1080 [SAR 4:3 DAR 16:9], 4448 kb/s,
59.94 fps, 59.94 tbr, 90k tbn, 59.94 tbc (default)
Metadata:
handler_name : VideoHandler
Stream #0:1(und): Audio: aac (mp4a / 0x6134706D),
48000 Hz, stereo, fltp, 128 kb/s (default)
Metadata:
handler_name : SoundHandler
Mire la parte de framerate / timebase: 59.94 fps, 59.94 tbr, 90k tbn, 59.94 tbc . Aunque ffmpeg acaba de copiar la transmisión de video, la velocidad de fotogramas y la base de tiempo se ha cambiado a dos veces .
Entonces, cuando abro y reproduzco el archivo de salida con QuickTime Player o VLC Player, el audio no tiene ningún problema, sin embargo, la transmisión de video no se reproduce correctamente. El video se reproduce con su marco hacia adelante y hacia atrás temblando repetidamente.
3. Pregunta
- ¿Cómo puedo convertir el archivo .MTS (AVCHD) a .mp4 mediante ffmpeg sin volver a codificar correctamente la transmisión de video H264 ?
- ¿Cómo puedo mantener los valores de framerate / timebase originales (fps / tbr / tbn / tbc) cuando convierto el contenedor con
ffmpeg
su-vcodec copy
interruptor? - ¿Cómo puedo establecer los valores de framerate / timebase (fps / tbr / tbn / tbc) mediante las opciones de línea de comando de ffmpeg sin volver a codificar una secuencia de video.
¿Algunas ideas?
4. Agregar -r 29.97
opción
El profesor Sparkles me dio un consejo para agregar -r 29.97
. Intenté eso:
ffmpeg -i 140612_Canon-00001.MTS -t 60 -r 29.97 -y -vcodec copy -acodec libfaac -ab 128k 140612_Canon-00001.MTS.mp4
Sin embargo, el archivo de salida todavía tiene una tasa de fotogramas / base de tiempo incorrecta:
Stream #0:0(und): Video: h264 (High) (avc1 / 0x31637661), yuv420p,
1440x1080 [SAR 4:3 DAR 16:9], 4448 kb/s,
59.94 fps, 59.94 tbr, 11988 tbn, 59.94 tbc (default)
5. Remux usando MP4Box
Intenté demux y remux usando MP4Box, de acuerdo con los consejos del profesor Sparkles.
brew install mp4box
ffmpeg -i 140612_Canon-00000.MTS -t 60 -y \
-vcodec copy -an 140612_Canon-00000.MTS.h264
ffmpeg -i 140612_Canon-00000.MTS -t 60 -y \
-vn -acodec libfaac -ab 128k 140612_Canon-00000.MTS.aac
mp4box -add 140612_Canon-00000.MTS.h264:fps=29.97 \
-add 140612_Canon-00000.MTS.aac \
-new 140612_Canon-00000.MTS.mp4
y la salida fue:
$ ffprobe 140612_Canon-00000.MTS.mp4
Input #0, mov,mp4,m4a,3gp,3g2,mj2, from '140612_Canon-00000.MTS.mp4':
(snip)
Duration: 00:02:00.22, start: 0.000000, bitrate: 2293 kb/s
Stream #0:0(und): Video: h264 (High) (avc1 / 0x31637661),
yuv420p, 1440x1080 [SAR 4:3 DAR 16:9], 2228 kb/s,
29.97 fps, 29.97 tbr, 30k tbn, 59.94 tbc (default)
Metadata:
creation_time : 2014-07-14 00:38:23
handler_name : 140612_Canon-00000.MTS.h264:fps=29.97
- Imported with GPAC 0.5.0-rev4065
Stream #0:1(und): Audio: aac (mp4a / 0x6134706D), 48000 Hz,
stereo, fltp, 125 kb/s (default)
Parece un poco un paso adelante. Mire la parte de framerate / timebase: 29.97 fps, 29.97 tbr, 30k tbn, 59.94 tbc . Esos coinciden con la secuencia original, exceptotbn
(valor de base de tiempo del contenedor).
Sin embargo, cuando reproduzco el archivo de salida con Quicktime Player o VLC, el video se reproduce a media velocidad .
Aunque el archivo original tiene 90k tbn
(90000 tics por segundo) y el nuevo archivo de salida de MP4Box tiene 30k tbn
solo un tercio del valor original, el archivo de salida se reproduce a la mitad de velocidad.
No sé por qué. Pero creo que el resto es cómo puedo ajustar el tbn
valor.
5-b. Informe de MediaInfo sobre el archivo de salida
También probé la herramienta MediaInfo en el archivo de salida generado por 5. Remux usando MP4Box . La salida está aquí: https://gist.github.com/kaorukobo/c5ab9eaa413dff6cd26a
6. Probar avconv
Volodya informó que avconv
funcionó bien. También preparé un pequeño archivo de película de muestra (Canon-00006.MTS) grabado con la misma cámara. Ok, intentemos:
brew install avconv
avconv -i Canon-00006.MTS -c:a copy -c:v copy -y Canon-00006.MTS.mp4
ffprobe Canon-00006.MTS.mp4
La información de ffprobe del archivo de salida está aquí: https://gist.github.com/kaorukobo/5b53244ade2632ff1211 y su información de velocidad de fotogramas / base de tiempo es la siguiente: 59.94 fps, 59.94 tbr, 90k tbn, 59.94 tbc
El archivo de salida se reprodujo bien con VLC Player como informó Volodya. Sin embargo, al abrirlo con Quicktime Player X, el video se reprodujo a la velocidad normal pero con su marco hacia atrás temblando repetidamente.
7. ¿Por qué funciona la aplicación "Free AVCHD to MOV"?
Como mencioné en mi comentario anterior , la función "reenviar a MOV" de la aplicación Free AVCHD to MOV funcionó bien, aunque no hace MP4 sino MOV.
El software llama internamente a su propio programa ffmpeg (o avconv), y vi qué opciones se le pasan. Es como se muestra a continuación:
/Applications/Free AVCHD to Mov.app/Contents/Resources/bin/com.geranium-soft.convert \
-i /path/to/140710_Canon-00003.MTS \
-map 0:0 -map 0:1 -c:a libfaac -vol 256 -b:a 128k -c:v copy \
-sn -movflags faststart -threads 0 -pix_fmt yuv420p -y \
/path/to/140710_Canon-00003.mov
Traté de pasar las mismas opciones (Extracto. Establecí el tipo de contenedor de salida en MOV y eliminé incluso el -t 60
interruptor) al programa ffmpeg y la conversión. Pero el resultado fue el mismo que se informó hasta ahora .
De todos modos, esa gran aplicación resolvió mi problema en "¿Cómo puedo convertir el archivo .MTS (AVCHD) a .mp4 sin volver a codificar la transmisión de video H264?", Excepto en "a .mp4" y "por ffmpeg". Pero todavía estoy interesado en por qué esa aplicación funciona bien, pero ffmpeg no.