将背景音乐添加到没有声音的视频时出现问题
Problem when adding background music to video without sound
我正在尝试剪切一段背景音乐并将其循环播放成视频,并使用以下命令更改视频的速度。
String[] cmd = {"-y", "-i", input, "-i", shortsound,
"-filter_complex",
"[0:v]trim=0:120,setpts=1/2*(PTS-STARTPTS)[v1]," +
"[0:v]trim=120:240,setpts=1/2*(PTS-STARTPTS)[v2];" +
"[1:a]atrim=0:6,asetpts=PTS-STARTPTS," +
"asetrate=44100,aloop=-1:2e+09," +
"aformat=sample_fmts=fltp:sample_rates=44100:channel_layouts=stereo,volume=1.0[bg];" +
"[0:a]atrim=0:120,asetpts=PTS-STARTPTS,atempo=2.0" +
",aformat=sample_fmts=fltp:sample_rates=44100:channel_layouts=stereo[a1]," +
"[0:a]atrim=120:240,asetpts=PTS-STARTPTS,atempo=2.0," +
"aformat=sample_fmts=fltp:sample_rates=44100:channel_layouts=stereo[a2];" +
"[v1][a1][v2][a2]concat=n=2:v=1:a=1[video][audio];[audio]volume=0.5[avolume];" +
"[avolume][bg]amerge=2,pan=stereo|c0<c0+c2|c1<c1+c3[aout]",
"-map", "[video]", "-map", "[aout]", "-c:v", "libx264", "-c:a", "aac", "-shortest",
"-preset", "veryfast", output, "-hide_banner"};
一切都很好,直到我尝试了一个没有声音的视频,它没有用。
输入的是无声视频怎么办?
您的命令行不适用于任何具有音频流的视频,因为在您的命令中,您正试图在以下几行中操作输入视频的音频流:
"[0:a]atrim=0:120,asetpts=PTS-STARTPTS,atempo=2.0" +
",aformat=sample_fmts=fltp:sample_rates=44100:channel_layouts=stereo[a1]," +
"[0:a]atrim=120:240,asetpts=PTS-STARTPTS,atempo=2.0," +
"aformat=sample_fmts=fltp:sample_rates=44100:channel_layouts=stereo[a2];"
[0:a]指的是第一个输入的音频流是一个视频文件,所以当我们有一个没有音频流的视频时,你的命令将以失败告终
为了解决您的问题,您可以使用以下代码检查您的视频文件中是否有音频流:
private boolean isVideoContainAudioStream(String videoPath) {
MediaMetadataRetriever retriever = new MediaMetadataRetriever();
retriever.setDataSource(videoPath);
String hasAudioStream = retriever.extractMetadata(MediaMetadataRetriever.METADATA_KEY_HAS_AUDIO);
if (hasAudioStream != null && hasAudioStream.equals("yes"))
return true;
else
return false;
}
因此,如果上述函数的结果等于 true,则您的视频文件包含音频流,因此您可以 运行 您的命令,否则您可以忽略该文件或显示警告或 运行命令的编辑版本
我正在尝试剪切一段背景音乐并将其循环播放成视频,并使用以下命令更改视频的速度。
String[] cmd = {"-y", "-i", input, "-i", shortsound,
"-filter_complex",
"[0:v]trim=0:120,setpts=1/2*(PTS-STARTPTS)[v1]," +
"[0:v]trim=120:240,setpts=1/2*(PTS-STARTPTS)[v2];" +
"[1:a]atrim=0:6,asetpts=PTS-STARTPTS," +
"asetrate=44100,aloop=-1:2e+09," +
"aformat=sample_fmts=fltp:sample_rates=44100:channel_layouts=stereo,volume=1.0[bg];" +
"[0:a]atrim=0:120,asetpts=PTS-STARTPTS,atempo=2.0" +
",aformat=sample_fmts=fltp:sample_rates=44100:channel_layouts=stereo[a1]," +
"[0:a]atrim=120:240,asetpts=PTS-STARTPTS,atempo=2.0," +
"aformat=sample_fmts=fltp:sample_rates=44100:channel_layouts=stereo[a2];" +
"[v1][a1][v2][a2]concat=n=2:v=1:a=1[video][audio];[audio]volume=0.5[avolume];" +
"[avolume][bg]amerge=2,pan=stereo|c0<c0+c2|c1<c1+c3[aout]",
"-map", "[video]", "-map", "[aout]", "-c:v", "libx264", "-c:a", "aac", "-shortest",
"-preset", "veryfast", output, "-hide_banner"};
一切都很好,直到我尝试了一个没有声音的视频,它没有用。 输入的是无声视频怎么办?
您的命令行不适用于任何具有音频流的视频,因为在您的命令中,您正试图在以下几行中操作输入视频的音频流:
"[0:a]atrim=0:120,asetpts=PTS-STARTPTS,atempo=2.0" +
",aformat=sample_fmts=fltp:sample_rates=44100:channel_layouts=stereo[a1]," +
"[0:a]atrim=120:240,asetpts=PTS-STARTPTS,atempo=2.0," +
"aformat=sample_fmts=fltp:sample_rates=44100:channel_layouts=stereo[a2];"
[0:a]指的是第一个输入的音频流是一个视频文件,所以当我们有一个没有音频流的视频时,你的命令将以失败告终
为了解决您的问题,您可以使用以下代码检查您的视频文件中是否有音频流:
private boolean isVideoContainAudioStream(String videoPath) {
MediaMetadataRetriever retriever = new MediaMetadataRetriever();
retriever.setDataSource(videoPath);
String hasAudioStream = retriever.extractMetadata(MediaMetadataRetriever.METADATA_KEY_HAS_AUDIO);
if (hasAudioStream != null && hasAudioStream.equals("yes"))
return true;
else
return false;
}
因此,如果上述函数的结果等于 true,则您的视频文件包含音频流,因此您可以 运行 您的命令,否则您可以忽略该文件或显示警告或 运行命令的编辑版本