【发布时间】:2015-11-02 08:16:25
【问题描述】:
我想从文件中提取视频的帧大小。为此,我通过 bash shell 启动了一个 ffmpeg 命令,我想提取输出。此命令在 bash shell 中运行良好,并根据需要返回输出。
ffprobe -v error -count_frames -of flat=s=_ -select_streams v:0 -show_entries stream=nb_read_frames /home/peter/DA/videos/IMG-2014-1-10-10-4-37.avi
我想通过 C++ 调用它并读出结果。我使用 IDE Qt 4.8.6 和 GCC 4.8 编译器。
对于我的代码,我使用这个模板:
executing shell command with popen
并根据我的要求将其更改为
#include <iostream>
#include <string>
#include <stdio.h>
using namespace std;
int main()
{
FILE* pipe = popen("echo $(ffprobe -v error -count_frames -of flat=s=_ -select_streams v:0 -show_entries stream=nb_read_frames /home/peter/DA/videos/IMG-2014-1-10-10-4-37.avi)", "r");
if(!pipe)
{
cout << "error" << endl;
return 1;
}
char* buffer = new char[512];
string result;
fgets(buffer, sizeof(buffer), pipe) ;
while(!feof(pipe))
{
if(fgets(buffer, sizeof(buffer), pipe) != NULL)
{
cout << buffer << endl;
result += buffer;
}
}
pclose(pipe);
cout << result<< endl;
return 0;
}
Qt 控制台向我返回了这个警告,它正在以 return 0 进行渲染:
/home/peter/DA/videos/IMG-2014-1-10-10-4-37.avi: Invalid data found when processing input
而“管道”是空的。
当我在 shell 中使用 g++ 编译上面的 main.cpp 文件时,它也很好用。
【问题讨论】:
-
你为什么不干脆做
while (fgets(...) != nullptr)?什么是String(大写S)? -
“处理输入时发现无效数据”是一个 ffmpeg 错误,这意味着它很难读取文件。该错误不应与您的代码相关。此外,“回声”似乎是多余的。
-
@criswell 我很确定你需要
echo进入管道。 -
@erip:
popen从命令创建管道,写入管道的是ffprobe- @criswell 说,echo是多余的 -
大写 S 已更改。谢谢