FFmpeg 控制台窗口的隐藏和正常退出

本文介绍了如何使用C++调用FFmpeg命令行工具执行音视频处理任务,并在完成后正常关闭控制台窗口,避免因非正常关闭导致的文件损坏问题。通过CreateProcess函数创建进程,然后利用EnumWindows和WM_CLOSE消息找到并关闭FFmpeg的控制台窗口。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

FFmpeg无疑是音视频界的翘首,很多企业或个人都会拿来使用,具体怎么使用,在此不做赘述。这里仅仅讲述如何用C++调用ffmpeg指令,以及调用的控制台窗口的正常关闭(录像或转码等情况下,非正常关闭,直接导致文件损坏,不可用)

一、指令的执行

STARTUPINFOEX       si;
SECURITY_ATTRIBUTES sa;
memset(&pi, 0, sizeof(pi));
memset(&si, 0, sizeof(si));
memset(&sa, 0, sizeof(sa));
si.StartupInfo.cb = sizeof(STARTUPINFOEX);
sa.nLength = sizeof(SECURITY_ATTRIBUTES);
sa.bInheritHandle = TRUE;
si.StartupInfo.wShowWindow = SW_SHOW;// SW_HIDE;
si.StartupInfo.dwFlags = STARTF_USESHOWWINDOW | STARTF_USESTDHANDLES;   
//这里ffmpeg.exe必须执行路径,否则创建进程失败,错误码为2
CString strCommandLine = _T("D:\\ffmpeg.exe -f gdigrab -i desktop -q:v 0.01 -vcodec mpeg4 -f mp4 D:\\out.mp4");
bRet = CreateProcess(NULL, (LPTSTR)(LPCTSTR)strCommandLine, NULL, NULL, FALSE/*TRUE*/, EXTENDED_STARTUPINFO_PRESENT/*CREATE_NEW_CONSOLE*/, NULL, NULL/*(LPTSTR)(LPCTSTR)sPath*/, (STARTUPINFO*)&si, &pi);
if (!bRet)
    return ;

//到这里,进程就创建成功了

二、窗口的关闭

创建进程之后,我们能会获取到进程ID,然后根据进程ID查找窗口的句柄,之后给窗口发送WM_CLOSE消息就可以正常关闭控制台窗口了。

struct FfmpegStruct
{
    HWND hFfmpegWnd;
    DWORD dwProcessId;
};
DWORD FindProcessId(HWND hWnd)
{
    DWORD dwProcessId = 0;
    ::GetWindowThreadProcessId(hWnd, &dwProcessId);
    return dwProcessId;
}
BOOL CALLBACK EnumWindowProc(HWND hWnd, LPARAM lParam)
{
    struct FfmpegStruct *pFfmpegStruct = reinterpret_cast<struct FfmpegStruct*>(lParam);
    if (FindProcessId(hWnd) == pFfmpegStruct->dwProcessId) {
        pFfmpegStruct->hFfmpegWnd = GetParent(hWnd);
        return FALSE;
    }

    return TRUE;
}

struct FfmpegStruct ffmpegStruct = { 0, pi.dwProcessId };
EnumWindows(EnumWindowProc, (LPARAM)&ffmpegStruct);
::PostMessage(ffmpegStruct.hFfmpegWnd, WM_CLOSE, 0, 0);
WaitForSingleObject(pi.hProcess, INFINITE);

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值