VC++实现视频聊天:VFW视频采集+FFmpeg编码

本文介绍了如何使用VC++实现视频聊天功能,主要涉及VFW进行视频采集,包括预览视频和回调函数的使用,以及FFmpeg进行视频编码的初始化和编码线程的实现。通过VFW创建视频窗口并预览,利用回调函数获取视频帧,再用FFmpeg将YUV420数据编码成h265码流,最后通过网络传输发送出去。
摘要由CSDN通过智能技术生成

上次介绍了视频聊天软件的界面、文字聊天、文件传输部分,这此介绍视频聊天功能,这算是音视频领域一个很广的应用。首先视频聊天的双方需要有一个USB摄像头(或者笔记本摄像头),在windows系统下,一个完整的视频流程应该有如下步骤:

采集摄像头数据--> 视频帧编码 --> 码流网络传输 --> 解码 --> 播放

然后按流程来选择相应的工具分块实现,串联起来,就可以聊天了。本次视频聊天使用的工具如下:

vs2010;windows; VFW视频采集、FFmpeg编解码、Socket网络传输、VFW播放

效果如下,因为只有一个摄像头,只做了发送方的视频采集和接收方的显示视频。

这里写图片描述
这里写图片描述

视频采集

目前市场上常用的视频采集工具有VFW、DirectShow,FFmpeg也可以采集视频。其中VFW(Video for Windows)是微软公司92年推出的数字视频软件包,很古老的技术,目前已不再更新了,DirectShow是微软公司在VFW的基础上推出的新一代基于COM(Component Object Model)的流媒体处理的开发包,功能比VFW更强大、效果更好。但VFW调用特别方便,如果对视频采集不高,VFW还是不错的选择。
VFW是WIN32 SDK 中多媒体编程SDK 的视频开发工具,在微软的Visual C ++中提供了Vedio for Windows 的头文件vfw.h 和库文件vfw32.lib,只需在StdAfx.h 中加入以下内容:

include < vfw.h >
#pragma comment(lib,"vfw32.lib")

视频采集阶段的任务有两个:1. 本地预览视频 2. 使用回调函数获取视频帧

1. 预览视频

(1)在原聊天界面上增加“视频”按钮,点击按钮创建非模态子对话框,这样就可以实现文字聊天与视频的并行处理。
(2)视频聊天对话框 中,OnInitDialog()中利用capCreateCaptureWindow函数创建窗口,并且得到返回的窗口句柄。

    BOOL m_bInit = FALSE;
    CWnd *pWnd = GetDlgItem(IDC_VIDEO_STATIC);//得到预示窗口指针
    CRect rect;
    pWnd->GetWindowRect(&rect); 
    g_hWnd = capCreateCaptureWindow(NULL,
    WS_CHILD|WS_VISIBLE|WS_EX_CLIENTEDGE|WS_EX_DLGMODALFRAME,
        0,0,rect.Width(),rect.Width(),
        pWnd->GetSafeHwnd(),0); // 设置预示窗口

这里g_hWnd是视频窗口句柄,会一直用到,这里设为了全局变量
(3)连接驱动器(win7下有时只能第一次连接上,建议使用循环不断连接驱动器),

while(!m_bInit)
{
    m_bint = capDriverConnect(g_hwnd,0);  //连接0号驱动器
}
//获得驱动器性能
CAPDRIVERCAPS m_CapDrvCap;
capDriverGetCaps(m_hWnd,sizeof(CAPDRIVERCAPS),&m_CapDrvCap);

(4)设置预览

if(m_CapDrvCap.fCaptureInitialized)    
{
    capSetUserData(m_hWndVideo,this);  //指针绑定句柄
    capGetStatus(m_hwnd, &m_CapStatus,sizeof(m_CapStatus));
    capPreviewRate(m_hwnd,30); 
    capPreview(m_hwnd,TRUE);           //预览视频
}

实现以上4步,就完成了视频预览的全过程,运行程序你就会欣喜地在对话框上看到摄像头的画面了,采集视频就是这么简单。

2. 回调函数

评论 15
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值