命令行实现FFMpeg拉流推流方法思路

方法1:

实现思路:

显示摄像头至窗口,推流指定窗口图像至服务器

方法步骤:

  1. 显示摄像头

ffplay -f dshow -i video="摄像头名字"

执行后获得以“摄像头名字”作为窗口标题的摄像头采集窗口

  1. 指定摄像头窗口推流(只能采集主窗口,子窗口无法采集,可设置采集主窗口指定区域图像)

ffmpeg -f GDIgrab [-offset_x 10 -offset_y 20 -video_size 640x480] -i title="摄像头窗口标题" -vcodec libx264 -preset:v ultrafast -tune:v zerolatency -f flv "视频推流服务器地址"

  1. 播放拉流视频

ffplay "视频拉流地址"

优点:

可随时更新要推送的内容,只需在指定窗口更改显示内容即可。

缺点:

非原始数据,通过二次采集,依附窗口且该窗口不能被关闭。

方法2:

实现思路:

推流摄像头及服务器同时推流至本地,本地可使用本地流播放及远程拉流播放。

方法步骤:

  1. 将摄像头同时推送至服务器及本地流(本地推时可单独设置仅视频或仅音频)
  2. 播放本地流数据
  3. 播放拉流服务器数据

优点:

直接数据,无二次转码,且不用依附指定窗口

缺点:

需要暂时关闭推流图像,无法临时更换指定推流图像,如暂时黑屏推送让摄像头不起作用。

使用API获得指定窗口句柄使其嵌入至主窗口中方法。

QProcess执行后嵌入窗口方法

QProcess* procCam = new QProcess;

//隐藏窗口显示执行

procCam->setCreateProcessArgumentsModifier([] (QProcess::CreateProcessArguments *args)

 {

        args->startupInfo->wShowWindow = SW_HIDE;

        args->startupInfo->dwFlags = STARTF_USESHOWWINDOW | STARTF_USESTDHANDLES;

    });

//启用ffplay显示摄像头

procCam->start("ffplay -f dshow -i video=\"USB2.0 PC CAMERA\"");

//启动后延时等待

procCam->waitForFinished(1000);

//获取窗口标识

WId wid = (WId) processFindHwnd(procCam->processId(), "SDL_app");

QWindow *pWin = QWindow::fromWinId(wid);

if(pWin)

{

       //设置外部窗口嵌入容器

QWidget *pWid = QWidget::createWindowContainer(pWin, this);

//设置窗口位置

    pWid->setGeometry(10,10,320,240);

}

//通过进程id获得窗口类

#include <windows.h>

HWND processFindHwnd(

        quint64 procID, const char *lpszClassName, const char *lpszTitleName)

{

    char szClassName[1024], szTitleName[1024];

    HWND hWnd = GetTopWindow(GetDesktopWindow());

    while (hWnd)

    {

        DWORD wndProcID = 0;

        GetWindowThreadProcessId(hWnd, &wndProcID);

        if (wndProcID == procID)

        {

            if(lpszClassName != nullptr || lpszTitleName != nullptr)

            {

                GetClassNameA(hWnd, szClassName, sizeof(szClassName));

                GetWindowTextA(hWnd,szTitleName, sizeof(szTitleName));

                if(lpszClassName != nullptr && lpszTitleName != nullptr)

                {

                    if (strcmp(szClassName, lpszClassName) == 0 &&

                            strcmp(szClassName, lpszClassName) == 0)

                        return (HWND)hWnd;

                }else if(lpszClassName == nullptr)

                {

                    if (strcmp(szTitleName, lpszTitleName) == 0)

                        return (HWND)hWnd;

                }else if(lpszTitleName == nullptr)

                {

                    if (strcmp(szClassName, lpszClassName) == 0)

                        return (HWND)hWnd;

                }

            }else

                return hWnd;

        }

        hWnd = GetNextWindow(hWnd, GW_HWNDNEXT);

    }

    return 0;

}

//Pro文件中添加

LIBS +=User32.LIB

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值