Audio 如何使用ffmpeg向视频中添加新音频(而不是混音)?
我使用了如下命令:Audio 如何使用ffmpeg向视频中添加新音频(而不是混音)?,audio,video,ffmpeg,Audio,Video,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替换音频将新音频添加到视频中(而不是混音) -map选项允许您手动选
ffmpeg -i video.avi -i audio.mp3 -vcodec codec -acodec codec output_video.avi -newaudio
在最新版本中,用于向视频中添加新的音频曲目(非混音)
但是我将ffmpeg更新为最新版本(ffmpeg版本git-2012-06-16-809d71d),现在在这个版本中参数-newaudio
不起作用
请告诉我如何使用ffmpeg
替换音频将新音频添加到视频中(而不是混音)
选项允许您手动选择流/轨迹。有关更多信息,请参阅-map
- 此示例使用
来(多路复用)视频。不会对视频进行重新编码。质量得到了保证,过程也很快。-c:v copy
- 如果输入音频格式与输出格式兼容,则将视频和音频更改为流式复制
- 如果要重新编码视频和音频,请删除
/-c:v copy
-c copy
选项将使输出与最短输入的持续时间相同-shortest
选项允许您手动选择流/轨迹。有关更多信息,请参阅-map
- 此示例使用
来(多路复用)视频。不会对视频进行重新编码。质量得到了保证,过程也很快。-c:v copy
- 如果输入音频格式与输出格式兼容,则将视频和音频更改为流式复制
- 如果要重新编码视频和音频,请删除
/-c:v copy
-c copy
选项将使输出与最短输入的持续时间相同-shortest
video.mkv
中的视频。使用以下命令混合来自video.mkv
和audio.m4a
的音频:
有关更多信息,请参阅
生成无声音频
您可以使用创建无声音频流。过滤器允许您选择所需的频道布局(单声道、立体声、5.1等)和采样率
ffmpeg -i video.mp4 -f lavfi -i anullsrc=channel_layout=stereo:sample_rate=44100 \
-c:v copy -shortest output.mp4
也看到
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,并且无法升级,则可以执行以下操作:
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());
}
}
如果输入视频有多个音轨,您需要再添加一个音轨,请使用以下命令:
ffmpeg -i input_video_with_audio.avi -i new_audio.ac3 -map 0 -map 1 -codec copy output_video.avi
-map 0
意味着复制(包括)第一个输入文件中的所有流(input\u video\u with_audio.avi
)和-map 1
意味着包括第二个输入文件中的所有流(new\u audio.ac3
)。这些解决方案对我来说都不是很有效。我的原始音频被覆盖了,或者我在更复杂的“amerge”示例中遇到了类似“映射内存失败”的错误。看来我需要-过滤复杂的阿米克斯
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\u video.mp4-i balipraavid.wav-map 0:v:0-map 1:a:0 output.mp4
我记得,最后一个变体将用新音频替换旧音频。是否有任何选项将新音频与旧音频合并?@jwilson我已尝试此命令,但我丢失了视频音频。我的视频格式是mp4@Allan不输的解决方案?起初这对我不起作用,但使用
-map 0:0-map 1:0
而不是-map 0-map 1
对我起了作用。谢谢这将在开始处插入一个空帧。我已尝试此命令,但视频音频丢失。我的视频格式是mp4@Allan.Chan最初的问题不希望音频来自视频输入,但我添加了另一个示例:请参阅混合/组合另一个音频输入示例。没有-shortest
选项的第一个解决方案对我更有效。什么是环境。getExternalStorageDirectory().getAbsolutePath()+“/videoaudiomerge/“+”Vid“+”output“+i1+”.mp4”);
?@Kiquenet是的,你是对的。答案已经给出了。只要读一下这个帖子。这个问题已经5年了。添加新的音频意味着替换音频,对吗?我可能会编辑你的问题来弄清楚。我认为,这个答案一定是最好的答案。
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());
}
}
ffmpeg -i input_video_with_audio.avi -i new_audio.ac3 -map 0 -map 1 -codec copy output_video.avi
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