如何使用ffmpeg将新的audio(不混音)添加到video中?
我使用了如下命令:
ffmpeg -i video.avi -i audio.mp3 -vcodec codec -acodec codec output_video.avi -newaudio
在最新版本中添加新的音轨到video(不混合)。
但我更新了ffmpeg到最新版本( ffmpeg版本git-2012-06-16-809d71d ),现在在这个版本中参数-newaudio
不起作用。
请告诉我如何使用ffmpeg
将新audio添加到我的video(不混合)。
添加audio到video:stream复制
ffmpeg -i video.avi -i audio.mp3 -codec copy -shortest output.avi
- 省略
-map
选项将使用默认streamselect 。 如果您的videoinput没有audio,这将工作。 - 此示例使用
-codec copy
来-codec copy
stream (不进行重新编码;质量保留且速度快)。 -
-shortest
选项将使output.avi
与最短input的持续时间相同。
将audio添加到video:重新编码
如果您的输出不喜欢原始格式,或者您想要更改格式,则可以指定编码器:
ffmpeg -i video.avi -i audio.mp3 -c:v libx264 -c:a libvorbis -shortest output.mkv
手动select特定的stream
有时默认streamselect不会给你你想要的结果。 在这个例子中, video.mp4
有video和audio,而audio.m4a
只有audio。 使用-map
从video.mp4
selectvideo,从video.mp4
selectaudio:
ffmpeg -i video.mp4 -i audio.m4a -map 0:v -map 1:a -c copy -shortest output.mp4
-
-map 0:v
– 从input0
(第一个input,即video.mp4
)中selectvideostream。 -
-map 1:a
– 从input1
(第二个input,即audio.m4a
)中selecta
audiostream(s)。
将两个audioinput混合/组合成一个
从video.webm
获取video,并使用amergefilter将video.webm
和audio.oga
的audioaudio.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
生成无声audio
您可以使用anullsrcfilter来创build一个无声的audiostream。 该滤波器允许您select所需的声道布局(单声道,立体声,5.1等)和采样率。
ffmpeg -i video.mp4 -f lavfi -i anullsrc=channel_layout=stereo:sample_rate=44100 \ -c:v copy -shortest output.mp4
另见
- 将两个audiostream合并为一个
- FFmpeg Wiki:audio通道操作
- FFmpeg复合video和audio从另一个video
MP3音乐到WAV
ffmpeg -i music.mp3 music.wav
截断以适应video
ffmpeg -i music.wav -ss 0 -t 37 musicshort.wav
混合音乐和video
ffmpeg -i musicshort.wav -i movie.avi final_video.avi
如果input的video有多个audio轨道,并且您需要添加一个,请使用以下命令:
ffmpeg -i input_video_with_audio.avi -i new_audio.ac3 -map 0 -map 1 -codec copy output_video.avi
-map 0
表示从第一个input文件( input_video_with_audio.avi
)复制(包含)所有stream, -map 1
表示包含来自第二个input文件( new_audio.ac3
)的所有stream(在本例中为1)。
如果您使用的是旧版本的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将audio添加到video的代码。
如果audio长度大于video长度,则会将audio剪切为video长度。 如果你想在video中完整的audio从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()); } }