Stellen Sie sicher, dass Audio- und Videospur GENAU gleich lang sind

Stellen Sie sicher, dass Audio- und Videospur GENAU gleich lang sind

Ich generiere 200 Videodateien basierend auf Audiodateien, die mit generiert wurden sox, kombiniert mit Bilddateien. Die meisten Clips sind kürzer als eine Sekunde, keiner ist länger als 6. Ich verkette diese Dateien dann und es gibt eine Gesamtverzögerung von etwa 2 Sekunden im Endergebnis.

Ich glaube, das liegt möglicherweise daran, dass Audio- und Videospuren unabhängig voneinander aneinandergereiht werden.

Die genaue Dauer der Video- und Audiospur (Stream) kann ich mit ffprobe herausfinden. Allein in einer der kurzen Dateien kann ich sehen, dass die Dauern unterschiedlich sind:

ffprobe file001.webm
Input #0, matroska,webm, from 'file001.webm':
  Metadata:
    ENCODER         : Lavf58.20.100
  Duration: 00:00:00.92, start: 0.000000, bitrate: 211 kb/s
    Stream #0:0: Video: vp8, yuv420p, 1100x140, SAR 1:1 DAR 55:7, 25 fps, 25 tbr, 1k tbn, 1k tbc (default)
    Metadata:
      ENCODER         : Lavc58.35.100 libvpx
      DURATION        : 00:00:00.923000000
    Stream #0:1: Audio: vorbis, 48000 Hz, stereo, fltp (default)
    Metadata:
      ENCODER         : Lavc58.35.100 libvorbis
      DURATION        : 00:00:00.908000000

Wie kann ich erreichen, dass Video- und Audiospuren in einer Videodatei absolut exakt gleich lang sind?

Ich verwende vpx/vorbix/webm (nachdem ich die Ursache der Probleme mit mpeg2ts nicht verstehen konnte), aber ich verwende jedes Format, um es hinzubekommen.

Ich kann dem Audio auch Stille-Padding hinzufügen, damit die Dauer übereinstimmt.

Antwort1

Es lohnt sich im Grunde nicht. Audioframes haben eine feste Dauer, abhängig vom Codec und der Abtastrate. AAC hat beispielsweise eine 1024/Abtastrate. Z. B. 1024/48000 ~ 21,333 ms. Wenn Sie Ihr Video also auf ein Vielfaches davon neu abtasten, wäre es theoretisch exakt. Vorausgesetzt, der Container ändert es überhaupt nicht. Andernfalls können Sie den Audio-Encoder ändern, um die Anzahl der verwendeten Priming-Samples zu steuern, wodurch Sie einen partiellen ersten Audioframe erhalten könnten. Aber auch hier ist jeder Codec anders. Andernfalls können Sie VFR verwenden und die endgültige Framedauer manuell einstellen, wenn der Container dies unterstützt. Schließlich können Sie die Bearbeitungsliste in mp4 ändern und einen Player verwenden, der die Unterstützung garantiert.

Ich weiß nicht, ob es von der Stange Werkzeuge gibt, die diese Dinge erledigen können.

verwandte Informationen