簡體   English   中英

Java - 同時向FFmpeg寫入視頻和音頻

[英]Java - Write Video and Audio at the same time to FFmpeg

你好開發者,

我目前正在開發一種工具,可以通過使用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

這就是多路復用格式的用途,理想情況下,您希望使用多路復用格式將數據提供給FFmpeg。 FFmpeg在內部執行此操作的示例是ffmpeg.exe和ffserver.exe之間的交互,它通過名為FFM的自定義/內部流文件格式實現。 有關實施的完整詳細信息,請訪問此處 您顯然也可以使用其他多路復用格式,就像AVI一樣簡單。 由於文件提供時間戳,因此同步是自動的。

至於音頻數據的類型,這實際上可以是任何東西,大多數人將使用原始的,交錯的PCM音頻(浮點數或int16)。

看一下https://github.com/artclarke/humble-video ,它是java中ffmpeg的包裝器。 您可以將視頻/音頻流以編碼方式添加到編碼器中。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM