[audio] ffmpeg를 사용하여 비디오에 새 오디오 (믹싱하지 않음)를 추가하는 방법은 무엇입니까?

나는 다음과 같은 명령을 사용했다 :

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

비디오에 새로운 오디오 트랙을 추가하기위한 최신 버전 (믹스 아님).

그러나 ffmpeg를 최신 버전 ( ffmpeg 버전 git-2012-06-16-809d71d )으로 업데이트했지만 이 버전에서는 매개 변수 -newaudio가 작동하지 않습니다.

을 사용하여 비디오에 새로운 오디오를 추가하는 방법 (믹스 아님)을 알려주십시오 ffmpeg.



답변

비디오에 오디오 추가 : 스트림 복사

ffmpeg -i video.avi -i audio.mp3 -codec copy -shortest output.avi
  • -map옵션을 생략하면 기본 스트림 선택 이 사용됩니다 . 비디오 입력에 오디오가없는 경우 작동합니다.
  • 이 예는 복사-codec copy스트리밍 하는 데 사용 됩니다 (재 인코딩 없음, 품질이 유지되고 빠름).
  • -shortest옵션은 output.avi가장 짧은 입력과 동일한 지속 시간을 만듭니다 .

비디오에 오디오 추가 : 다시 인코딩

출력이 원래 형식을 좋아하지 않거나 형식을 변경하려는 경우 인코더를 지정할 수 있습니다.

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

특정 스트림을 수동으로 선택하려면

때로는 기본 스트림 선택으로 원하는 결과를 얻지 못할 수 있습니다. 이 예 video.mp4에는 비디오 오디오 audio.m4a가 있으며 오디오 만 있습니다. -map에서 비디오 video.mp4및 오디오 를 선택하는 데 사용하십시오 audio.m4a.

ffmpeg -i video.mp4 -i audio.m4a -map 0:v -map 1:a -c copy -shortest output.mp4
  • -map 0:v– 입력 0(첫 번째 입력, 즉 video.mp4)에서 v이데 오 스트림을 선택하십시오 .
  • -map 1:a– 입력 1(두 번째 입력 인 audio.m4a)에서 audio 스트림을 선택하십시오 .

두 개의 오디오 입력을 하나로 믹싱 / 결합

에서 비디오를 촬영 video.webm하고, 사용 amerge 필터 에서 오디오를 결합 video.webm하고 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

조용한 오디오 생성

anullsrc 필터 를 사용하여 자동 오디오 스트림을 만들 수 있습니다 . 필터를 사용하면 원하는 채널 레이아웃 (모노, 스테레오, 5.1 등)과 샘플 속도를 선택할 수 있습니다.

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

참조


답변

wav로 mp3 음악

ffmpeg -i music.mp3 music.wav

비디오에 맞게 자르기

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

음악과 비디오 믹스

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


답변

입력 비디오에 여러 개의 오디오 트랙이 있고 하나 더 추가해야하는 경우 다음 명령을 사용하십시오.

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

-map 0는 첫 번째 입력 파일 ( input_video_with_audio.avi) 에서 모든 스트림을 복사 (포함)하고 두 번째 입력 파일 ( ) -map 1에서 모든 스트림 (이 경우 하나)을 포함하는 것을 의미합니다 new_audio.ac3.


답변

이 솔루션 중 어느 것도 나를 위해 일한 적이 없습니다. 원래 오디오를 덮어 쓰거나 더 복잡한 ‘암호’예제와 함께 “메모리를 매핑하지 못했습니다”와 같은 오류가 발생했습니다. -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


답변

아무것도 나를 위해 전혀 효과가 없었습니다 (내 입력 .mp4 비디오에 오디오가 없었기 때문이라고 생각합니다).

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


답변

이전 버전의 FFMPEG를 사용하고 있고 업그레이드 할 수없는 경우 다음을 수행 할 수 있습니다.

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

-vcodec를 사용 했습니다.


답변

ffmpeg를 사용하여 비디오에 오디오를 추가하는 코드입니다.

오디오 길이가 비디오 길이보다 길면 오디오를 비디오 길이로 자릅니다. 비디오에서 전체 오디오를 원하면 cmd에서 -shortest를 제거하십시오.

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());
            }


        }