Wie füge ich einem Video mit ffmpeg ein neues Audio hinzu (ohne es zu mischen)?

131

Ich habe einen Befehl verwendet wie:

ffmpeg -i video.avi -i audio.mp3 -vcodec codec -acodec codec output_video.avi -newaudio

in der neuesten Version zum Hinzufügen einer neuen Audiospur zum Video (nicht mischen).

Aber ich habe das ffmpeg auf die neueste Version aktualisiert ( ffmpeg Version git-2012-06-16-809d71d ) und jetzt in dieser Version -newaudiofunktioniert der Parameter nicht.

Sagen Sie mir bitte, wie ich meinem Video neues Audio hinzufügen (nicht mischen) kann ffmpeg.

Vetalll
quelle
@Kiquenet Ja, du hast recht. Und die Antwort ist bereits gegeben. Lies einfach diesen Thread. Diese Frage ist 5 Jahre alt.
Vetalll
Mit dem Hinzufügen von neuem Audio meinen Sie das Ersetzen des Audios, richtig? Ich könnte Ihre Frage bearbeiten, um dies klar zu machen.
Tommy.carstensen

Antworten:

295

Audio zu Video hinzufügen: Stream-Kopie

ffmpeg -i video.avi -i audio.mp3 -codec copy -shortest output.avi
  • Wenn Sie die -mapOption weglassen, wird die Standard- Stream-Auswahl verwendet . Dies funktioniert, wenn Ihr Videoeingang kein Audio enthält.
  • In diesem Beispiel wird -codec copydas Kopieren von Kopien verwendet (keine Neucodierung; die Qualität bleibt erhalten und ist schnell).
  • Die -shortestOption hat output.avidie gleiche Dauer wie die kürzeste Eingabe.

Audio zu Video hinzufügen: neu codieren

Wenn Ihre Ausgabe die Originalformate nicht mag oder wenn Sie die Formate ändern möchten, können Sie die Encoder angeben:

ffmpeg -i video.avi -i audio.mp3 -c:v libx264 -c:a libvorbis -shortest output.mkv

Manuelle Auswahl bestimmter Streams

Manchmal liefert die Standard-Stream-Auswahl nicht das gewünschte Ergebnis. In diesem Beispiel video.mp4gibt es Video und Audio und audio.m4anur Audio. Verwenden Sie -mapdiese Option , um Video video.mp4und Audio auszuwählen aus audio.m4a:

ffmpeg -i video.mp4 -i audio.m4a -map 0:v -map 1:a -c copy -shortest output.mp4
  • -map 0:v- Wählen Sie aus der Eingabe 0(der ersten Eingabe video.mp4) die vIdeostreams aus.
  • -map 1:a- Wählen Sie aus der Eingabe 1(der zweiten Eingabe audio.m4a) die audio-Streams aus.

Mischen / Kombinieren von zwei Audioeingängen zu einem

Nehmen Sie Videos von video.webmund verwenden Sie den Amerge-Filter , um die Audiodaten von video.webmund zu kombinieren audio.oga:

ffmpeg -i video.webm -i audio.oga -filter_complex \
"[0:a][1:a]amerge=inputs=2[a]" \
-map 0:v -map "[a]" -c:v copy -c:a libvorbis -ac 2 -shortest out.webm

Generieren Sie leises Audio

Sie können den anullsrc-Filter verwenden , um einen stillen Audiostream zu erstellen . Mit dem Filter können Sie das gewünschte Kanallayout (Mono, Stereo, 5.1 usw.) und die Abtastrate auswählen.

ffmpeg -i video.mp4 -f lavfi -i anullsrc=channel_layout=stereo:sample_rate=44100 \
-c:v copy -shortest output.mp4

Siehe auch

llogan
quelle
5
Das hat bei mir zunächst nicht funktioniert, aber für mich hat es den Trick getan , -map 0:0 -map 1:0anstatt -map 0 -map 1es zu verwenden. Vielen Dank!
Yonix
Dies fügt am Anfang einen leeren Rahmen ein.
Lenar Hoyt
Ich habe diesen Befehl ausprobiert, aber ich verliere das Video-Audio. Mein Videoformat ist mp4
Allan
@ Allan.Chan Die ursprüngliche Frage wollte nicht, dass das Audio vom Videoeingang stammt, aber ich habe ein weiteres Beispiel hinzugefügt: Siehe das Mischen / Kombinieren eines anderen Beispiels für den Audioeingang .
Llogan
Die erste Lösung ohne die -shortestOption hat bei mir besser funktioniert.
mmj
24

mp3 musik zu wav

ffmpeg -i music.mp3 music.wav

auf Video zuschneiden

