如何合并在Java中的音频和视频(How to merge audio and video in J

2019-09-20 19:22发布

我们已经创建了使用Xuggler记录网络摄像头流的应用程序,但视频和音频分开。

我们需要合并,没有串联,这两个文件。

这又如何用Java做了什么?

Answer 1:

如果您有音频和视频文件,那么你可以将它们合并使用FFmpeg的一个单一的音频视频文件:

  1. 下载FFmpeg的: http://ffmpeg.zeranoe.com/builds/
  2. 解压下载的文件到指定的文件夹,例如c:\ ffmpeffolder
  3. 使用CMD移动到特定的文件夹C:\ ffmpeffolder \ BIN
  4. 运行以下命令:$的ffmpeg -i audioInput.mp3 -i videoInput.avi -acodec复制-vcodec副本outputFile.avi这是它。 outputFile.avi将生成的文件。


Answer 2:

您可以使用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


Answer 3:

我会建议寻找到的ffmpeg和波谷的命令行与需要合并的视频和音频文件所需的参数合并。 您可以使用Java进程来执行本机进程。

  • http://docs.oracle.com/javase/1.4.2/docs/api/java/lang/Process.html
  • http://docs.oracle.com/javase/1.4.2/docs/api/java/lang/Runtime.html#exec(java.lang.String )
  • http://www.linglom.com/2007/06/06/how-to-run-command-line-or-execute-external-application-from-java/


Answer 4:

取决于格式,你可以使用JMF,Java媒体框架,这是古老而从未很大,但可能是很好的满足你的目的。

如果它不支持你的格式,你可以使用ffmpeg的包装,如果我记得正确的,提供了一个JMF接口,但使用FFMPEG: http://fmj-sf.net/ffmpeg-java/getting_started.php



Answer 5:

至于其他的答案已经建议,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;
}


文章来源: How to merge audio and video in Java