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);这一段有错吗
时间: 2024-03-24 19:36:14 浏览: 198
这段代码中存在一些语法错误,应该修改为以下形式:
```
STARTUPINFO si;
PROCESS_INFORMATION pi;
ZeroMemory(&si, sizeof(si));
si.cb = sizeof(si);
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, FALSE, 0, NULL, NULL, &si, &pi);
if (!success) {
printf("Failed to create process. Error code: %d\n", GetLastError());
}
```
主要修改包括:
1. 声明 `si` 和 `pi` 两个变量,并且使用 `ZeroMemory` 函数进行初始化。
2. 将命令字符串进行修正,去掉多余的 `\`,并且将整个命令字符串赋值给 `cmd` 变量。
3. 将 `TRUE` 改为 `FALSE`,表示新进程不继承父进程的句柄。
4. 在 `CreateProcess` 函数调用后,判断是否成功创建进程,如果失败,则打印错误码。
相关问题
char cmd[] = "ffmpeg -f rawvideo -vcodec rawvideo -pix_fmt bgr24 -s 640x480 - r 30 - i pipe : 0 - c : v libx264 -preset ultrafast - f flv rtmp ://server/live/streamName "; CreateProcess(NULL, cmd, NULL, NULL, TRUE, 0, NULL, NULL, &si, &pi);
这段代码的作用是使用 `CreateProcess()` 函数在新的进程中运行 FFmpeg 命令行工具,将标准输入中的原始视频流编码为 H.264 视频流,并将其推流到指定的 RTMP 服务器上。其中,`cmd` 变量包含要运行的 FFmpeg 命令字符串,`si` 和 `pi` 变量是 `STARTUPINFO` 和 `PROCESS_INFORMATION` 结构体,用于启动新进程并获取有关它的信息。
注意,你在命令字符串中应该使用空格而不是冒号来分隔参数。例如,"-i pipe:0" 应该被改成 "-i pipe: 0","-c:v libx264" 应该被改成 "-c:v libx264"。
另外,还需要注意的是,如果你在 Windows 操作系统上运行这段代码,你需要将命令字符串传递给 `cmd.exe`,而不是直接传递给 `CreateProcess()` 函数。此外,你还需要将 `CREATE_NEW_CONSOLE` 标志添加到 `dwCreationFlags` 参数中,以便在新控制台窗口中显示 FFmpeg 的输出。以下是更正过的代码:
```
#include <windows.h>
int main()
{
STARTUPINFO si = {0};
PROCESS_INFORMATION pi = {0};
char cmd[] = "cmd.exe /C ffmpeg -f rawvideo -vcodec rawvideo -pix_fmt bgr24 -s 640x480 -r 30 -i pipe: 0 -c:v libx264 -preset ultrafast -f flv rtmp://server/live/streamName";
si.cb = sizeof(si);
si.dwFlags = STARTF_USESHOWWINDOW;
si.wShowWindow = SW_HIDE;
BOOL success = CreateProcess(NULL, cmd, NULL, NULL, TRUE, CREATE_NEW_CONSOLE, NULL, NULL, &si, &pi);
if (!success) {
printf("Failed to start FFmpeg process. Error code: %d\n", GetLastError());
return 1;
}
// Wait for the process to exit
WaitForSingleObject(pi.hProcess, INFINITE);
CloseHandle(pi.hProcess);
CloseHandle(pi.hThread);
return 0;
}
```
这应该能够在 Windows 系统上正确地启动 FFmpeg 进程并运行命令行命令。
// 推流线程 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); } }这一段报错 你修改下
这段代码中存在一些语法错误和逻辑问题,应该修改为以下形式:
```
// 推流线程
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. 最后关闭管道句柄。
阅读全文