Как добавить новый звук (не смешивание) в видео с помощью ffmpeg?
Я использовал команду вроде:
ffmpeg -i video.avi -i audio.mp3 -vcodec codec -acodec codec output_video.avi -newaudio
в последней версии для добавления новой звуковой дорожки в видео (не микс).
Но я обновил ffmpeg до самой новой версии (ffmpeg version git -2012-06-16-809d71d), и теперь в этой версии параметр -newaudio
не работает.
Скажите, пожалуйста, как я могу добавить новый звук в свое видео (не смешивать) с помощью ffmpeg
.
Ответы
Ответ 1
Добавить аудио в видео: копировать поток
ffmpeg -i video.avi -i audio.mp3 -codec copy -shortest output.avi
- Опускание опции
-map
будет использовать по умолчанию выбор потока. Это будет работать, если ваш видеовход не имеет звука.
- В этом примере используется
-codec copy
to копия потока (без повторного кодирования, качество сохраняется и быстро).
- Параметр
-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
ideo.
-
-map 1:a
- От входа 1
(второй вход, который равен audio.m4a
) выберите a
аудиопоток (ы).
Смешивание/объединение двух аудиовходов в один
Возьмите видео с 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
Также см.
Ответ 2
mp3 музыка к wav
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
Ответ 3
Если входное видео имеет несколько звуковых дорожек, и вам нужно добавить еще один, используйте следующую команду:
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
).
Ответ 4
Ни одно из этих решений не сработало для меня. Мой исходный звук перезаписывался, или я получал сообщение об ошибке типа "не удалось отобразить память" в более сложном примере "слияния". Кажется, мне нужен был -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
Ответ 5
Если вы используете старую версию 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
Ответ 6
У меня ничего не получалось (думаю, это потому, что у моего входного видео .mp4 не было звука), поэтому я обнаружил, что это работает для меня:
ffmpeg -i input_video.mp4 -i balipraiavid.wav -map 0:v:0 -map 1:a:0 output.mp4
Ответ 7
Код для добавления звука в видео с помощью ffmpeg.
Если длина аудио больше, чем длина видео, она сократит длину аудио до видео.
Если вы хотите, чтобы полный звук в видео удалялся -shortest из 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());
}
}