我正在编写一个脚本,该脚本允许我向视频添加音频,该视频可能有或可能没有音频流,如果有,我可以使用filter_complex
和amix
组合这两个音频并将其映射到输出。
ffmpeg -i video.mp4 -i audio_to_add.mp4 -filter_complex "[0][1]amix=inputs=2[newAudio]" -map 0:v -map [newAudio]:a output.mp4
我的问题是,当视频没有音频流时,amix
过滤器会抛出错误
Stream specifier '' in filtergraph description [0][1]amix=inputs=2[newAudio] matches no streams
答案1
amix
好吧,当您的视频没有任何音频时,您无法使用过滤器,请尝试使用此命令:
amovie=audio_to_add.mp4:loop=0,asetpts=N/SR/TB,volume=1.0[a]
更新
请参阅此链接检查您的视频是否有音频
https://stackoverflow.com/a/46483591/10752962
if (isVideoMuted) {
if (isLongVideo) {
if (isLoop) {
commandList.add("amovie=" + mAudioFileName + ":loop=0,asetpts=N/SR/TB,volume=" + addedVolume + "[a]");
}
} else {
commandList.add("amovie=" + mAudioFileName + ":loop=0,asetpts=N/SR/TB,volume=" + addedVolume + "[a]");
}
} else {
if (isLongVideo) {
if (!isLoop) {
commandList.add("[0:a]volume=" + originalVolume + "[a0];[1:a]volume=" + addedVolume + "[a1];[a0][a1]amix=inputs=2[a]");
} else {
commandList.add("amovie=" + mAudioFileName + ":loop=0,asetpts=N/SR/TB,volume=" + addedVolume + "[a1];[0:a]volume=" + originalVolume + "[a0],[a0][a1]amix=inputs=2[a]");
}
} else {
commandList.add("[0:a]volume=" + originalVolume + "[a0];[1:a]volume=" + addedVolume + "[a1];[a0][a1]amix=inputs=2[a]");
}
}
这里,isLongVideo
用于当视频比音频长时,isLoop
如果您想当视频更长时为音频设置循环(此用例取决于您)。
我还添加了-shortest
这样的命令:
if (!isLongVideo) {
commandList.add("-shortest");
} else {
if (isLoop) {
commandList.add("-shortest");
}
}
看看这段代码,检查哪部分对你有用,以及如何根据您的需要实现。