视频处理技术是一个很大的范畴,包括了视频技术的很多方面。在软件中,主要实现了视频文件的分割,视频文件的合成,视频的格式转换,图像序列合成视频,视频的一些特效处理。

视频处理系统结构

在软件上,本系统的工程主要是DirectShow链路,主要包括源Filter,音视频分离Filter,解码Filter、编码Filter、合成Filter、写文件Filter。在软件编程以前,首先要按照要求,用GraphEdit对所使用的Filter进行仿真,看是否能对某种格式的文件进行正常的播放,如能正常的播放,将音视频显示Filter删除,加入音视频编码Filter,音视频合成Filter,写文件Filter;最后要对生成的新文件进行播放,如果不能正常播放,重新编码的链路是不能应用到系统的。下图是源视频文件播放链路:

下图是音频采用MPEG Layer-3编码,视频采用XVID MPEG-4编码,合成器使用的是AVI合成器:

下图是重新编码后保存的文件的播放链路:

如果上述三个图中的程序运行良好,就可以对这种格式的视频文件进行处理与转换。在GraphEdit中,只是对视频系统中DirectShow部分的链路进行了仿真,至于主控模式和其他具体的实现并未涉及。这也是DirectShow的一个优点:在未编程的情况下就可以用GraphEdit对链路进行仿真,验证各个方案的可行性。

在视频处理系统的设计中,还涉及到了很多格式,如ASF、MKV、DSM、OGM等格式,这些编码和要合成的方式,都要经过验证其各个链路的可行性才能用到系统编码设计中去。

视频处理流程图

视频处理系统会有功能控制面板,从选择面板上进入不同功能的界面,在该功能界面上解可以实现视频文件功能的处理。

视频文件分割

要实现视频文件的分割,就要建立实现分割的Filter链路。当然是创建Filter Graph Manager组件,管理整个Filter链路;然后通过创建或枚举的方法获得要加入链路的Filter,并通过AddFilter函数加入已获得的Filter。并依据源Filter只有输出Pin,在传输Filter上至少有两个Pin。一个输入Pin和一个输出Pin,也可能有更多的Pin,如果有需要,可以通过枚举Filter上的Pin的方法,获取Filter的信息,并获取各个Filter的Pin上的信息,为我们的连接提供有效的信息。其分割的流程图如下图所示:

在上图中,视频控制Filter设置截取的视频片段的开始时间与结束时间,音频控制Filter设置截取的音频片段的开始时间与结束时间。通过这两个控制Filter,实现从视频文件中截取用户设置的视频片段,从而实现了视频剪辑。

通过自定义分割可以保存感兴趣的片段,不感兴趣的片段舍弃,节省存储空间,方便管理查阅;通过平均分割,将大的视频文件平均切割成小的片段,方便管理查阅;在自动分割中,要先实现镜头边缘帧的检测,才能进行视频的自动分割。

视频文件合成

视频文件合成是将几段文件合成一段可以连续播放的视频文件。其实现原理是将视频与音频文件重新组织,打上相应的时间戳,设置帧率,重新编码,组成一段连续的视频文件。

DES是由一个有多个输入Pin和多个输出Pin的视频控制Filter和一个多个输入Pin和多个输出Pin的音频控制Filter,且两个Filter的输入输出Pin个数均是动态的并自动对源文件输出的视频帧率,音频的采样率进行调整,直接支持视频额缩放。

此系统中实现视频文件的合成,主要是构建各个文件的解码链路,将解码后的视频流与音频流分别接入到DES的视频与音频的控制Filter上,设置各个视频文件的媒体事件,以及在目标文件中的时间,在视频与音频的控制Filter输出端再接入视频压缩Filter与音频压缩Filter,并加入合成Filter将视频流与音频流合成一路视频流,最终通过写文件Filter实现视频文件的合成与保存。

视频文件合成步骤如下:

1)首先创建时间线对象TimeLine;

2)创建视频组对象与音频组对象,并设置视频与音频媒体类型,将视频组对象与音频组对象加入到时间线对象中;

3)添加视频与音频组上的轨迹,设置轨迹的先后顺序;

4)设置每个文件在目标文件中的开始时间与结束时间,加入到时间线对象中;

5)创建控制引擎,将时间线对象加入控制引擎中,连接控制引擎的前端,并取得控制引擎上的Filter Graph;

6)获取视频流的前端,利用Filter Graph 加入视频压缩Filter;

7)获取音频流的前端,利用Filter Graph 加入音频压缩Filter;

8)在Filter Graph中加入合成Filter,分别连接视频与音频Filter,将视频流与音频流合成一路系统流;

