我目前正在开发一个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吗?
答案 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