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 "; 这样呢
时间: 2024-04-01 13:32:32 浏览: 26
这个命令看起来已经更正过来了,现在可以正确地从管道读取输入流了。这个命令的作用是将 bgr24 格式的原始视频流编码为 H.264 格式的视频,并将其推流到指定的 RTMP 服务器上。其中,“-s”选项指定输入视频的分辨率,“-r”选项指定视频的帧率,“-i pipe:0”指定从标准输入读取原始视频流,“-c:v libx264”指定使用libx264编码器进行视频编码,“-preset ultrafast”指定编码器的预设参数,以便在速度和压缩质量之间取得平衡,“-f flv”指定输出格式为 FLV 格式,“rtmp://server/live/streamName”指定 RTMP 服务器的地址和推流的流名。
相关问题
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);这一段有错吗
这段代码中存在一些语法错误,应该修改为以下形式:
```
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` 函数调用后,判断是否成功创建进程,如果失败,则打印错误码。
// 推流线程 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. 最后关闭管道句柄。
相关推荐
![rar](https://img-home.csdnimg.cn/images/20210720083606.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)