手机直播系统偶尔会需要到的:Windows 下视频采集技术

Windows下视频采集的方法

在 Windows 下主要有两种方法来采集视频: 一种是通过 Media Foundation,另一种是通过 DirectShow。

Meida Foundation 是 Windows 从 vista 之后推出的一套全新的 多媒体SDK,简单方便,从 Win7 开始成熟起来。

另一种是 DirectShow,它主要用于 win7 之前的采集视频。使用 DirectShow 编写代码比较麻烦,主要是因为 Windows 工程师按照逻辑电路的思维方式设计了 DirectsShow 的开发接口,引入了什么 filter, pin之类的概念。这些老掉牙的东西现在估计没几个人能搞明白,除非你是从那个时代过来的,哈哈。

这也解释了为啥现在很少有人学习 Windows 程序开发了,就是因为跟不上时代。你看人家 Android/iOS做视频采集多简单,你整的这么麻烦,谁还愿意学!

Media Foundation的一些概念

DirectShow 方案我们放到以后再分析,今天我们主要讲下 MediaFoundation 如何进行视频采集。

在讲之前,我们先要补充一些基本概念。这些概念大家可以从Media Foundation Programming Guide 找到。下面的文字基本是翻译的 Windows 的官方文档。

MF(MediaFoundation)的整体结构图如下:

MF 提供了两种不同的编程模型。第一种是上图的左半部分,媒体数据通过端到端的管道传递。Application首先初始化管道,然后调用相应方法控制管道中的流。第二种如上图的右半部分,Application可以从 Source Reader拉数据,也可以向 Sink Writer 推数据。这种模型对于处理数据非常有用。

Primitives 和 Platfrom

图底部的 Primitives 是一些辅助API:

  • Attributes: 相当于一个 Map, 由 key/value 组成。
  • Media Type: 描述媒体数据流的格式。
  • Media Buffers: 存放一段媒体数据。
  • Media Samples: 存放 Media Buffers 的容器,相当于一个 Buffter List。

MF Platform 提供了一些核心功能的API。例如异步调用、工作队列。

Media Pipeline

Media Pipeline 包括三种类型对象:Media Sources、MFTs(Media Foundation Transfors)、Media Sink。

  • Media Sources: 将数据引入到管道里。数据可以来自本地文件,网络流或都是硬件设备。
  • MFTs: 处理流数据。在 MFTs 里实现了编解码器。
  • Media Sink: 消费数据。显示视频到显示屏上,播放声音或写数据到媒体文件。

Media Session 通过管道控制数据流。如质量控制,音频/视频同步,格式的改变。

Source Reader 和 Sink Writer

Source Reader 和 Sink Writer提供了使用 Media Foundation 的另一种方法(相较于 media source, transforms, media sink)。

  • Source Reader 控制着 media source 和 多个解码器。
  • Sink Writer 控制着 media sink 和 多个编码器。

你可以使用 Source Reader 从 media source 获取到压缩或未压缩的数据,并使用 Sinker Writer 编码数据并发送给 media sink。

下面我们就来看看 MF 是如何采集视频数据的。

采集视频数据

通过上面的介绍,我们基本可以知道 MF 采用 从源采集数据,编解码,输出渲染这种架构来处理多媒体。这种方式通俗易懂,使用起来非常方便。

MF采集视频的基本步骤

MF采集数据使用的是架构中的第二种编程模型,其步骤如下:

  • 初始化 COM 组件。
  • 获取视频设备列表。
  • 激活某个视频设备,获取该设备的 Media Source。
  • 根据请求命令和 Media Source 创建 Source Reader。
  • 为 Source Reader 设置 Media Type。
  • 通过 Source Reader 从设备中读取 Media Type 格式的视频数据。

以上就是 MF 从视频设备采集数所的基本步骤,下面我们来详细介绍每一步。

详细分析

由于每一步的代码都实分简单,我这里就不做过多的文字描述了,通过下面的代码及其注释大家很容易理解其中的每一步。

初始化 COM 组件并启动 MF

CoInitializeEx(NULL, COINIT_APARTMENTTHREAD | COINIT_DISABLE_OLEDDE)
MFStartup(MF_VERSION)

获取所有的视频设备

IMFAttributes *videoCmd = NULL;
IMFActivate **videoDevices = NULL;
UINT32 videoDeviceCount = 0;

//设置获取视频设备的命令
MFCreateAttributes(videoCmd, 1/*表示只分配一项*/);
videoCmd->setGUID(
                MF_DEVSOURCE_ATTRIBUTE_SOURCE_TYPE,  //key
                MF_DEVSOURCE_ATTRIBUTE_SOURCE_TYPE_VIDCAP_GUID); //value
