Làm cách nào để thêm âm thanh mới (không trộn) vào video bằng ffmpeg?


131

Tôi đã sử dụng một lệnh như:

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

trong phiên bản mới nhất để thêm bản âm thanh mới vào video (không trộn).

Nhưng tôi đã cập nhật ffmpeg lên phiên bản mới nhất (phiên bản ffmpeg git-2012-06-16-809d71d ) và bây giờ trong phiên bản này, tham số -newaudionày không hoạt động.

Hãy cho tôi biết làm thế nào tôi có thể thêm âm thanh mới vào video của mình (không trộn) bằng cách sử dụng ffmpeg.


@Kiquenet Vâng, bạn nói đúng. Và câu trả lời đã được đưa ra. Chỉ cần đọc chủ đề này. Câu hỏi này là 5 tuổi.
Vetalll

Bằng cách thêm âm thanh mới, bạn có nghĩa là thay thế âm thanh, phải không? Tôi có thể chỉnh sửa câu hỏi của bạn để làm cho rõ ràng.
tommy.carstensen

Câu trả lời:


295

Thêm âm thanh vào video: sao chép luồng

ffmpeg -i video.avi -i audio.mp3 -codec copy -shortest output.avi
  • Bỏ -maptùy chọn sẽ sử dụng lựa chọn luồng mặc định . Điều này sẽ hoạt động nếu đầu vào video của bạn không có âm thanh.
  • Ví dụ này sử dụng -codec copyđể truyền phát bản sao (không mã hóa lại; chất lượng được bảo toàn và nhanh chóng).
  • Các -shortesttùy chọn sẽ làm cho output.avithời gian tương tự như các đầu vào ngắn nhất.

Thêm âm thanh vào video: mã hóa lại

Nếu đầu ra của bạn không thích các định dạng ban đầu hoặc nếu bạn muốn thay đổi định dạng, bạn có thể chỉ định các bộ mã hóa:

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

Để chọn thủ công các luồng cụ thể

Đôi khi, lựa chọn luồng mặc định sẽ không cung cấp cho bạn kết quả bạn muốn. Trong ví dụ video.mp4này có video âm thanh, và audio.m4achỉ có âm thanh. Sử dụng -mapđể chọn video từ video.mp4và âm thanh từ audio.m4a:

ffmpeg -i video.mp4 -i audio.m4a -map 0:v -map 1:a -c copy -shortest output.mp4
  • -map 0:v- Từ đầu vào 0(đầu vào đầu tiên, đó là video.mp4) chọn v(các) luồng ideo.
  • -map 1:a- Từ đầu vào 1( đầu vào thứ hai, đó là audio.m4a) chọn aluồng udio.

Trộn / kết hợp hai đầu vào âm thanh thành một

Lấy video từ video.webmvà sử dụng bộ lọc amerge để kết hợp âm thanh từ video.webmaudio.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

Tạo âm thanh im lặng

Bạn có thể sử dụng bộ lọc anullsrc để tạo luồng âm thanh im lặng. Bộ lọc cho phép bạn chọn bố cục kênh mong muốn (đơn âm, âm thanh nổi, 5.1, v.v.) và tốc độ mẫu.

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

Cũng thấy


5
Điều này ban đầu không hiệu quả với tôi, nhưng sử dụng -map 0:0 -map 1:0thay vì -map 0 -map 1thực hiện mánh khóe cho tôi. Cảm ơn!
yonix

Điều này chèn một khung trống ở đầu.
Lenar Hoyt

Tôi đã thử lệnh này, nhưng tôi mất âm thanh video. định dạng video của tôi là mp4
Allan

@ Allan.Chan Câu hỏi ban đầu không muốn âm thanh từ đầu vào video, nhưng tôi đã thêm một ví dụ khác: xem phần Trộn / kết hợp một ví dụ đầu vào âm thanh khác .
llogan

Giải pháp đầu tiên mà không có -shortesttùy chọn làm việc tốt hơn cho tôi.
mmj

24

nhạc mp3 để wav

ffmpeg -i music.mp3 music.wav

cắt ngắn để phù hợp với video

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

trộn nhạc và video

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

3
như tôi nhớ, biến thể cuối cùng sẽ thay thế âm thanh cũ bằng âm thanh mới.
Vetalll

Có tùy chọn nào để hợp nhất âm thanh mới với âm thanh cũ không?
Iqbal Malik

1
@jwilson Tôi đã thử lệnh này, nhưng tôi bị mất âm thanh video. định dạng video của tôi là mp4
Allan

@ Allan giải pháp cho không mất?
Kiquenet

20

Nếu video đầu vào có nhiều rãnh âm thanh và bạn cần thêm một đoạn nữa thì hãy sử dụng lệnh sau:

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

-map 0có nghĩa là sao chép (bao gồm) tất cả các luồng từ tệp đầu vào đầu tiên ( input_video_with_audio.avi) và -map 1có nghĩa là bao gồm tất cả các luồng (trong trường hợp này là một) từ tệp đầu vào thứ hai ( new_audio.ac3).


Tôi nghĩ rằng, câu trả lời này phải là câu trả lời tốt nhất.
Nabi KAZ

3

Không có giải pháp nào trong số này làm việc cho tôi. Âm thanh ban đầu của tôi đã bị ghi đè hoặc tôi gặp lỗi như "không thể ánh xạ bộ nhớ" với ví dụ 'amerge' phức tạp hơn. Có vẻ như tôi cần -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

Không có gì khá hiệu quả đối với tôi (tôi nghĩ rằng đó là do video .mp4 đầu vào của tôi không có bất kỳ âm thanh nào) vì vậy tôi thấy điều này hiệu quả với tôi:

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


0

Nếu bạn đang sử dụng phiên bản cũ của FFMPEG và bạn không thể nâng cấp, bạn có thể làm như sau:

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

Lưu ý rằng tôi đã sử dụng -vcodec


0

Mã để thêm âm thanh vào video bằng cách sử dụng ffmpeg.

Nếu độ dài âm thanh lớn hơn độ dài video, nó sẽ cắt âm thanh thành độ dài video. Nếu bạn muốn âm thanh đầy đủ trong video loại bỏ -shortest từ 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());
            }


        }

Environment.getExternalStorageDirectory().getAbsolutePath()+"/videoaudiomerger/"+"Vid"+"output"+i1+".mp4");
Kiquenet
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.