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


140

Użyłem polecenia typu:

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

w najnowszej wersji do dodawania nowej ścieżki dźwiękowej do wideo (nie miksowania).

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

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


@Kiquenet Tak, masz rację. Odpowiedź jest już udzielona. Po prostu przeczytaj ten wątek. To pytanie ma 5 lat.
Vetalll

Dodając nowy dźwięk, masz na myśli wymianę dźwięku, prawda? Mogę zmienić twoje pytanie, aby było jasne.
tommy.carstensen

Odpowiedzi:


318

Zastąp dźwięk

schemat wymiany strumienia audio

ffmpeg -i video.mp4 -i audio.wav -map 0:v -map 1:a -c:v copy -shortest output.mp4
  • Ta -mapopcja umożliwia ręczne wybieranie strumieni / ścieżek. Zobacz FFmpeg Wiki: Mapa aby uzyskać więcej informacji.
  • Ten przykład używa -c:v copydo kopiowania strumieniowego (mux) wideo. Nie następuje ponowne kodowanie wideo. Jakość jest zachowana, a proces jest szybki.
    • Jeśli wejściowy format audio jest zgodny z formatem wyjściowym, zmień -c:v copyna, -c copyaby skopiować strumieniowo zarówno wideo, jak i audio.
    • Jeśli chcesz ponownie zakodować wideo i audio, usuń -c:v copy/ -c copy.
  • Plik -shortest opcja sprawi, że czas trwania wyjścia będzie taki sam jak najkrótszego wejścia.

Dodaj dźwięk

schemat dodawania strumienia audio

ffmpeg -i video.mkv -i audio.mp3 -map 0 -map 1:a -c:v copy -shortest output.mkv
  • Plik -mapopcja umożliwia ręczne wybieranie strumieni / ścieżek. Zobacz FFmpeg Wiki: Mapa aby uzyskać więcej informacji.
  • W tym przykładzie zastosowano -c:v copydo kopiowania strumieniowego (mux) wideo. Nie następuje ponowne kodowanie wideo. Jakość jest zachowana, a proces jest szybki.
    • Jeśli wejściowy format audio jest zgodny z formatem wyjściowym, zmień -c:v copyna-c copy aby strumieniowo kopiować oba wideo, jak i audio.
    • Jeśli chcesz ponownie zakodować wideo i audio, usuń -c:v copy/-c copy.
  • Plik -shortest opcja sprawi, że czas trwania wyjścia będzie taki sam jak najkrótszego wejścia.

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

schemat downmixu audio

Użyj wideo z video.mkv. Mix z audio video.mkvi audio.m4astosując filtr amerge :

ffmpeg -i video.mkv -i audio.m4a -filter_complex "[0:a][1:a]amerge=inputs=2[a]" -map 0:v -map "[a]" -c:v copy -ac 2 -shortest output.mkv

Widzieć FFmpeg Wiki: Kanały audio aby uzyskać więcej informacji.

Generuj cichy dźwięk

Możesz użyć filtru anullsrc, aby stworzyć cichy strumień audio. Filtr pozwala wybrać żądany układ kanałów (mono, stereo, 5.1 itd.) I 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 także


5
Na początku to nie zadziałało, ale użycie -map 0:0 -map 1:0zamiast -map 0 -map 1załatwiło sprawę. Dzięki!
yonix,

Spowoduje to wstawienie pustej ramki na początku.
Lenar Hoyt,

Próbowałem tego polecenia, ale tracę dźwięk wideo. mój format wideo to mp4
Allan

@ Allan.Chan Pierwotne pytanie nie wymagało dźwięku z wejścia wideo, ale dodałem inny przykład: zobacz Miksowanie / łączenie innego przykładu wejścia audio .
llogan

Pierwsze rozwiązanie bez -shortestopcji działało lepiej dla mnie.
mmj

25

muzyka mp3 do wav

ffmpeg -i music.mp3 music.wav

przyciąć, aby dopasować wideo

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

miksować muzykę i wideo

ffmpeg -i musicshort.wav -i movie.avi final_video.avi

3
o ile pamiętam, ostatni wariant zastąpi stare audio nowym.
Vetalll

Czy jest jakaś opcja połączenia nowego dźwięku ze starym dźwiękiem?
Iqbal Malik

1
@jwilson Próbowałem tego polecenia, ale tracę dźwięk wideo. mój format wideo to mp4
Allan

Rozwiązanie @Allan, aby nie stracić?
Kiquenet

21

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 0oznacza kopiowanie (dołączanie) wszystkich strumieni z pierwszego pliku wejściowego ( input_video_with_audio.avi) i -map 1oznacza dołączanie wszystkich strumieni (w tym przypadku jednego) z drugiego pliku wejściowego ( new_audio.ac3).


Myślę, że ta odpowiedź musi być najlepszą odpowiedzią.
Nabi KAZ

4

Żadne z tych rozwiązań nie zadziałało w moim przypadku. Mój oryginalny dźwięk był nadpisywany lub otrzymywałem błąd typu „nie udało się zmapować pamięci” w bardziej złożonym przykładzie „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

2

Nic nie działało dla mnie (myślę, że było tak, ponieważ moje wejście wideo .mp4 nie miało żadnego dźwięku), więc stwierdziłem, że to działa dla mnie:

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


0

Jeśli używasz starej wersji FFMPEG i nie możesz zaktualizować, 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

Kod dodawania dźwięku do wideo za pomocą ffmpeg.

Jeśli długość dźwięku jest większa niż długość wideo, spowoduje to obcięcie dźwięku do długości wideo. Jeśli chcesz mieć pełny dźwięk w wideo, usuń -shortest 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());
            }


        }

Co to jest Environment.getExternalStorageDirectory().getAbsolutePath()+"/videoaudiomerger/"+"Vid"+"output"+i1+".mp4");?
Kiquenet
Korzystając z naszej strony potwierdzasz, że przeczytałeś(-aś) i rozumiesz nasze zasady używania plików cookie i zasady ochrony prywatności.
Licensed under cc by-sa 3.0 with attribution required.