我目前正在研究一個C++程序(在Linux上運行),它應該運行FFmpeg作爲外部工具,使用popen()
將視頻文件的音頻流編碼爲AC3,並通過管道捕獲輸出。FFmpeg阻塞管道,直到完成?
這裏是我如何努力實現這個示例代碼:
int bufferSize = 2048;
char buffer[bufferSize];
FILE *handle = popen("ffmpeg -i filename.mkv -map 0 -codec:v copy -codec:s copy -codec:a ac3 -f matroska -", "r");
int d = fileno(handle);
while(read(d, buffer, bufferSize) > 0)
{
// Process Data here
}
其實這個工作,但不是我的預期。以下是FFmpeg開始,編碼整個文件,我的程序一直掛在read()
上。一旦FFmpeg完成,我的程序將繼續並從管道讀取數據。
但我其實想要的是讀取FFmpeg 的輸出,而它正在編碼該文件。現在我想知道如何使它工作的方式? FFmpeg是否阻塞了管道,直到它完成或者我的代碼在管道寫入時無法讀取時才寫入任何內容?或者我需要傳遞給FFmpeg嗎?
[ffmpeg在重定向時可能使用了塊緩衝模式](http://pexpect.readthedocs.org/en/latest/FAQ.html#whynotpipe)。您可以嘗試使用「-progress url」。 – jfs 2015-03-13 12:18:35
看起來像ffmpeg在所有情況下都不會阻塞管道。我只注意到阻塞僅出現在-map 0參數中。一旦我分別映射每個流,一切都按預期工作。 – ZeroTek 2015-03-25 12:13:49