在自己的程序代码里,调用ffmpeg命令行程序,想让它执行后返回执行结果,怎么办?
null
ffmpeg命令行转码完成是否能实现回调
ffmpeg -i …. IF ERRORLEVEL 0 ECHO “转换成功” ELSE ECHO “转换失败” ========== 0为ffmpeg的返回码
因为要接收反馈结果,cmd命令可以这样写:
rtsp://user:password@ip:port -ss 00:00:01 -vframes 1 -f image2 -vcodec png image.png && echo succeeded ||echo failed
当ffmpeg执行正确时,会输出succeeded,当ffmpeg不能正确执行时,会输出failed。
C++ 执行ffmpeg命令行并获取执行后的输出结果
直接上源码:
void ChangedVideoSize()
{
wstring szStartApp = L"ffmpeg -y -i c:\2.mp4 -s 1280*720 video2_1280x720.mp4";
SECURITY_ATTRIBUTES sa;
HANDLE hRead, hWrite;
sa.nLength = sizeof(SECURITY_ATTRIBUTES);
sa.lpSecurityDescriptor = NULL; //使用系统默认的安全描述符
sa.bInheritHandle = TRUE; //创建的进程继承句柄
if (!CreatePipe(&hRead, &hWrite, &sa, 0)) //创建匿名管道
{
::MessageBoxA(NULL, "CreatePipe Failed!", "提示", MB_OK | MB_ICONWARNING);
return;
}
STARTUPINFO si;
PROCESS_INFORMATION pi;
ZeroMemory(&si, sizeof(STARTUPINFO));
si.cb = sizeof(STARTUPINFO);
GetStartupInfo(&si);
si.hStdError = hWrite;
si.hStdOutput = hWrite; //新创建进程的标准输出连在写管道一端
si.wShowWindow = SW_HIDE; //隐藏窗口
si.dwFlags = STARTF_USESHOWWINDOW | STARTF_USESTDHANDLES;
if (!CreateProcess(NULL, (LPWSTR)szStartApp.c_str(), NULL, NULL, TRUE, NULL, NULL, NULL, &si, &pi)) //创建子进程
{
::MessageBoxA(NULL, "CreateProcess Failed!", "提示", MB_OK | MB_ICONWARNING);
return;
}
::CloseHandle(pi.hProcess);
::CloseHandle(hWrite); //关闭管道句柄
char buffer[4096] = { 0 };
DWORD bytesRead;
string temp;
while (true)
{
if (ReadFile(hRead, buffer, 4095, &bytesRead, NULL) == NULL) //读取管道
break;
temp += buffer;
temp += "\r\n";
}
CloseHandle(hRead);
//得到的temp就是cmd命令行窗口中的数据了
}
© 版权声明
文章版权归作者所有,未经允许请勿转载。
THE END
暂无评论内容