C# 来做 视频播放 视频流处理 转码 实时传输

最近一直在研究视频实时查看播放 很遗憾 只成功了一半 记录一下历程 以便大家相互交流

项目需求是  GPS 视频设备  连接服务器  将视频流走RTP  协议发送到服务器 服务器将接收的视频流 传输给客户端 实时查看

1.第一步 上网查了一下 RTP是什么 参考  http://blog.csdn.net/chen495810242/article/details/39207305

2.第二步 上网查了 视频是由什么组成的 参考 视频编码之I帧 、P帧、B帧  http://www.cnblogs.com/zhangming-blog/articles/6000518.html

视频传输原理  

视频是利用人眼视觉暂留的原理,通过播放一系列的图片,使人眼产生运动的感觉。单纯传输视频画面,视频量非常大,对现有的网络和存储来说是不可接受的。为了能够使视频便于传输和存储,人们发现视频有大量重复的信息,如果将重复信息在发送端去掉,在接收端恢复出来,这样就大大减少了视频数据的文件,因此有了H.264视频压缩标准。

在H.264压缩标准中I帧、P帧、B帧用于表示传输的视频画面。

1、I帧

I帧又称帧内编码帧,是一种自带全部信息的独立帧,无需参考其他图像便可独立进行解码,可以简单理解为一张静态画面。视频序列中的第一个帧始终都是I帧,因为它是关键帧。

2、P帧

P帧又称帧间预测编码帧,需要参考前面的I帧才能进行编码。表示的是当前帧画面与前一帧(前一帧可能是I帧也可能是P帧)的差别。解码时需要用之前缓存的画面叠加上本帧定义的差别,生成最终画面。与I帧相比,P帧通常占用更少的数据位,但不足是,由于P帧对前面的P和I参考帧有着复杂的依耐性,因此对传输错误非常敏感。

3、B帧

B帧又称双向预测编码帧,也就是B帧记录的是本帧与前后帧的差别。也就是说要解码B帧,不仅要取得之前的缓存画面,还要解码之后的画面,通过前后画面的与本帧数据的叠加取得最终的画面。B帧压缩率高,但是对解码性能要求较高。

总结:

I帧只需考虑本帧;P帧记录的是与前一帧的差别;B帧记录的是前一帧及后一帧的差别,能节约更多的空间,视频文件小了,但相对来说解码的时候就比较麻烦。因为在解码时,不仅要用之前缓存的画面,而且要知道下一个I或者P的画面,对于不支持B帧解码的播放器容易卡顿。

视频监控系统中预览的视频画面是实时的,对画面的流畅性要求较高。采用I帧、P帧进行视频传输可以提高网络的适应能力,且能降低解码成本所以现阶段的视频解码都只采用I帧和P帧进行传输。海康摄像机编码,I帧间隔是50,含49个P帧。

3.第三步 了解完基础知识后 开始编写  服务器接收端  直接监听一个TCP端口  操作设备开始连接这个端口发送视频流 (注意 由于TCP 发送最大字节最好不要超过1470 不了解的可以百度  而视频的每一帧 远远超过了这个长度 所以需要拆包发送  服务器根据分包 在合成 相应的 I帧 P帧 和B帧)最后形成一个完整的H264 视频裸码流

4.第四步 直接将收到的裸码流 合成视频文件  用暴风影音或者支持h264裸码流直接播放 成功出视频  成功的一半就是这了

5.第五步 客户端实时播放 这一块伤脑筋了  H264 需要解码 一般的播放器才支持  直接谷歌百度这方面资料

6.第六步开始研究 视频帧解码  搜索得知  ffmpeg    SharpFFmpeg    海思SDK  yuv 心好累全是C++的 网上C#的示例很少

7.第七步 ffmpeg    直接调用他提供的.exe 能将我合成的裸码流文件 直接转换成通用播放器支持播放的视频文件 但是 每一帧去调用 转换成 yuv  进行实时播放 失败  调用的ffmpeg   dll  海思SDk  都没有成功 卡壳了

参考:

http://www.cnblogs.com/zlp520/p/4238097.html

8.总结: C#搞这个的是不是不行demo太少了 开源少   网上基本全是C++的示例和开源  同时想咨询交流下 C#有这方面经验的人

9.继续 谷歌 百度 寻找答案

以下为 海思SDK 调用代码

http://www.cnblogs.com/tracky/archive/2013/06/05/3118205.html?utm_source=tuicool

以下为 ffmpeg   下载网址

https://ffmpeg.zeranoe.com/builds/

以下为 SharpFFmpeg   下载网址 SharpFFmpeg   是用C#封装 ffmpeg 提供调用

https://ncu.dl.sourceforge.net/project/sharpffmpeg/SharpFFmpeg/SharpFFmpeg_2.0/SharpFFmpeg_2.0_src.zip

上一篇:【转】Tomcat的默认访问路径


下一篇:2016-11-10:win7下VMware虚拟机中CentOS6.5网络配置