Как добавить новый звук (не смешивая) в видео с помощью 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.
6 ответов:
добавить аудио в видео: потоковое копирование
ffmpeg -i video.avi -i audio.mp3 -codec copy -shortest output.avi
- пропуск
-mapопция будет использовать значение по умолчанию выбор потока. Это будет работать, если ваш видеовход не имеет звука.- в этом примере используется
-codec copyдо трансляция копия (без перекодирования; качество сохраняется, и это быстро).- The сделает
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) выберитеvideo поток (ы).-map 1:a– от ввода1(второй вход, который составляетaudio.m4a) выберитеaсдается потока(ов).смешивание / объединение двух аудиовходов в один
снимать видео с
video.webm, и использовать amerge filter чтобы объединить аудио из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 filter для создания бесшумного аудиопотока. Фильтр позволяет выбрать нужный макет канала (моно, стерео, 5.1 и т. д.) и частоту дискретизации.
ffmpeg -i video.mp4 -f lavfi -i anullsrc=channel_layout=stereo:sample_rate=44100 \ -c:v copy -shortest output.mp4см. Также
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
если входное видео имеет несколько звуковых дорожек, и вам нужно добавить еще одну, то используйте следующую команду:
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).
ни одно из этих решений работал для меня. Мой оригинальный звук был перезаписан, или я получал ошибку, такую как "не удалось сопоставить память" с более сложным примером "amerge". Кажется, мне нужен-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
Если вы используете старую версию 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.
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()); } }
Comments