//获取视频设备列表
MFEnumDeviceSources(
                videoCmd,
                &videoDevices, //这里是设备列表
                &videoDeviceCount); //这里存放的是设备的个数

激活某个视频设备

IMFMediaSource *mediaSource = NULL;

//激活第一个视频设备,并为该设置备生成逻辑上的媒体源(Media Source)
videoDevices[0]->ActivateObject(IID_PPV_ARGS(&mediaSource));

创建 Source Reader

IMFSourceReader *soureReader = NULL;

//通过媒体源和请求命令,可以获取source reader。(第二种开发模型)
MFCreateSourceReaderFromMediaSource(
                mediaSource,
                videoCmd,
                &sourceReader);

设置 Media Type

IMFMediaType *mediaType = NULL;

MFCreateMediaType(&mediaType);
//设置媒体为视频
mediaType->SetGUID(MF_MT_MAJOR_TYPE, MFMediaType_Video);
//YUV格式为 I420
mediaType->SetGUID(MF_MT_SUBTYPE, WMMEDIASUBTYPE_I420);
//每个视频帧的大小为 640 * 480
MFSetAttributeSize(mediaType, MF_MT_FRAME_SIZE, 640, 480);
sourceReader->SetCurrentMediaType(MF_SOURCE_READER_FIRST_VIDEO_STREAM,
                         NULL,
                         mediaType);

读取数据

IMFSample *sample = NULL;
DWORD index, flags;
LONGLONG llVideoTs;

while(runing){
    sourceReader->ReadSample(
                    MF_SOURCE_READER_FIRST_VIDEO_STREAM,
                    0,
                    &index, //实际流的index
                    &flags, //staus flags
                    &llVideoTs, //时间戳
                    &sample); //存放采集到的视频数据
}

通过上面简单的几步,就可以轻松的从视频设备里取到视频数据了。MF相对于 DirectShow真是简单太多了。

上面介绍的是使用同步方式使用MF采集视频数据,MF还提供了效率更高的异步方式获取视频数据,有兴趣的朋友可以以本篇文章为基础去学习它的异步方式。

小结

今天向大家介绍了在 Windows下使用 MF 如何采集视频的方法。通过以下 6 步即可做到:

  • 初始化 COM 组件。
  • 获取视频设备列表。
  • 激活某个视频设备,获取该设备的 Media Source。
  • 根据请求命令和 Media Source 创建 Source Reader。
  • 为 Source Reader 设置 Media Type。
  • 通过 Source Reader 从设备中读取 Media Type 格式的视频数据。

另外, MF 的采集方案只适用于 Win7 以后的系统,对于之前的系统还是要使用 DirectShow 方案。我也会在后面再为大家介绍如何使用 DirectShow 采集视频。

原文地址:https://www.cnblogs.com/CDNfast/p/10209283.html

时间: 2024-12-21 17:41:16

手机直播系统偶尔会需要到的:Windows 下视频采集技术的相关文章

云豹方维直播源码,手机直播系统搭建经验分享!

手机直播程序直播系统搭建经验浅谈方法!前端推流1.推流可以采用命令: ffmpeg -i input -vcodec copy -acodec copy -f flv rtmp://127.0.0.1/live/cgstream0input 可以是实时流,也可以是文件,如果是文件 需要加上-re.运用中需要将127.0.0.1 换成rtmp所在机器的ip地址.用命令推流时间戳信息不能任意修改,想要达到一个满意的结果还是要用代码实现.主要方法代码如下:1.打开视频流,filename可以文件名称也

Android手机直播系统开发介绍

近两年直播热的兴起也带动了直播开发行业的崛起,每个人都想要去吃直播开发这块蛋糕.但这块蛋糕也不是这么容易吃到的,在激烈的市场竞争下,有几个大的直播平台始终占据着市场中较大的份额,也有一些小的公司承受不住冲击倒下,只有拥有高精尖的技术,才能够在市场中拥有一席之地.直播开发不是一件能够容易完成的事情,安卓和苹果对于搭建的要求就不一样,今天我们就先了解一下安卓如何搭建直播系统.如果一上来就要去搭建一个直播系统,基本是不可能的,首先我们要从总体上了解直播到底是什么.手机直播要实现的就是将手机采集到的视频

类似快手、抖音手机直播程序搭建经验分享

