5

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

我们需要合并而不是连接这两个文件。

如何在 Java 中做到这一点?

4

5 回答 5

4

如果您有音频和视频文件,则可以使用 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 copy -vcodec copy outputFile.avi 就是这样。outputFile.avi 将是生成的文件。
于 2012-08-06T11:28:37.463 回答
4

您可以使用 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
于 2012-08-08T01:52:22.433 回答
1

I would recommend to look into ffmpeg and merge them trough command line with the required arguments needed for merging the video and audio files. You can use java Process to execute native processes.

于 2012-08-04T19:25:32.870 回答
1

根据格式的不同,您可以使用 JMF,即 Java 媒体框架,它是古老的并且从来没有那么好,但对于您的目的来说可能已经足够好了。

如果它不支持您的格式,您可以使用 FFMPEG 包装器,如果我没记错的话,它提供 JMF 接口但使用 FFMPEG: http: //fmj-sf.net/ffmpeg-java/getting_started.php

于 2012-08-05T01:05:19.377 回答
0

正如其他答案已经建议的那样, 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;
}
于 2019-06-01T23:57:34.413 回答