Hallo,
ich bin sehr neu im Bereich des Films bzw. der Bearbeitung und ähnlichem.
Mein Anliegen: Ich möchte sagen können, wenn ich einen bestimmten Ausschlag in der Audiospur (wav-Format) bei einem bestimmten Sample sehe; dieses Sample im Audiostream gehört ganz klar zu diesem Bildframe.
Das ganze hat schon funktioniert, aber ich möchte mir sicher gehen, dass es auch verlässlich ist.
Mein Vorgehen: Ich nehme ein Video auf, dabei erzeuge ich zu einem bestimmten Zeitpunkt einen lauten Ton und gleichzeitig das Aufleuchten einer LED, beides wird von der Kamera (Bild und Audio) erfasst. Hinterher extrahiere ich mit ffmpeg die Audiospur in eine eigene Datei.wav. Diese untersuche ich in C++ mit der Bibliothek libsndfile und finde damit heraus, bei welchem Sample genau zum ersten Mal der Ton zu hören ist. Dann führe ich ein paar Rechnungen durch, die mir sagen, dass dieses Sample genau zu diesem Frame im Bild aufgenommen wurde. Ich schaue mir dann hinterher das berechnete Frame und das Frame davor an um zu sehen, ob ich richtig gerechnet habe. Es hat geklappt. In dem Frame, welches ich über das Sample berechnet hatte, ging die LED das erste mal an. Also war es erfolgreich.
Bei dem ganzen gehe ich davon aus, dass ich eine konstante Bitrate (Audio), also immer die gleiche Samplingrate (hier 48000 Hz) und eine konstante Framerate (Video), also immer die gleiche fps (hier 29,97) habe. Die Schlüsselwörter für mich sind hierbei "KONSTANTE RATE".
Mit dem Wissen über die fps und die Samplingrate (gegenrechnet mit der Anzahl an Frames im Video und der Anahl der Samples im Audio) komme ich auf 1601,6 Audiosample/Videoframe.
Die eigentliche Frage die ich habe kommt jetzt:
Kann ich (bei konstanter fps und konstanter Samplingrate) sagen, die ersten 1601,6 Audiosample gehören dem ersten Frame an. Sample 1602 bis 3204 ungefähr gehören dem zweiten Frame an und immer so weiter?
Oder kann es mal sein, dass trotz konstanter Rate auch mal zum Beispiel zu einem Frame 1500 Sample gehören und zu einem anderen zufälligerweise 1700 (um am Ende wieder bei sagen wir der errechneten Anzahl an Samples pro Frame rauszukommen (hier 1601)).
Müsste ich in diesem Fall mit keyframes arbeiten? Bzw. mit keysamples beim Audio. Also dass im Container die Information gespeichert ist, welche Sample ganz genau zu welchem Frame gehören. Wenn ja (oder wenn es sowieso kein allzu großer Aufwand ist), wie könnte ich rausbekommen (über den Container und Zugriff über ffmpeg oder ähnliche Bibliotheken) welches Sample (z.B Nr. 302938 zu) zu genau welchem Frame gehört?
Falls es nicht so einfach ist, oder es nicht nötig ist errechne ich eben immer über die Position im Audiostream die dazugehörige Position im Videostream. Komme so zum Beispiel bei Frame 78,7 raus. Es muss nicht super genau sein. Aber die Genauigkeit sollte auch unter 40ms Abweichung bleiben.
Danke für eure Hilfe
Gruß Tim