ffmpeg -i music.wav -ss 0 -t 37 musicshort.wav

Musik und Video mischen

ffmpeg -i musicshort.wav -i movie.avi final_video.avi
jwilson
quelle
3
Wie ich mich erinnere, wird die letzte Variante das alte Audio durch neues ersetzen.
Vetalll
Gibt es eine Option, um neues Audio mit altem Audio zusammenzuführen?
Iqbal Malik
1
@jwilson Ich habe diesen Befehl versucht, aber ich verliere das Video-Audio. Mein Videoformat ist mp4
Allan
@Allan Lösung für nicht verlieren?
Kiquenet
20

Wenn das Eingangsvideo mehrere Audiospuren enthält und Sie eine weitere hinzufügen müssen, verwenden Sie den folgenden Befehl:

ffmpeg -i input_video_with_audio.avi -i new_audio.ac3 -map 0 -map 1 -codec copy output_video.avi

-map 0bedeutet, alle Streams aus der ersten Eingabedatei ( input_video_with_audio.avi) zu kopieren (einzuschließen) und -map 1alle Streams (in diesem Fall einen) aus der zweiten Eingabedatei ( new_audio.ac3) einzuschließen .

user2513149
quelle
Ich denke, diese Antwort muss die beste Antwort sein.
Nabi KAZ
3

Keine dieser Lösungen hat bei mir ganz funktioniert. Mein ursprüngliches Audio wurde überschrieben, oder es wurde ein Fehler wie "Speicher konnte nicht zugeordnet werden" mit dem komplexeren Beispiel "Amerge" angezeigt. Es scheint, ich brauchte -filter_complex amix.

ffmpeg -i videowithaudioyouwanttokeep.mp4 -i audiotooverlay.mp3 -vcodec copy -filter_complex amix -map 0:v -map 0:a -map 1:a -shortest -b:a 144k out.mkv
Tod
quelle
1

Für mich hat nichts ganz funktioniert (ich glaube, das lag daran, dass mein MP4-Eingangsvideo kein Audio hatte), also fand ich, dass dies für mich funktioniert hat:

ffmpeg -i input_video.mp4 -i balipraiavid.wav -map 0:v:0 -map 1:a:0 output.mp4

Alexandre Doré
quelle
0

Wenn Sie eine alte Version von FFMPEG verwenden und kein Upgrade durchführen können, können Sie Folgendes tun:

ffmpeg -i PATH/VIDEO_FILE_NAME.mp4 -i PATH/AUDIO_FILE_NAME.mp3 -vcodec copy -shortest DESTINATION_PATH/NEW_VIDEO_FILE_NAME.mp4

Beachten Sie, dass ich -vcodec verwendet habe

Waqleh
quelle
0

Code zum Hinzufügen von Audio zu Video mit ffmpeg.

Wenn die Audiolänge größer als die Videolänge ist, wird das Audio auf Videolänge reduziert. Wenn Sie volles Audio in Video wünschen, entfernen Sie -shortest vom cmd.

String[] cmd = new String[]{"-i", selectedVideoPath,"-i",audiopath,"-map","1:a","-map","0:v","-codec","copy", ,outputFile.getPath()};

private void execFFmpegBinaryShortest(final String[] command) {



            final File outputFile = new File(Environment.getExternalStorageDirectory().getAbsolutePath()+"/videoaudiomerger/"+"Vid"+"output"+i1+".mp4");




            String[] cmd = new String[]{"-i", selectedVideoPath,"-i",audiopath,"-map","1:a","-map","0:v","-codec","copy","-shortest",outputFile.getPath()};


            try {

                ffmpeg.execute(cmd, new ExecuteBinaryResponseHandler() {
                    @Override
                    public void onFailure(String s) {
                        System.out.println("on failure----"+s);
                    }

                    @Override
                    public void onSuccess(String s) {
                        System.out.println("on success-----"+s);
                    }

                    @Override
                    public void onProgress(String s) {
                        //Log.d(TAG, "Started command : ffmpeg "+command);
                        System.out.println("Started---"+s);

                    }

                    @Override
                    public void onStart() {


                        //Log.d(TAG, "Started command : ffmpeg " + command);
                        System.out.println("Start----");

                    }

                    @Override
                    public void onFinish() {
                        System.out.println("Finish-----");


                    }
                });
            } catch (FFmpegCommandAlreadyRunningException e) {
                // do nothing for now
                System.out.println("exceptio :::"+e.getMessage());
            }


        }
Henker
quelle
Was ist Environment.getExternalStorageDirectory().getAbsolutePath()+"/videoaudiomerger/"+"Vid"+"output"+i1+".mp4");?
Kiquenet