Audiovisuelle Inhalte verlieren die Synchronisation
343
Darkmoor
Ich habe eine .mp4Videodatei, die von einer unkomprimierten .aviKamera stammt emgu. Der Emgu videoWriterist so eingestellt, dass 30fpssogar das reale Video fpsmöglicherweise niedriger ist, z 29fps. Der Befehl, der zum Komprimieren verwendet wird, .avilautet:
Zusätzlich zu dieser Videoaufnahme habe ich eine .wavDatei, die von einem anderen Gerät stammt. Ich versuche diese mit dem folgenden Befehl mit dem Inhalt zu synchronisieren:
Ich möchte erwähnen, dass sowohl Audio als auch Video einen gemeinsamen Anfang haben. Während der audiovisuelle Inhalt zu Beginn eine gute Synchronisation aufweist, geht die Synchronisation am Ende der Aufzeichnung verloren. Könnten Sie bitte einen Vorschlag machen, was passiert?
Ihre Hilfe wird sehr geschätzt, danke.
@slhck Ja, ich habe ein Refactoring gemacht und mehr Details zur aktuellen Situation gemacht. Daher dachte ich, es wäre besser, wenn man vom Betteln aus eine andere Perspektive einnimmt. Wenn man es hüpft, wird es anderen helfen, mehr zu verstehen. Ich hoffe es ist kein großes Problem.
Darkmoor vor 7 Jahren
0
@slhck Ich glaube, ich habe den Grund meines Problems. Das komprimierte Video hat während der gesamten Aufnahme keine konstanten "fps". Darf ich fragen, ob es möglich ist, ein Video mit nicht konstanten fps mit "ffmpeg" in konstante eins umzuwandeln?
Darkmoor vor 7 Jahren
0
Wenn Sie den Parameter `-r` im Komprimierungsbefehl mit einem fps unter dem tatsächlichen Wert verwenden, wird ein konstantes Bildfrequenz-Bild (.mp4) bereitgestellt?
Darkmoor vor 7 Jahren
0
Ich bin mir nicht sicher, ich bin in letzter Zeit nicht auf variable Video-Frameraten gestoßen. Hast du eine Probe? Haben Sie die `force-crf`-Option ausprobiert?
slhck vor 7 Jahren
0
@slhck Entschuldigung für die Verzögerung. Ich habe getestet, das Video mit der Option "force-crf" zu komprimieren, funktionierte jedoch nicht. Darf ich fragen, ob es eine mögliche Option für das Audio ".wav" gibt, die nicht immer eine konstante Sample-Rate hat?
Darkmoor vor 7 Jahren
0
@slhck danke für die Antwort. Ich möchte noch einen letzten Versuch machen, also lassen Sie mich bitte folgendes fragen. Wie in der Frage beschrieben, unterscheiden sich die tatsächlichen "fps" des Streams von den gespeicherten über "opencv". Ist es möglich, die "fps" während der Komprimierung oder danach zu ändern? Ist das auch für die `.wav`-Datei möglich? Danke noch einmal!
Darkmoor vor 7 Jahren
0
Ich habe unten eine ausführlichere Antwort geschrieben. Wenn Sie einige Beispiele sehen, hilft dies bei der Fehlerbehebung, aber so wie ich Ihr Problem jetzt verstehe, scheint es unmöglich, es zu beheben.
slhck vor 7 Jahren
0
1 Antwort auf die Frage
1
slhck
Ich denke, das Problem ist, dass Ihr Eingangsvideo aufgrund der Kodierung bereits falsche Zeitstempel hat. Ich verstehe, dass das ursprüngliche Webcam-Video Frames mit variabler Länge (dh ein Video mit variabler Framerate) ausgegeben hat, aber eine unkomprimierte AVI-Datei kann nur Frames mit konstanter Länge speichern .
Beim Lesen dieser AVI-Datei (oder einer darauf folgenden komprimierten MP4-Datei) geht ffmpeg davon aus, dass es sich um ein Video mit konstanter Bildrate handelt. Dies führt dazu, dass sich mit der Zeit eine Asynchronität "aufbaut", da die Zeitstempel in Ihrem AVI / MP4 konstante Offsets aufweisen. ffmpeg kann dies nicht für Sie beheben, da die Eingabezeitstempel bereits falsch sind. In anderen Worten, ich gehe davon aus, dass videoWriterSie ein Video mit konstanter Bildrate aus einer variablen Bildrate erstellt haben und falsche Zeitstempel erstellen. Ohne zu wissen, wann oder wie sich die Framerate geändert hat, können Sie die Zeitstempel nicht festlegen.
Die einzige Option wäre, den Videostream von der Webcam mit einem Container neu zu generieren, der eine variable Bildrate unterstützt (z. B. MKV oder MP4 / MOV). Bei einer späteren Konvertierung könnte der Inhalt dann mit einem Audiostrom synchronisiert werden. Da dieser Webcam-Feed jedoch wahrscheinlich live ist, gibt es keine Möglichkeit, zurück zu kehren. Ich glaube auch nicht, dass OpenCV auch eine videoWritervariable Framerate ausgeben kann (aber ich bin kein Experte dafür).
Hinweis: Es ist einfacher, dieses Problem zu beheben, wenn das Originalvideo mit einer falschen konstanten Bildrate codiert wurde . Sie könnten dann ffmpeg zwingen, eine andere Bildfrequenz für das Eingangsvideo anzunehmen, die ursprünglichen Zeitstempel effektiv zu entfernen und neue zu erzeugen, wobei eine konstante Bildrate angenommen wird. Wenn Ihre Videokonvertierung beispielsweise ein 30-fps-Video erstellt hat, der ursprüngliche Eingang jedoch 29 fps war, gehen Sie folgendermaßen vor: