FFmpeg阻塞管道直到完成?

问题描述 投票:2回答:2

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

以下是我尝试实现这个功能的Sample Code。

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?

c++ video ffmpeg pipe popen
2个回答
0
投票

也许在read(...)中bufferSize会发生变化,将其声明为const是一个好政策。


0
投票

老的问题来回答,但因为我只是得到了周围做这个我发现它块,直到你读标准错误。如果你不清除,那么它将不会写到标准出来。 我花了一天的时间才弄明白:-(

例如:我正在读取一个mp4并转换为位图流。在100多帧之后,它就阻塞了。 打开第二个线程读取标准错误,得到以下结果(顺便说一下,我在行首加了Error这个词,并不意味着这是一个实际的错误),你可以从我的片段中看到它目前已经远远超过了100帧。

Error frame= 1275 fps=6.8 q=-0.0 size= 3442567kB time=00:00:51.00 bitrate=552970.8kbitss speed=0.274xRead 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.8kbitss speed=0.274xRead bitmap 1287.Read bitmap 1288. 读取位图 1289.Error frame= 1286 fps=6.9 q=-0.0 size= 3472268kB time=00:00:51.44 bitrate=552970.8kbitss speed=0.274xRead bitmap 1290.Read bitmap 1291.Read bitmap 1292. 读取位图 1293.读取位图 1294.读取位图 1295.读取位图 1296.读取位图 1297.错误帧=1289 fps=6.8 q=-0.0 size=3480368kB time=00:00:51.56 bitrate=552970.8kbitss speed=0.274x。
© www.soinside.com 2019 - 2024. All rights reserved.