Tôi đang xử lý tải video để ghép lại với nhau bằng Java trên máy chủ Linux.
Đầu tiên, tôi trộn một đoạn âm thanh với quá trình này, tùy thuộc vào việc video đã có âm thanh hay chưa.
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
Hoặc nếu không có âm thanh hiện có
ffmpeg -y -i video.mp4 -i audio.mp3 -af apad
-map 0:v -map 1:a -c:v copy -shortest output.mp4
Với mã dưới đây trong ứng dụng 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()
);
Sau đó tôi thêm tất cả các tệp video vào một tệp văn bản và nối tệp văn bản đó bằng cách sử dụng
ffmpeg -f concat -i list.txt -safe 0
-c:v copy -c:a aac -strict experimental output.mp4
Sử dụng Java dưới đây
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()
);
Trong đầu ra cuối cùng, âm thanh hơi không đồng bộ, tức là âm thanh từ một video chạy qua video tiếp theo, v.v.
Tôi đã kiểm tra thời lượng âm thanh / video cho mỗi video và chúng thực sự hơi khác nhau (thời lượng video là số đầu tiên, theo dõi âm thanh thứ hai)
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
Mà tôi cho là nguyên nhân của vấn đề.
Bất cứ ai có thể giúp tôi thay đổi cách tôi trộn chúng để video và âm thanh luôn có cùng độ dài hoặc chỉ cho tôi cách sử dụng concat để nó thêm khoảng lặng ở cuối âm thanh để chúng có cùng độ dài?