基于Live555,ffmpeg的RTSP播放器直播与点播
基于Live555,ffmpeg的RTSP播放器直播与点播
多路RTSP高清视频播放器下载地址:http://download.csdn.net/detail/u011352914/6604437
多路RTSP播放器源码下载地址:http://download.csdn.net/detail/u011352914/6603251
多路RTSP播放器SDK说明下载地址:http://download.csdn.net/detail/u011352914/6603271
详细完整资料下载地址:http://video.vomont.com/strmedia.html
QQ:1589385592 讨论群: 264575049
1.综述
RTSP协议定义了一对多应用程序如何有效地通过IP网络传送多媒体数据,在体系结构上位于RTP和RTCP之上,它使用TCP或RTP完成数据传输。目前在流媒体传输技术中使用最多的就是基于RTSP/RTP的流媒体传输,在智能网络摄像机上也需要实现基于RTSP/RTP的H.264实时流的传输。
RTSP协议基于TCP完成RTSP请求报文和响应报文的传输,RTP协议基于UDP协议完成流媒体数据的实时传输,RTCP协议基于UDP协议提供客户端和服务器有关当前网络拥塞和以及实时流传输质量等信息。
2.架构设计
本文研究的流媒体播放器主要用来对遵循RTSP标准协议的码流以及AVI文件进行实时播放以及码流录制。播放器核心为两个 DLL,分别为网络 DLL 以及播放 DLL。网络库 基于 Live555 开发,主要对码流的获取以及链路的管理进行控制;播放库基于基于 Live555以及DirectX 开发,主要对实时码流以及本地的音视频的文件进行解码播放和控制。
该RTSP播放器实现了主流RTSP播放器的基本功能,并有所拓展:
(1)RTSP 标准码流(包括音视频)的实时预览播放;
(2)网络数据流的断线重连;
(3)对存储文件的解码播放以及控制;
(4)音视频码流的同步存储,文件存储时以当前系统的时间戳作为音视频 播放时的索引,方便在文件播放时以时间戳作为检索条件来点播文件;
(5)视频播放格式上支持 h.264、mpeg4、mpeg2 等,音频播放格式上支 持 AAC、AMR、G711 等;
(6)视频抓拍;
(7)视频显示角度旋转;
(8)画面填充控制显示比例。
3.程序框架
播放器整体设计参考VLC,MPLAYER等知名播放器,将整个数据的处理流程分为:input、demux、decode、output四个过程。其中input用来处理网络数据流的输入以及文件数据的读取;demux用来做数据流的解复用,将音频以及视频数据分离成ES流;decode用来解码视频以及音频ES流,并输出解码后的数据(视频为YUV数据,音频为PCM格式);output用来处理YUV视频数据的显示以及PCM音频数据的输出。
为支持多路媒体数据并行解码输出,对于每路媒体数据分别设计了相应的engine引擎机制来进行管理,具体实现方案如下:
(1) 为实现多种输入方式的扩展性,将input、demux、decode、output四个过程划分为两个库来实现,分别为数据源解析库SourceSdk、播放库PlaySdk;
(2) SourceSdK的管理功能由SourceEngine引擎来完成,主要对input以及demux模块进行封装管理。SourceEngine从数据源(直播、点播、文件)获取数据,并解析数据将数据源分离成音频ES流和视频ES流,并将解析的数据以私有格式进行封装,通过回调函数的机制传递给应用层;
(3) PlaySdk的管理功能由PlayEngine引擎来完成,主要对decode以及output模块进行封装管理。PlayEngine提供了数据输入接口,通过该接口可以将从SourceEngine得到的数据传入该接口,放入PlayEngine缓存。PlayEngine从缓存中提取数据,并对数据按协议格式进行解析,将解析出的音视频数据分别回调;
(4) 为方便Engine对各模块的管理以及数据通讯,在内部设计了消息机制,可以通过Engine给模块发送消息控制各模块的正常运行;
(5) 在相互作用的模块之间,如decode与output之间采用高效的数据缓冲池机制来保证高效的内存分配,并通过队列机制将数据进行有效的传递;
对于媒体数据大体处理流程图如下:
![]() |
4.主要技术
播放器在功能和性能上具有较高的要求,具体的实现上,需要主要解决的关键技术点主要包括有:多路高清解码、兼顾低时延与流畅性、音视频同步以及浏览器扩展。针对以上问题,实现上采用的相应解决办法如下:
4.1 多路高清解码
多路高清解码播放每路都由多个线程配合来完成整个数据的处理流程,在多路播放的情况下则更为复杂。因此需要在系统的实现上具有高效的多线程管理机制,以及对各模块的组织、内部互联互通上做出良好的设计:
(1) 通过SourceSdk、PlaySdk的实现,将繁琐的数据处理流程统一成了标准的数据接口,控制管理上方便有效;
(2) 在SourceSdk、PlaySdk内部实现上通过engine机制,对单路数据以及播放的管理提供了统一接口,对于多路播放实际上只需要管理多个engine即可;
4.2 低时延与流畅
在性能提高上通过减少对内存数据的拷贝以及额外的内存分配开销:
(1) 在PlaySdk中设计了回环数据缓冲机制,对应用层输入的数据进行高效的缓存,在传输decode模块时,避免了数据拷贝;
(2) 在数据解码中使用了ffmpeg的directbuffer机制,进一步的避免了数据的拷贝动作;
(3) 数据再各模块之间传递时使用数据缓冲池,避免了额外的内存分配操作,同时也减少了因内存分配操作而带来的内存碎片;
在低时延与流畅的平衡性上,通过设置最大缓冲帧数和最小缓冲帧数来实现控制,具体实现策略为:
通过比较待解码缓冲区和解码后还未来得及显示的缓冲区里数据包的个数的和值,如果该值大于最大缓冲帧数,说明有很多数据在缓存里,延迟大了,这时就要加快显示速度(减小output模块的休眠时间),最大缓冲帧数就是影响延迟的;反之一样, 最小缓冲帧数就是流畅的保证,该值越大就越流畅;通过改变这个最大值最小值就可以平衡延迟与流畅。
4.3 音视频同步
由于声音对时间的敏感性,所以在同步的处理上,系统以声音作为基准来参考,对视频的输出来进行调整,从而保证音视频的同步性,具体实现为:
通过比较音频和视频的时间戳(pts)来对视频的显示速度进行调整,如当前的视频的pts比音频pts大于最小偏差值(目前设置为200MS),说明视频快了,就放慢是视频的显示速度;反之就加快视频的显示速度;但是,如果差距太大(目前设置为1000MS), 大于最大偏差值时,加快视频的显示速度的效果不明显就采用丢帧方式,这个一般出现再刚开启的是时候。
4.4 WEB浏览器调用
针对不同的浏览器需要来制作成不同的插件,即需要根据具体浏览器的插件接口来编写,可以根据相应的项目需求开发开发支持响应浏览器的插件,一般性需求主要是IE浏览器OCX控件。
5.效果示例
![]() |
RTSP直播与点播:多路视频并发实时预览,窗口布局可动态调整;可动态的设置视频输出的显示比例,调整音量的输出大小;支持对视频内容的时间点检索等操作。
多路RTSP高清视频播放器下载地址:http://download.csdn.net/detail/u011352914/6604437
多路RTSP播放器源码下载地址:http://download.csdn.net/detail/u011352914/6603251
多路RTSP播放器SDK说明下载地址:http://download.csdn.net/detail/u011352914/6603271
======================================================================
QQ:1589385592 讨论群: 264575049 (群共享可直接下载)
======================================================================
(版权所有,转载请注明作者和出处)
基于Live555,ffmpeg的RTSP播放器直播与点播的更多相关文章
- Android流媒体开发之路三:基于NDK开发Android平台RTSP播放器
基于NDK开发Android平台RTSP播放器 最近做了不少android端的开发,有推流.播放.直播.对讲等各种应用,做了RTMP.RTSP.HTTP-FLV.自定义等各种协议,还是有不少收获和心得 ...
- 基于ffmpeg的C++播放器1
基于ffmpeg的C++播放器 (1) 2011年12月份的时候发了这篇博客 http://blog.csdn.net/qq316293804/article/details/7107049 ,博文最 ...
- 基于FFMPEG的跨平台播放器实现(二)
基于FFMPEG的跨平台播放器实现(二) 上一节讲到了在Android平台下采用FFmpeg+surface组合打造播放器的方法,这一节讲一下Windows平台FFmpeg + D3D.Linux平台 ...
- 基于FFMPEG的跨平台播放器实现
基于FFMPEG的跨平台播放器实现 一.背景介绍 FFmpeg是一款超级强大的开源多媒体编解码框架,提供了录制.转换以及流化音视频的完整解决方案,包含了libavcodec.libavformat等多 ...
- EasyPlayer_Android RTSP安卓播放器直播画面卡在第一帧问题修复
最近发现某些Android安卓手机在运行EasyPlayer播放视频时,会停留在第一帧画面,虽然有码率预示着接收端没有问题,但是画面却卡着不动. 一般来讲,这个现象有三种原因导致: 没有接收到视频帧; ...
- RTSP播放器开发填坑之道
好多开发者提到,在目前开源播放器如此泛滥的情况下,为什么还需要做自研框架的RTSP播放器,自研和开源播放器,到底好在哪些方面?以下大概聊聊我们的一点经验,感兴趣的,可以关注 github: 1. 低延 ...
- 视频播放器控制原理:ffmpeg之ffplay播放器源代码分析
版权声明:本文由张坤原创文章,转载请注明出处: 文章原文链接:https://www.qcloud.com/community/article/535574001486630869 来源:腾云阁 ht ...
- EasyPlayer RTSP播放器运行出现: Unable to load DLL 找不到指定的模块。exception from HRESULT 0x8007007E 解决方案
最近有EasyPlayer RTSP播放器的开发者反馈,在一台新装的Windows Server 2008的操作系统上运行EasyPlayer RTSP播放器出现"Unable to loa ...
- 如何实现Windows平台RTMP播放器/RTSP播放器播放窗口添加OSD文字叠加
好多开发者在做Windows平台特别是单屏多画面显示时,希望像监控摄像机一样,可以在播放画面添加OSD台标,以实现字符叠加效果,大多开发者可很轻松的实现以上效果,针对此,本文以大牛直播SDK (Git ...
随机推荐
- [nowCoder] 局部最小值位置
定义局部最小的概念.arr长度为1时,arr[0]是局部最小.arr的长度为N(N>1)时,如果arr[0]<arr[1],那么arr[0]是局部最小:如果arr[N-1]<arr[ ...
- Spring事务配置的五种方式(转)
前段时间对Spring的事务配置做了比较深入的研究,在此之间对Spring的事务配置虽说也配置过,但是一直没有一个清楚的认识.通过这次的学习发觉Spring的事务配置只要把思路理清,还是比较好掌握的. ...
- iOS 通过代码关闭应用程序
//-------------------------------- 退出程序 -----------------------------------------// - (void)exitAppl ...
- YWE复习
1.怎样使用C#的[状态栏][StatusStrip]控件 http://jingyan.baidu.com/article/851fbc37e7004e3e1f15ab3d.html 2.toolt ...
- cojs 自己出的题目 解题报告
省选成功成为河北B队队长QAQ 真是忧桑 所以在cojs上出了一套鬼畜的关于树的套题 黑白树: 我们先不考虑R操作 设x是u的祖先,那么fa(x)的贡献显然是 fa(x)*(sz(fa(x))-sz( ...
- 【mysql的编程专题⑤】自定义函数
用户自定义函数(user-defined function,UDF) 是一种对mysql的扩展途径,其用法与内置函数相同 创建自定义函数 语法 create function function_nam ...
- Qt 自定义model实现文件系统的文件名排序(重定义sort函数即可。忽然开窍了:其实捕捉点击Header事件,内部重排序,全部刷新显示即可)
前段时间,需要做一个功能是要做文件系统的排序的功能.由于是自己写的model, 自己定义的数据结构.最初的想法只有一个自己去实现文件夹跟文件名的排序算法,不过感觉比较费时间.后来想到的是QFileSy ...
- 前端必杀技之Javascript 第1天
学习了javascript基本语法和使用DOM进行简单操作 1.引用javascript方法: a.在<script></script>标签中加入js代码,如: <s ...
- 在PowerDesigner中设计物理模型1——表和主外键
原文:在PowerDesigner中设计物理模型1--表和主外键 在PD中建立物理模型由以下几种办法: 直接新建物理模型. 设计好概念模型,然后由概念模型生成物理模型. 设计好逻辑模型,然后由逻辑模型 ...
- C++:基类与派生类对象之间的赋值兼容关系
4.5 基类与派生类对象之间的赋值兼容关系 在一定条件下,不同类型的数据之间可以进行类型转换,例如可以将整型数据赋给双精度型变量. 在赋值之前,先把整型数据转换为双精度型数据,然后再把它双精度型变量. ...

