Verbinden Sie Audio-Tracks effizient von AVI zu MP4

556
Proxycon

Ich habe zweimal etwa 100 Videos (Episoden einer Serie).

  1. [avi] 720p Videoauflösung mit meinen bevorzugten Audiospuren
  2. [mp4] 1080p aber die falsche Sprache

Natürlich möchte ich ein gutes Video mit meiner bevorzugten Sprache haben . Wenn es möglich ist, möchte ich beide Audio-Optionen beibehalten.

Ich habe versucht, sie manuell mit einem mp4-Joiner (GUI für mp4box) zu verbinden, aber das dauert ewig. Ich würde gerne einige Vorschläge zur Automatisierung und Optimierung dieses Prozesses sehen.

1
Mögliches Duplikat von [So ersetzen Sie einen Audiostrom in einer Videodatei mit mehreren Audioströmen?] (Https://superuser.com/questions/800234/how-to-replace-an-audio-stream-in-a-video -File-with-Multiple-Audio-Streams) Vlastimil Ovčáčík vor 6 Jahren 0

1 Antwort auf die Frage

1
slhck

Sie können dies mit ffmpeg (Download eines statischen Builds) sehr einfach wie folgt durchführen :

ffmpeg -i input.mp4 -i input.avi -c copy -map 0:v:0 -map 1:a output.mp4 

Dies wird Karte die folgenden Ströme in die Ausgabedatei:

  • der erste Videokanal des ersten Eingangs ( 0:v:0)
  • die Audiokanäle des zweiten Eingangs ( 1:a) - wenn Sie nur den ersten wollen, verwenden Sie 1:a:0usw.

Die Video- und Audioströme werden kopiert, sodass dieser Vorgang schnell abläuft.

Inkompatibles Audio

Wenn die AVI-Datei MP3 für Audiostreams verwendet, können sie keiner MP4-Datei zugeordnet werden. In diesem Fall verwenden Sie:

ffmpeg -i input.mp4 -i input.avi -c:v copy -c:a aac -b:a 192k -map 0:v:0 -map 1:a output.mp4 

Dies würde die Audioströme mit AAC mit 192 kBit / s neu codieren. Die Qualität sollte hoch genug sein, damit Sie keine Artefakte durch das erneute Codieren feststellen.

Oder Sie können MKV als Ausgabecontainer verwenden, der praktisch jeden Codec unterstützt:

ffmpeg -i input.mp4 -i input.avi -c copy -map 0:v:0 -map 1:a output.mkv 

Wie man im Batch läuft

Sie können diesen Befehl in einer Schleife (obvisouly) verwenden, um ihn auf allen Dateien auszuführen, z. B. unter Linux mit Bash. Dabei wird davon ausgegangen, dass die MP4- und AVI-Dateien denselben Basisnamen haben und Sie ihn nur einmal ausführen (andernfalls wird es versucht) auch die Ausgabedateien konvertieren):

for f in *.mp4; do aviFile="$.avi" # replace the extension outputFile="$-output.mp4" # create output filename ffmpeg -i "$f" -i "$aviFile" -c copy -map 0:v:0 -map 1:a "$outputFile" done 

Eine Reihe von Beispielen finden Sie online, wie Sie einen Befehl in einer Windows-Batch-Dateischleife ausführen.

Anstatt die Audiospur neu zu kodieren, würde ich Matroska (MKV) als Container versuchen ... grawity vor 6 Jahren 0
Wenn Sie Audio und Video synchronisieren müssen, können Sie den Verzögerungsfilter verwenden. Hier ein Beispiel für Stereo-Audio, das um 10 Sekunden verzögert ist: `-filter: a: 0" adelay = 10000 ^ | 10000 "`. (`^` ist ein Escape-Zeichen für die Windows-Befehlszeile.) Vlastimil Ovčáčík vor 6 Jahren 0
@ VlastimilOvčáčík Ja, wenn Sie diesen Filter verwenden, müssen Sie ihn jedoch neu codieren. In diesem Fall können Sie den Stream nicht kopieren. Mit dem Parameter "-itsoffset" können auch Eingangssignale verschoben werden, ohne dass ein Filter erforderlich ist. slhck vor 6 Jahren 0
Ich bin vielleicht falsch, aber "-itsoffset" fügt der entstandenen Lücke keine Stille hinzu, während "adelay" dies tut. Mein * MPC-HC * -Spieler war darüber verwirrt und mit zusätzlicher Stille gab es kein Problem. Vlastimil Ovčáčík vor 6 Jahren 0