我们已经创建了使用Xuggler记录网络摄像头流的应用程序,但视频和音频分开。
我们需要合并,没有串联,这两个文件。
这又如何用Java做了什么?
我们已经创建了使用Xuggler记录网络摄像头流的应用程序,但视频和音频分开。
我们需要合并,没有串联,这两个文件。
这又如何用Java做了什么?
如果您有音频和视频文件,那么你可以将它们合并使用FFmpeg的一个单一的音频视频文件:
您可以使用Java如下调用的ffmpeg:
public class WrapperExe {
public boolean doSomething() {
String[] exeCmd = new String[]{"ffmpeg", "-i", "audioInput.mp3", "-i", "videoInput.avi" ,"-acodec", "copy", "-vcodec", "copy", "outputFile.avi"};
ProcessBuilder pb = new ProcessBuilder(exeCmd);
boolean exeCmdStatus = executeCMD(pb);
return exeCmdStatus;
} //End doSomething Function
private boolean executeCMD(ProcessBuilder pb)
{
pb.redirectErrorStream(true);
Process p = null;
try {
p = pb.start();
} catch (Exception ex) {
ex.printStackTrace();
System.out.println("oops");
p.destroy();
return false;
}
// wait until the process is done
try {
p.waitFor();
} catch (InterruptedException e) {
e.printStackTrace();
System.out.println("woopsy");
p.destroy();
return false;
}
return true;
}// End function executeCMD
} // End class WrapperExe
我会建议寻找到的ffmpeg和波谷的命令行与需要合并的视频和音频文件所需的参数合并。 您可以使用Java进程来执行本机进程。
取决于格式,你可以使用JMF,Java媒体框架,这是古老而从未很大,但可能是很好的满足你的目的。
如果它不支持你的格式,你可以使用ffmpeg的包装,如果我记得正确的,提供了一个JMF接口,但使用FFMPEG: http://fmj-sf.net/ffmpeg-java/getting_started.php
至于其他的答案已经建议,ffmeg似乎在这里是最好的解决方案。
下面的代码我结束了:
import java.io.File;
import java.io.FileNotFoundException;
import java.io.IOException;
import java.nio.file.Paths;
import java.util.Arrays;
public static File mergeAudioToVideo(
File ffmpegExecutable, // ffmpeg/bin/ffmpeg.exe
File audioFile,
File videoFile,
File outputDir,
String outFileName) throws IOException, InterruptedException {
for (File f : Arrays.asList(ffmpegExecutable, audioFile, videoFile, outputDir)) {
if (! f.exists()) {
throw new FileNotFoundException(f.getAbsolutePath());
}
}
File mergedFile = Paths.get(outputDir.getAbsolutePath(), outFileName).toFile();
if (mergedFile.exists()) {
mergedFile.delete();
}
ProcessBuilder pb = new ProcessBuilder(
ffmpegExecutable.getAbsolutePath(),
"-i",
audioFile.getAbsolutePath(),
"-i",
videoFile.getAbsolutePath() ,
"-acodec",
"copy",
"-vcodec",
"copy",
mergedFile.getAbsolutePath()
);
pb.redirectErrorStream(true);
Process process = pb.start();
process.waitFor();
if (!mergedFile.exists()) {
return null;
}
return mergedFile;
}