ffmpeg 向可能带有音频(或不带有音频)的视频中添加音乐,而不会丢失现有的音频

ffmpeg 向可能带有音频(或不带有音频)的视频中添加音乐,而不会丢失现有的音频

我正在编写一个脚本,该脚本允许我向视频添加音频,该视频可能有或可能没有音频流,如果有,我可以使用filter_complexamix组合这两个音频并将其映射到输出。

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");
        }
    }

看看这段代码,检查哪部分对你有用,以及如何根据您的需要实现。

相关内容