类似快手.抖音手机直播程序搭建经验分享-呆萌手机直播程序搭建系统管理后台视频上步骤直播行业近年来的发展是有目共睹的,如今通过手机直播源码可以快速搭建部署一套功能丰富的直播系统.很多直播平台运营商在自己的直播系统上线运营之前都会先进行下系统的测试,有时会面临手头的主播资源不足的尴尬境地.此时,可以通过在直播系统管理后台上传其他直播平台的直播录制视频的方式来进行测试.那么具体的操作方式是怎样的呢?本篇就为大家详细分享视频上传经验.一.呆萌手机直播程序搭建视频录制1.????推荐使用UC浏览器,电脑安

手机直播开发杂谈之:直播原生源码+APP+直播系统推流SDK(Android)

情不知所起而一往情深心不知所动而生死相许先朗诵两句诗词抒发一下美好的心情,正如两句诗词一样,我的心慢慢的也被这个自媒体时代的直播网络所偷走,时代的变化注定这个时代的文化,下面是我对直播开发一些浅显的解析:第一步:分解手机直播系统开发功能,了解你所需要的直播功能第二步:寻找合适的云服务SDK进行嵌入,在APICloud的聚合API中可以轻易找到以上的功能模块,挑选合适的模块封装到自己的App中第三步:1App框架搭建,在APICloud Studio中直接创建应用框架,有三个常用页面框架备选2.积

手机直播源码:手机直播平台如何搭建?

第一步:分解手机直播系统开发功能,了解你所需要的直播功能第二步:寻找合适的云服务SDK进行嵌入,在APICloud的聚合API中可以轻易找到以上的功能模块,挑选合适的模块封装到自己的App中第三步: App框架搭建,在APICloud Studio中直接创建应用框架,有三个常用页面框架备选:2.积木式拼装,将所有你挑选好的模块,用Java编写页面及模块调用,运用HTML5+CSS3搭建应用的界面UI,完成App编码全过程:3.真机调试,通过模拟器和真机调试功能进行App优化,一键点击即可在iOS

直播系统后台管理的功能介绍

哈喽,大家好!今天我们来介绍下那些特色功能是如何通过管理后台进行配置的,重点是视频管理.家族管理.代理管理.守护管理.红包管理等.视频管理功能视频管理功能主要针对于直播平台制作时包含小视频录制互动功能的系统.而小视频的显著的特点则是音乐和视频审核推荐机制.针对于音乐功能,后台应当支持编辑音乐类型操作,编辑上传音乐内容,查看音乐内容详情,以及音乐试听等.视频管理部分则包含添加上传视频功能,视频审核列表.视频下架列表.举报视频列表等.通过这些视频列表的展示,可以方便平台运营者掌控整个平台的小视频内容

视频直播系统解决方案—是基于声网SDK实现的

"在2019年5G创新发展峰会暨中国联通全球产业链合作伙伴大会上,中国联通董事长王晓初正式宣布联通5G实验网开通."伴随5G的到来,网络流畅度的提升,视频直播系统将持续火爆,视频直播系统解决方案也得到了快速解决,用户体验直播的场景也将实现多元化.这样一来我们必将涉及到海外的用户.我们开发的直播软件系统是怎样让海外客户来体验直播热情的呢?下面我来介绍下我们的视频直播系统是基于声网SDK的直播.连麦技术实现:1.初始化并设置代理: AgoraRtcEngineKit *rtcEngine

关于云事通监控摄像头手机微信直播系统业务介绍

云眼微视监控摄像头手机微信视频直播系统是将实时视频通过微信页面进行直播,并多方上百方同时访问,手机微信公众号可以直播将监控设备(IP Camera.DVS.DVR.NVR.3G.移动智能手机等硬件)的视频通过云眼微视云运营平台转发,通过手机.电脑设备的监控视频直播访问服务,支持各个厂家平台对接,可接入第三方监控设备:通过Onvif视频转码网关提取监控摄像头视频流,进行服务器端转发,实现跨平台无插件的网页监控视频调用,PC端.安卓.IOS苹果等主流终端直接访问,打开同一个网页地址都可以观看,同时也

用手机APP观看热门剧《楚乔传》的P2P流媒体直播系统解决方案

近期热播的大剧<楚乔传>,网友们对最新剧情讨论得热火朝天:楚乔传>什么时候结局? 最新剧情预告呢?楚乔燕洵是否分手?蒙枫喜欢宇文玥吗?掀起了一股观看风潮. 随着这部励志大剧热播,一些关于手机观看<楚乔传>的APP的搜索关键词迅速铺开来: 1  有可以直接在手机上看直播<楚乔传>的APP吗? 2  爱奇艺热门剧播放后台是用的P2P流媒体直播/点播系统吗? 3  热播剧手机直播所需的P2P流媒体平台如何搭建? 4  如何开发共享直播系统的终端观看APP? 5  哪个手