Java - 同时向FFmpeg写入视频和音频

时间:2015-08-05 14:45:12

标签: java process ffmpeg

Hello开发人员,

我目前正在开发一种工具,可以通过使用Java Process执行FFmpeg并向其提供视频帧来呈现视频。

我目前使用以下FFmpeg命令: ffmpeg -y -f rawvideo -pix_fmt rgb24 -s %WIDTH%x%HEIGHT% -r %FPS% -i - -an -c:v libx264 -preset ultrafast -pix_fmt yuv420p "%FILENAME%.mp4", 占位符显然被实际价值取代。

我用来初始化FFmpeg的代码:

    //commandArgs is a list of command line arguments for FFmpeg

    List<String> command = new ArrayList<String>();
    command.add("ffmpeg");
    command.addAll(commandArgs);

    process = new ProcessBuilder(command).directory(outputFolder).start();
    OutputStream exportLogOut = new FileOutputStream("export.log");
    new StreamPipe(process.getInputStream(), exportLogOut).start();
    new StreamPipe(process.getErrorStream(), exportLogOut).start();
    outputStream = process.getOutputStream();
    channel = Channels.newChannel(outputStream);

然后,我有以下方法将包含视频帧的ByteBuffer写入FFmpeg:

public void consume(ByteBuffer buf) {
    try {
        channel.write(buf);
        ByteBufferPool.release(buf);
    } catch(Exception e) {
        e.printStackTrace();
    }
}

现在,我的问题是,我将如何继续将同步音频数据写入输出文件?我假设我需要使用多个管道,当然我将不得不修改我的命令行参数,但我需要帮助:

1) what kind of Audio Data do I need to feed FFmpeg with?
2) how do I feed Audio and Video in one go?
3) how do I keep Audio and Video synchronized?

提前感谢您的帮助!

问候, CrushedPixel

2 个答案:

答案 0 :(得分:3)

这就是多路复用格式的用途,理想情况下,您希望使用多路复用格式将数据提供给FFmpeg。 FFmpeg在内部执行此操作的示例是ffmpeg.exe和ffserver.exe之间的交互,它通过名为FFM的自定义/内部流文件格式实现。可以找到有关实施的完整详细信息here。您显然也可以使用其他多路复用格式,就像AVI一样简单。由于文件提供时间戳,因此同步是自动的。

至于音频数据的类型,这确实可以是任何东西,大多数人会使用原始的,交错的PCM音频(浮点数或int16)。

答案 1 :(得分:1)

看一下https://github.com/artclarke/humble-video,它是java中ffmpeg的包装器。您可以将视频/音频流以编码方式添加到编码器中。