我正在 Linux 服务器上使用 Java 处理大量视频并将其连接在一起。
首先,我根据视频是否已经有音频,将音轨混入其中。
ffmpeg -y -i video.mp4 -i audio.mp3
-filter_complex "[0:a]aresample=async=1,volume=1.0[a0];
[1:a]aresample=async=1,volume=1.0[a1];
[a0][a1]amix=inputs=2[a] -map 0:v -map "[a]" -c:v copy
-c:a aac -strict -2 -shortest output.mp4
或者如果没有现有音频
ffmpeg -y -i video.mp4 -i audio.mp3 -af apad
-map 0:v -map 1:a -c:v copy -shortest output.mp4
在 Java 应用程序中使用以下代码
if(getVideoAttribute(video, "a:0", "duration") != null)
pb = new ProcessBuilder(
"ffmpeg", "-y", "-i", video.getAbsolutePath(),
"-i", audio.getAbsolutePath(),
"-filter_complex", "[0:a]aresample=async=1,volume=" + videoVolume + "[a0]; [1:a]aresample=async=1,volume=" + audioVolume + "[a1]; [a0][a1]amix=inputs=2[a]", "-map", "0:v", "-map", "[a]", "-c:v", "copy", "-c:a", "aac", "-strict", "-2", "-shortest",
outFile.getAbsolutePath()
);
else
pb = new ProcessBuilder(
"ffmpeg", "-y", "-i", video.getAbsolutePath(),
"-i", audio.getAbsolutePath(),
"-af", "apad", "-map", "0:v", "-map", "1:a", "-c:v", "copy", "-shortest",
outFile.getAbsolutePath()
);
然后,我将所有视频文件添加到文本文件中,并使用
ffmpeg -f concat -i list.txt -safe 0
-c:v copy -c:a aac -strict experimental output.mp4
使用下面这个 Java
ProcessBuilder pb = new ProcessBuilder(
"ffmpeg", "-f",
"concat", "-i", Constants.TEMP_DIR_PATH + listFile.getName(),
"-safe", "0",
"-c:v","copy","-c:a","aac","-strict","experimental",
Constants.TEMP_DIR_PATH + out.getName()
);
在最终输出中,音频稍微不同步,即一个视频的音频延伸到下一个视频等。
我检查了每个视频的音频/视频时长,它们确实略有不同(视频时长是第一个数字,音轨是第二个)
6.480000
6.528000
0e9e449b-f53e-473b-a91a-72e38ecfc789_3840.mp4
12.760000
12.736000
06bd1e70-b9aa-4c26-86d2-98fc421f6729_3840.mp4
17.520000
17.493000
f2dc7fc0-d4ac-4a82-88cb-777a16a1f818_3840.mp4
7.880000
7.850000
03681d53-4532-48e0-b3e4-cc1e7170ae65_3840.mp4
6.625000
6.592000
219d174d-9df6-41ec-b95e-2ec4137e07a4_3840.mp4
14.541992
14.485000
我认为这就是问题的根源。
有人能帮助我改变混合方式以使视频和音频始终具有相同的长度,或者向我展示一种使用连接的方法,以便在音频末尾添加静音以使它们具有相同的长度?