FFmpeg阻塞管道直到完成?

时间:2015-03-13 09:20:49

标签: c++ video ffmpeg pipe popen

我目前正在开发一个C ++程序(在Linux上运行),它应该运行FFmpeg作为外部工具,使用popen()将视频文件的音频流编码为AC3,并通过管道捕获输出。

以下是我尝试实现此目标的示例代码:

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吗?

2 个答案:

答案 0 :(得分:0)

也许bufferSize在读取(...)中发生了变化? 将其声明为const是一个很好的政策。

答案 1 :(得分:0)

有待回答的老问题,但是由于我刚开始这样做,所以我发现它一直阻塞,直到您阅读标准错误为止。如果您不清楚,则不会写入标准输出。花了一整天的时间来弄清楚:-(

示例:我正在读取mp4并转换为位图流。 100帧左右后,它只是阻塞。打开第二个线程以读取标准错误将给出以下信息(我在行首添加了错误一词,并不表示这是实际错误),您可以从我的代码段中看到它目前已远远超过100帧。 / p>

Error frame= 1275 fps=6.8 q=-0.0 size= 3442567kB time=00:00:51.00 bitrate=552970.8kbits/s speed=0.274x
Read bitmap 1280.
Read bitmap 1281.
Read bitmap 1282.
Read bitmap 1283.
Read bitmap 1284.
Read bitmap 1285.
Read bitmap 1286.
Error frame= 1279 fps=6.8 q=-0.0 size= 3453367kB time=00:00:51.16 bitrate=552970.8kbits/s speed=0.274x
Read bitmap 1287.
Read bitmap 1288.
Read bitmap 1289.
Error frame= 1286 fps=6.9 q=-0.0 size= 3472268kB time=00:00:51.44 bitrate=552970.8kbits/s speed=0.274x
Read bitmap 1290.
Read bitmap 1291.
Read bitmap 1292.
Read bitmap 1293.
Read bitmap 1294.
Read bitmap 1295.
Read bitmap 1296.
Read bitmap 1297.
Error frame= 1289 fps=6.8 q=-0.0 size= 3480368kB time=00:00:51.56 bitrate=552970.8kbits/s speed=0.274x
相关问题