9)在Filter Graph中加入写文件Filter,与合成Filter连接,实现文件的存储;

10)获取Filter Graph上的接口,如IMediaControl、IMediaEvent、IMediaSeeking控制Filter Graph链路,运行、暂停、停止等。

视频文件格式转换

要想对视频文件重新编码,首先要将视频文件音视频分离,将音视频各自解码,解码后重新编码,将已经编码的音视频数据再合成,写入到目标文件。基于DirectShow开发框架,音视频文件分离器作为一个Filter,音频解码、音频编码、视频解码、视频编码等都作为独立的Filter,符合Filter的设计初衷,完成单一独立的功能。对于不同的视频文件,只要我们的视频文件能够播放,有相应的音视频编码器,音视频合成器,就可以对视频文件重新编码。要添加新的编码,也不需要改动程序,只要加入相应的Filter就可以,易于系统的扩展。

WM ASF Writer Filter是一个可以接受多种输入流,并将多种输入流转变成ASF文件格式的包装Filter,文件参数通过该Filter上的IConfigAsfWriter接口设置配置文件,该Filter根据配置文件的参数设置文件的各个参数。WM ASF Writer Filter在创建时,对于输入流会配置一个默认的配置文件。配置文件中包括要输出的流的位率、流的个数与类型、流的压缩质量等参数。该Filter根据配置文件决定生成什么类型的ASF文件,生产几个输入Pin,以及Pin的类型。

当默认的配置文件不能满足要生成的文件需要时,就要重新设置配置文件。在WM ASF Writer Filter 有一些已经生成的配置文件,具有唯一的GUID值,我们就是通过该GUID值来寻找配置文件,这些配置文件基本满足通常的需要,如果这些配置文件不符合要生成的文件参数要求,可以设置参数生成新的配置文件来满足需求。WM ASF Writer Filter 暴露了 IConfigAsfWriter接口,通过此接口改变配置文件来设置生成文件的各个参数。

WM ASF Writer Filter 也暴露了 IFileSinkFilter 与 IFileSinkFilter2,通过IFileSinkFilter 设置要生成的文件名称与文件路径,通过IFileSinkFilter2设置当生成新的文件,是否要删除已经生成的文件。

文件格式转换的流程图如下图所示:

在WM ASF Filter中,设置文件的路径,对要生成的格式进行配置,通过配置文件来设置编码格式,视频参数等信息。

图像序列合成视频

视频是活动的图像,正如像素是一幅数字图像的最小单元一样,一幅幅静止的图像组成了视频,图像是视频的最小和最基本的单元。视频是由一系统图像组成的,与静止图像不同,视频是活动的图像。当以一定的速率将一幅幅画面投射到屏幕上时,由于人眼的视觉暂留效应,我们的视觉就会产生动态画面的感觉,这就是视频的由来。对于人眼来说,若每秒播放24格(电影的播放速率)、25帧(PAL制电视的播放速率)或30帧(NTSC制电视的播放速率)就会产生平滑和连续的画面效果。

如果在图像序列合成视频的过程中,按照一定的算法将两帧静态图像拼接成一系列不同的中间帧,加入到相邻的两帧图像之间,组成新的视频。在新的视频原本相邻的两帧图像切换处就实现了特定的过滤效果,如淡入淡出、交叉溶解、水纹等效果。

图像序列合成与视频文件合成利用的是相同的技术,都是利用了DES技术基于时间线,图像合成视频的时间线序列如下图所示:

上方的箭头指明了时间方向,开始时间为0S。在0S到1S内,输出ImageA;在IS到2S内,由于Track1(轨道)的优先级高于Track0,发生了从Track0到Track1的过度。在过渡开始,输出的是ImageA的图像;在过度结束处,输出的Track1的ImageC;在过渡的中间状态,是ImageA和ImageC的混合体。在2S到3S内,输出ImageC;在3S处,由于优先级高的轨道上空,输出低轨道上的ImageB,这种切换是瞬时的。高优先级的轨道到低优先级的轨道是没有过渡状态的,除非特别设定。Render Video展示了最终的输出视频效果。

系统中实现了图像序列合成功能,并保存到指定的文件。但是只有在文件保存后我们才能观看到编辑效果。如果编辑效果不满意,则要进行重新编辑保存,增加了时间开销。为此我们增加了编辑预览功能,可随时观看编辑的效果,随时小改编辑效果,预览满意后再保存。其系统实现的流程图如下图所示:

在流程图中可以看到,系统实现主要包括时间线的构建。轨道的编排、过度参数的设置,媒体时间以及时间线时间设置,预览与保存功能的实现。

