Recientemente, me veo obligado a lidiar con un pequeño problema desagradable con los videos que tienen algunos atributos de metadatos especiales, a saber, "retraso" o "retraso_relativo_al_video".
Existe una solución de software de videoconferencia que produce estos archivos especiales, y cuando nuestro software de procesamiento de video examina estos archivos, obtiene valores de duración más largos que la duración real del contenido, por lo que almacena datos incorrectos en la base de datos, lo que causa más problemas en la fase de posprocesamiento.
Por ejemplo, grabamos un video de 46 segundos de duración, que se detectó como de 104,7 segundos de duración.
Después de inspeccionar el archivo con FFmpeg y Mediainfo, resultó que el archivo original tenía el llamado valor de "retraso" que se puede ver como start
tiempo en la salida de FFmpeg:
Input #0, flv, from '/path/to/the/file/converter/master/194/194_video.flv':
Metadata:
metadatacreator : Yet Another Metadata Injector for FLV - Version 1.4
hasKeyframes : true
hasVideo : true
hasAudio : true
hasMetadata : true
canSeekToEnd : false
datasize : 12892571
videosize : 12198311
audiosize : 680584
lasttimestamp : 105
lastkeyframetimestamp: 104
lastkeyframelocation: 12646873
Duration: 00:01:44.77, start: 58.033000, bitrate: 984 kb/s
Stream #0:0: Video: h264 (Constrained Baseline), yuv420p, 1280x720, 30 fps, 30 tbr, 1k tbn
Stream #0:1: Audio: aac (LC), 44100 Hz, stereo, fltp
...y Delay
o Delay_relative_to_video
en los de Mediainfo:
mediainfo --full --output=XML /path/to/the/file/converter/master/194/194_video.flv
<track type="Video">
(...)
<Delay>0</Delay>
<Delay>00:00:00.000</Delay>
<Delay__origin>Container</Delay__origin>
<Delay__origin>Container</Delay__origin>
</track>
<track type="Audio">
(...)
<Delay>58036</Delay>
<Delay>58s 36ms</Delay>
<Delay>58s 36ms</Delay>
<Delay>58s 36ms</Delay>
<Delay>00:00:58.036</Delay>
<Delay__origin>Container</Delay__origin>
<Delay__origin>Container</Delay__origin>
<Delay_relative_to_video>58036</Delay_relative_to_video>
<Delay_relative_to_video>58s 36ms</Delay_relative_to_video>
<Delay_relative_to_video>58s 36ms</Delay_relative_to_video>
<Delay_relative_to_video>58s 36ms</Delay_relative_to_video>
<Delay_relative_to_video>00:00:58.036</Delay_relative_to_video>
</track>
"Sorprendentemente", restando la duración y el retraso me da la duración correcta...
Además, es realmente vergonzoso que algunas bibliotecas de codificadores cuenten estos retrasos en la duración total, ¡pero algunas no lo hacen! ¡Aparentemente no hay forma de distinguir qué valores de longitud son correctos y cuáles se incrementaron en consecuencia!
En pocas palabras, me gustaría saber para qué se utilizan estos metadatos. ¿Cuál es la razón de su existencia y por qué algunos codificadores/software de edición de video inyectan estos metadatos en el archivo?
¡Gracias por sus respuestas de antemano!
Editar:
De acuerdo con la respuesta de Mulvya, ¡ejecutar una copia de flujo simple en el archivo puede restablecer las marcas de tiempo!
Sin embargo, había un archivo .mov en el que no funcionó. Salida de consola relacionada:
ffmpeg -i 22_video.mov -c copy _22_video.mov
ffmpeg version N-79632-g3ce1988-static Copyright (c) 2000-2016 the FFmpeg developers
built with gcc 4.7 (Debian 4.7.2-5)
configuration: --prefix=/home/gergo/buildscript/ffmpeg-static-master-customVSQ/target --extra-cflags='-I/home/gergo/buildscript/ffmpeg-static-master-customVSQ/target/include -static' --extra-cflags=--static --extra-ldflags='-L/home/gergo/buildscript/ffmpeg-static-master-customVSQ/target/lib -lm -static' --extra-libs=-ldl --extra-version=static --disable-debug --disable-shared --enable-static --extra-cflags=--static --disable-ffplay --disable-ffserver --disable-doc --enable-gpl --enable-pthreads --enable-postproc --enable-gray --enable-runtime-cpudetect --enable-libfaac --enable-libmp3lame --enable-libopus --enable-libtheora --enable-libvorbis --enable-libx264 --enable-libxvid --enable-bzlib --enable-zlib --enable-nonfree --enable-version3 --enable-libwavpack --enable-libvpx --enable-librtmp
libavutil 55. 22.101 / 55. 22.101
libavcodec 57. 38.100 / 57. 38.100
libavformat 57. 34.103 / 57. 34.103
libavdevice 57. 0.101 / 57. 0.101
libavfilter 6. 44.100 / 6. 44.100
libswscale 4. 1.100 / 4. 1.100
libswresample 2. 0.101 / 2. 0.101
libpostproc 54. 0.100 / 54. 0.100
Input #0, mov,mp4,m4a,3gp,3g2,mj2, from '22_video.mov':
Metadata:
major_brand : qt
minor_version : 537199360
compatible_brands: qt
creation_time : 2013-10-29 21:33:33
com.apple.finalcutstudio.media.uuid: 3B712819-1D1D-4F9B-8593-01656870A04C
timecode : 01:00:00:00
Duration: 00:03:25.00, start: 0.000000, bitrate: 9332 kb/s
Stream #0:0(eng): Video: h264 (Main) (avc1 / 0x31637661), yuv420p(tv, bt709), 1920x1080, 9019 kb/s, 25 fps, 25 tbr, 2500 tbn (default)
Metadata:
creation_time : 2013-10-29 21:33:33
handler_name : Apple Video Media Handler
encoder : H.264
Stream #0:1(eng): Audio: aac (LC) (mp4a / 0x6134706D), 44100 Hz, stereo, fltp, 307 kb/s (default)
Metadata:
creation_time : 2013-10-29 21:33:33
handler_name : Apple Sound Media Handler
Stream #0:2(eng): Data: none (tmcd / 0x64636D74) (default)
Metadata:
creation_time : 2013-10-29 21:33:33
handler_name : Time Code Media Handler
timecode : 01:00:00:00
File '_22_video.mov' already exists. Overwrite ? [y/N] y
[mov @ 0x46c6660] Using AVStream.codec to pass codec parameters to muxers is deprecated, use AVStream.codecpar instead.
Last message repeated 1 times
Output #0, mov, to '_22_video.mov':
Metadata:
major_brand : qt
minor_version : 537199360
compatible_brands: qt
timecode : 01:00:00:00
com.apple.finalcutstudio.media.uuid: 3B712819-1D1D-4F9B-8593-01656870A04C
encoder : Lavf57.34.103
Stream #0:0(eng): Video: h264 (avc1 / 0x31637661), yuv420p, 1920x1080, q=2-31, 9019 kb/s, 0.04 fps, 25 tbr, 10k tbn (default)
Metadata:
creation_time : 2013-10-29 21:33:33
handler_name : Apple Video Media Handler
encoder : H.264
Stream #0:1(eng): Audio: aac (LC) (mp4a / 0x6134706D), 44100 Hz, stereo, 307 kb/s (default)
Metadata:
creation_time : 2013-10-29 21:33:33
handler_name : Apple Sound Media Handler
Stream mapping:
Stream #0:0 -> #0:0 (copy)
Stream #0:1 -> #0:1 (copy)
Press [q] to stop, [?] for help
frame= 5125 fps=0.0 q=-1.0 Lsize= 233585kB time=00:03:25.00 bitrate=9333.9kbits/s speed= 547x
video:225709kB audio:7706kB subtitle:0kB other streams:0kB global headers:0kB muxing overhead: 0.072599%
Los formatos de transmisión mantienen marcas de tiempo para cada cuadro, ya sea de audio o video, que rigen cuándo el jugador debe presentarlos. Esos grandes tiempos de inicio distintos de cero generalmente ocurren cuando se corta un fragmento de un video más largo y la herramienta utilizada no restablece las marcas de tiempo. Aunque si este FLV se grabó solo, entonces es extraño.
En cualquier caso, ejecutar el siguiente comando debería solucionar el problema.
ffmpeg -i input.flv -c copy output.flv
gergely lukacsy
gian
gergely lukacsy
gian
gergely lukacsy
<Delay>1h 0mn</Delay>
. FFmpeg insinúa lo mismo con latimecode : 01:00:00:00
parte... Creo que el problema particular con el archivo .mov es tan raro que no debería recibir más atención (básicamente 1 de 1200+ otros archivos).gian
ffmpeg -i in.mov -c copy -timecode 00:00:00:00 out.mov
gergely lukacsy
-timecode
opción funcionó! ¡Gracias!