// 推流线程 DWORD WINAPI push_func(LPVOID args) { // 启动ffmpeg子进程 STARTUPINFO si; ZeroMemory(&si, sizeof(si)); si.cb = sizeof(si); si.dwFlags = STARTF_USESTDHANDLES; si.hStdInput = pipeRead; CreateProcess(NULL, "ffmpeg -f rawvideo -vcodec rawvideo -pix_fmt bgr24 - s 640x480\" -r 30 -i - -c:v libx264 -preset ultrafast - f flv rtmp ://server/live/streamName\\\\\\\"\", NULL, NULL, TRUE, 0, NULL, NULL, &si, &pi); while (true) { EnterCriticalSection(&mtx); SleepConditionVariableCS(&cond, &mtx, INFINITE); LeaveCriticalSection(&mtx); // 写帧数据到管道 DWORD dwWritten; WriteFile(pipeWrite, frame.data, frame.total() * frame.elemSize(), &dwWritten, NULL); } }这一段报错 你修改下
时间: 2024-02-14 08:16:46 浏览: 124
TIGERPLAY.ZIP_流媒体/Mpeg4/MP4_Visual_C++_
这段代码中存在一些语法错误和逻辑问题,应该修改为以下形式:
```
// 推流线程
DWORD WINAPI push_func(LPVOID args) {
// 启动ffmpeg子进程
HANDLE pipeRead, pipeWrite;
SECURITY_ATTRIBUTES sa;
sa.nLength = sizeof(sa);
sa.lpSecurityDescriptor = NULL;
sa.bInheritHandle = TRUE;
CreatePipe(&pipeRead, &pipeWrite, &sa, 0);
STARTUPINFO si;
ZeroMemory(&si, sizeof(si));
si.cb = sizeof(si);
si.dwFlags = STARTF_USESTDHANDLES;
si.hStdInput = pipeRead;
PROCESS_INFORMATION pi;
ZeroMemory(&pi, sizeof(pi));
LPSTR cmd = "ffmpeg -f rawvideo -vcodec rawvideo -pix_fmt bgr24 -s 640x480 -r 30 -i - -c:v libx264 -preset ultrafast -f flv rtmp://server/live/streamName";
BOOL success = CreateProcess(NULL, cmd, NULL, NULL, TRUE, 0, NULL, NULL, &si, &pi);
if (!success) {
printf("Failed to create process. Error code: %d\n", GetLastError());
return 1;
}
while (true) {
EnterCriticalSection(&mtx);
SleepConditionVariableCS(&cond, &mtx, INFINITE);
LeaveCriticalSection(&mtx);
// 写帧数据到管道
DWORD dwWritten;
WriteFile(pipeWrite, frame.data, frame.total() * frame.elemSize(), &dwWritten, NULL);
}
CloseHandle(pipeRead);
CloseHandle(pipeWrite);
return 0;
}
```
主要修改包括:
1. 声明 `pipeRead` 和 `pipeWrite` 两个管道句柄变量,并且使用 `CreatePipe` 函数创建匿名管道。
2. 声明 `sa` 变量为 `SECURITY_ATTRIBUTES` 结构体类型,并且使用默认值初始化。
3. 将管道句柄传递给 `STARTUPINFO` 的 `hStdInput` 字段。
4. 将 `CreateProcess` 函数的返回值保存到 `success` 变量中,并且添加错误处理逻辑。
5. 在循环中使用 `EnterCriticalSection` 和 `LeaveCriticalSection` 函数进行互斥访问。
6. 最后关闭管道句柄。
阅读全文