参考:

https://www.yuque.com/docs/share/82bd7070-1fca-4dda-ad82-47a3faf11bbd

DirectShow之视频处理相关推荐

  1. [转]DirectShow应用——视频捕捉WDM Vs VFW

    本文转自:http://bbs.njupt.edu.cn/cgi-bin/bbsanc?path=/groups/computer.faq/MultiMedia/D52F2B929/D99113C57 ...

  2. opencv+directshow采集视频图像

    主要参考: http://www.opencv.org.cn/index.php/%E4%BD%BF%E7%94%A8DirectShow%E9%87%87%E9%9B%86%E5%9B%BE%E5% ...

  3. DirectShow实现视频的实时显示并抓图,可以设置视频参数

    效果图如图所示: 1.DirectShow视频的显示 //初始化com CoInitialize(NULL); HRESULT hr; pBuilder = NULL; pGraph = NULL; ...

  4. windows下directShow音视频采集

    目录 前言 一.DirectShow简介 二.DirectShow视频采集主要流程介绍 1.DirectShow视频采集主要API介绍 三.视频采集软件设计框图 四.音频采集软件设计框图 <wi ...

  5. Directshow 捕捉视频入门篇

    这里是对视频捕捉设备的一些介绍 2 视频捕捉的设备 现在许多新的视频捕捉设备都采用的是WDM驱动方法(Windows Driver Model(WDM)的缩写,中文意思是"视窗驱动程序模块& ...

  6. (必看)视频开发项目的技术来源、实现形式、走向。 --VFW。DirectSHow 。MediaFoundation...

    1. DirectX.Directshow及Wince Directshow 1.DirectX是什么 DirectX(简 称:DX)是微软推出的一套基于Windows系统的多媒体应用程式接口APIs ...

  7. DirectShow 播放mp4编码 视频

    转载 自 : http://blog.csdn.net/wuanshi5/article/details/50392111 最主要的开发资料还是在 : http://blog.csdn.net/sha ...

  8. 基于DirectShow视频及图片捕获软件的开发(写的非常详细)在后几篇博客 我会更新

    我们知道目前很多工业相机的图像数据采集都是基于DirectShow的,常见的有映美精等.DirectShow是微软公司提供的一套在Windows平台上进行流媒体处理的开发包,与DirectX开发包一起 ...

  9. Windows SDK 7.1 (包含directshow)安装配置

    最近一直在做毕业设计的事情,需要利用directshow进行视频开发,但是现在单独的directshow包已经没有了,从directx9.0c开始directshow和directx分开发布,现在的d ...

最新文章

  1. docker 安装centos7并SSH远程连接
  2. iOS开发:Objective-C优雅的语法
  3. 谷歌三驾马车将成历史,创始人退位,皮查伊兼任母公司CEO
  4. oracle用户管理的完全恢复5:控制文件损坏(控制文件前后内容未改变)
  5. 验证用户身份Filter过滤器
  6. 诗歌rails 之with_options
  7. 网站开发技巧参考大全转
  8. webview 模拟点击_Android如何基于坐标对View进行模拟点击事件详解
  9. shell表达语句中,各种符号的释义 用法
  10. HttpServlet介绍
  11. 素数的判断(c语言)
  12. 尝试运行项目时出错,无法启动程序 , 由于应用程序配置不正确,未能启动此应用程序。请查看清单文件以查找可能的错误。
  13. python 找色点击_Python实现按键精灵(二)-找图找色
  14. 电流测试c语言算法,真有效值的定义及其C语言算法推导
  15. uniapp开发微信小程序canvas动画入门
  16. 淘宝客搜索链接组成详解
  17. 阿里云打造离线下载服务器
  18. GIS案例学习笔记-多边形内部缓冲区地理模型
  19. laravel+redis通过api简单实现微博登陆注册关注取消关注发布信息等
  20. 终于更新了!利用黎曼几何分析EEG脑电信号(三)

热门文章

  1. 如何低成本搭建dnslog服务器
  2. KernelGAN论文详解分享
  3. 虚幻4学习日志2021.4.1 关于瞬移(相机拉近)以及二段跳
  4. 制造系统的发展方向:收敛? 发散?
  5. 找不到启动设备按任意键重新启动计算机,[已解决]硬盘3f0 /找不到启动设备错误...
  6. ffmpeg代码实现往视频文件里面叠加文字
  7. android app 头像上传原理
  8. R语言 sub()用法
  9. html和css仿照京东网页页面(文本和链接的跳转)
  10. 无需MS Office创建Excel!再C ++中以编程方式在Excel电子表格中创建图表