Kürzlich musste ich mich mit Videos herumschlagen, die einige spezielle Metadatenattribute haben, nämlich „delay“ oder „delay_relative_to_video“.
Es gibt eine Software-Videokonferenzlösung, die diese speziellen Dateien erstellt, und wenn unsere Videoverarbeitungssoftware diese Dateien untersucht, erhält sie längere Dauerwerte als die tatsächliche Länge des Inhalts, wodurch falsche Daten in der Datenbank gespeichert werden, was in der Nachbearbeitungsphase mehr Probleme verursacht.
Beispielsweise haben wir ein 46 Sekunden langes Video aufgenommen, das als 104,7 Sekunden lang erkannt wurde.
Nachdem die Datei mit FFmpeg und Mediainfo untersucht wurde, stellte sich heraus, dass die Originaldatei einen sogenannten "Verzögerungswert" hatte, der als start
Zeit in der Ausgabe von FFmpeg zu sehen ist:
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
...und Delay
oder Delay_relative_to_video
in Mediainfo's:
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>
"Überraschenderweise" ergibt die Subtraktion der Länge und der Verzögerung die richtige Dauer ...
Außerdem ist es wirklich peinlich, dass einige Encoder-Bibliotheken diese Verzögerungen zur Gesamtlänge zählen, andere jedoch nicht! Anscheinend gibt es keine Möglichkeit zu unterscheiden, welche Längenwerte korrekt sind und welche entsprechend erhöht wurden!
Um es kurz zu machen, ich würde gerne wissen, wofür diese Metadaten verwendet werden? Was ist der Grund für ihre Existenz und warum fügen einige Encoder/Videobearbeitungssoftware diese Metadaten in die Datei ein?
Danke für eure Antworten im Voraus!
Bearbeiten:
Laut Mulvyas Antwort kann das Ausführen einer einfachen Stream-Kopie für die Datei die Zeitstempel zurücksetzen!
Es gab jedoch eine .mov-Datei, bei der es nicht funktionierte. Zugehörige Konsolenausgabe:
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%
Streaming-Formate verwalten Zeitstempel für jeden Frame, ob Audio oder Video, die bestimmen, wann der Player sie präsentieren soll. Diese großen Startzeiten ungleich Null treten normalerweise auf, wenn ein Ausschnitt aus einem längeren Video herausgeschnitten wird und das verwendete Tool die Zeitstempel nicht zurücksetzt. Obwohl, wenn dieses FLV alleine aufgenommen wurde, dann ist es seltsam.
In jedem Fall sollte das Ausführen des folgenden Befehls das Problem beheben.
ffmpeg -i input.flv -c copy output.flv
Gergely Lukácsy
Gyan
Gergely Lukácsy
Gyan
Gergely Lukácsy
<Delay>1h 0mn</Delay>
. FFmpeg deutet das gleiche mit demtimecode : 01:00:00:00
Teil an ... Ich denke, das spezielle Problem mit der .mov-Datei ist so selten, dass es nicht weiter beachtet werden sollte (im Grunde 1 von 1200+ anderen Dateien).Gyan
ffmpeg -i in.mov -c copy -timecode 00:00:00:00 out.mov
Gergely Lukácsy
-timecode
Option hat es geschafft! Danke!