Jak dodać nowy dźwięk (nie miksowanie) do wideo za pomocą ffmpeg?

Użyłem komendy typu:

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

W najnowszej wersji do dodawania nowej ścieżki audio do wideo (nie mix).

Ale zaktualizowałem ffmpeg do najnowszej wersji ( FFmpeg wersja git-2012-06-16-809d71d) i teraz w tej wersji parametr -newaudio nie działa.

Powiedz mi proszę, jak Mogę dodać nowy dźwięk do mojego wideo (nie mix) za pomocą ffmpeg.

Author: Mateusz Piotrowski, 2012-08-02

6 answers

Dodaj audio Do Wideo: stream copy

ffmpeg -i video.avi -i audio.mp3 -codec copy -shortest output.avi
  • pominięcie opcji -map użyje domyślnego wyboru strumienia . Będzie to działać, jeśli wejście wideo nie ma dźwięku.
  • ten przykład używa -codec copy do stream copy (bez ponownego kodowania; jakość jest zachowana i jest szybka).
  • opcja -shortest da output.avi taki sam czas trwania jak najkrótsze wejście.

Dodaj audio do wideo: re-encode

Jeśli twoje wyjście nie podoba się formaty oryginalne, lub jeśli chcesz zmienić formaty, możesz podać kodery:

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

Aby ręcznie wybierać określone strumienie

Czasami wybór domyślnego strumienia nie daje pożądanego wyniku. W tym przykładzie video.mp4 ma wideo i audio, a audio.m4a ma tylko dźwięk. Użyj -map, aby wybrać wideo z video.mp4 i audio z audio.m4a:

ffmpeg -i video.mp4 -i audio.m4a -map 0:v -map 1:a -c copy -shortest output.mp4
  • -map 0:v - z wejścia 0 (pierwsze wejście, czyli video.mp4) wybierz v ideo stream(s).
  • -map 1:a - Z Wejścia 1 (drugie wejście, którym jest audio.m4a) wybierz strumień(y) a udio.

Miksowanie / łączenie dwóch wejść audio w jedno

Weź wideo z video.webm i użyj filtr amerge, Aby połączyć dźwięk z video.webm i 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

Generowanie cichego dźwięku

Możesz użyć filtra anullsrc , Aby utworzyć cichy strumień audio. Filtr pozwala wybrać żądany układ kanałów (mono, stereo, 5.1, itp.) oraz częstotliwość próbkowania.

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

Zobacz też

 206
Author: LordNeckbeard,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2017-05-23 10:31:35

Muzyka Mp3 do wav

ffmpeg -i music.mp3 music.wav

Truncate, aby dopasować wideo

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

Mix muzyki i wideo

ffmpeg -i musicshort.wav -i movie.avi final_video.avi
 17
Author: jwilson,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2012-09-24 05:55:19

Jeśli wejściowe wideo ma wiele ścieżek audio i musisz dodać jeszcze jedną, użyj następującego polecenia:

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

-map 0 oznacza kopiowanie (dołączanie) wszystkich strumieni z pierwszego pliku wejściowego (input_video_with_audio.avi) i -map 1 oznacza dołączanie wszystkich strumieni (w tym przypadku jeden) z drugiego pliku wejściowego (new_audio.ac3).

 7
Author: user2513149,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2017-05-23 13:21:01

Żadne z tych rozwiązań nie zadziałało. Mój oryginalny dźwięk był nadpisywany lub otrzymywałem błąd w stylu "nie udało się zmapować pamięci" z bardziej złożonym przykładem "amerge". Wygląda na to, że potrzebowałem-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
 1
Author: Tod,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2018-01-13 20:42:34

Jeśli używasz starej wersji FFMPEG i nie możesz uaktualnić, możesz wykonać następujące czynności:

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

Zauważ, że użyłem - vcodec

 0
Author: Waqleh,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2016-02-15 11:06:36

Kod do dodawania audio do wideo za pomocą ffmpeg.

Jeśli długość dźwięku jest większa niż długość wideo, spowoduje to przecięcie audio na długość wideo. Jeśli chcesz full audio in video Usuń-najkrótszy z 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());
            }


        }
 -1
Author: Hangman,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2017-03-31 05:23:28