2015-03-13 118 views
2

我目前正在研究一個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嗎?

+0

[ffmpeg在重定向時可能使用了塊緩衝模式](http://pexpect.readthedocs.org/en/latest/FAQ.html#whynotpipe)。您可以嘗試使用「-progress url」。 – jfs 2015-03-13 12:18:35

+0

看起來像ffmpeg在所有情況下都不會阻塞管道。我只注意到阻塞僅出現在-map 0參數中。一旦我分別映射每個流,一切都按預期工作。 – ZeroTek 2015-03-25 12:13:49

回答

0

可能bufferSize在讀取(...)中發生變化? 將它聲明爲const是一個很好的策略。

+0

我試過但沒有改變。 – ZeroTek 2015-03-13 10:21:22