>

多媒体编程学习01,ffmpeg的RTSP播放器直播与点播

- 编辑:mgm美高梅 -

多媒体编程学习01,ffmpeg的RTSP播放器直播与点播

 融合播放器基于DirectShow VRM9技术构建,只要系统安装相应的解码器,可以播放任

基于Live555,ffmpeg的RTSP播放器直播与点播

  Qt在图形界面程序开发上确实具有相当重要的地位,很多软件都是用Qt开发的比如autodesk的maya,Qt开发的图形界面的确相当吸引人,至少比MFC漂亮(个人觉得),这也是我喜欢Qt的主要原因。

视频播放器播放一个互联网上的视频文件,需要经过以下几个步骤:解协议,解封装,解码视音频,视音频同步。如果播放本地文件则不需要解协议,为以下几个步骤:解封装,解码视音频,视音频同步。他们的过程如图所示。

何格式的视频文件;此外融合播放器还可以显示各种常用格式的静态图片。

多路RTSP高清视频播放器下载地址:
多路RTSP播放器源码下载地址:
多路RTSP播放器SDK说明下载地址:
详细完整资料下载地址:

  视频文件的播放,实际上是四个过程。首先是文件的读取,再将文件数据分流成视频流和音频流,之后分别进行解码,最后输出解码数据,同步音频视频的输出实现视频的播放。这里利用Qt提供的Phonon库实现一个简单播放器,以供学习练手之用。播放器在功能上能够播放视频音频文件,能够调整进度和声音大小,能够记录播放历史,能够截屏和全屏播放,并且启动程序时会显示进度和关于信息。视频文件支持avi、rmvb、flv格式的文件,音频文件支持mp3和wma格式。截屏后图片保存为png格式。简要介绍一下Phonon库,下图为Phonon的架构:

图片 1

      高速播放借助显卡提供的视频解码加速,在CPU占用率极低的情况下可以流畅播放各种格

   QQ:1589385592 讨论群: 264575049

 

解协议的作用,就是将流媒体协议的数据,解析为标准的相应的封装格式数据。视音频在网络上传播的时候,常常采用各种流媒体协议,例如HTTP,RTMP,或是MMS等等。这些协议在传输视音频数据的同时,也会传输一些信令数据。这些信令数据包括对播放的控制(播放,暂停,停止),或者对网络状态的描述等。解协议的过程中会去除掉信令数据而只保留视音频数据。例如,采用RTMP协议传输的数据,经过解协议操作后,输出FLV格式的数据。

式高清数字影片。

1.综述

图片 2

解封装的作用,就是将输入的封装格式的数据,分离成为音频流压缩编码数据和视频流压缩编码数据。封装格式种类很多,例如MP4,MKV,RMVB,TS,FLV,AVI等等,它的作用就是将已经压缩编码的视频数据和音频数据按照一定的格式放到一起。例如,FLV格式的数据,经过解封装操作后,输出H.264编码的视频码流和AAC编码的音频码流。

      同步播放支持多台电脑网络同步播放,使系统通道数可以任意伸缩。

RTSP协议定义了一对多应用程序如何有效地通过IP网络传送多媒体数据,在体系结构上位于RTP和RTCP之上,它使用TCP或RTP完成数据传输。目前在流媒体传输技术中使用最多的就是基于RTSP/RTP的流媒体传输,在智能网络摄像机上也需要实现基于RTSP/RTP的H.264实时流的传输。

MediaObject :
    Phonon的基础,用于管理多媒体来源。来源可能是影音档等,能够提供基本的播放控制,例如开始、暂停或结束。而提供多媒体数据给MediaObject的则为media source,在给MediaObject之前通常是raw data,再由MediaObject进行转换。 

解码的作用,就是将视频/音频压缩编码数据,解码成为非压缩的视频/音频原始数据。音频的压缩编码标准包含AAC,MP3,AC-3等等,视频的压缩编码标准则包含H.264,MPEG2,VC-1等等。解码是整个系统中最重要也是最复杂的一个环节。通过解码,压缩编码的视频数据输出成为非压缩的颜色数据,例如YUV420P,RGB等等;压缩编码的音频数据输出成为非压缩的音频抽样数据,例如PCM数据。

      叠加窗口本机最多可以开16个窗口播放本地文件或动态采集的视频。窗口可以任意大

RTSP协议基于TCP完成RTSP请求报文和响应报文的传输,RTP协议基于UDP协议完成流媒体数据的实时传输,RTCP协议基于UDP协议提供客户端和服务器有关当前网络拥塞和以及实时流传输质量等信息。

Sinks :
      输出多媒体,例如在widget上播放影片或是输出至声卡(播放音乐)。通常sink是一个播放的装置(例如声卡等)。而sink只接受MediaObject来的数据,由MediaObject控制播放;而由sink来处理这些多媒体 

视音频同步的作用,就是根据解封装模块处理过程中获取到的参数信息,同步解码出来的视频和音频数据,并将视频音频数据送至系统的显卡和声卡播放出来。

小,显示在本机屏幕任意位置(全屏漫游功能)。

 

paths :
  用来连接Phonon的对象,意即MediaObject与Sink之间的连接。

流媒体协议 流媒体协议是服务器与客户端之间通信遵循的规定。当前网络上主要的流媒体协议如表所示。

      远程控制通过控制命令实现各种播放控制,支持二次开发各种播放界面。

2.架构设计

  播放器的结构类图如下:

图片 3

      应用框架单机配1块双输出显卡可以直接支持2通道播放,配2块双输出显卡可以直接支持

本文研究的流媒体播放器主要用来对遵循RTSP标准协议的码流以及AVI文件进行实时播放以及码流录制。播放器核心为两个 DLL,分别为网络 DLL 以及播放 DLL。网络库 基于 Live555 开发,主要对码流的获取以及链路的管理进行控制;播放库基于基于 Live555以及DirectX 开发,主要对实时码流以及本地的音视频的文件进行解码播放和控制。

  图片 4

RTSP RTP经常用于IPTV领域。因为其采用UDP传输视音频,支持组播,效率较高。但其缺点是网络不好的情况下可能会丢包,影响视频观看质量。

4通道播放。外接多屏宝可以将每个显卡输出口扩展到3通道,使单显卡最多支持6通道,双显

该RTSP播放器实现了主流RTSP播放器的基本功能,并有所拓展:

  一共定义了五个类,主类为Player类,即播放器主界面;ManageList类用于管理播放列表;FileProperty类为文件属性窗口类;PathURI类为路径选择窗口类;WizardPage为关于窗口类,每个类的构造函数和析构函数这里我没有列出来。Player类中的函数都是槽函数(private slots),Qt的一个特点就是信号和槽机制,将信号和对应需要执行的槽函数链接起来就能实现对事件的响应或者处理。Qt提供了两种方法完成信号和槽的映射,一种是直接在Qt creator界面中添加信号和槽函数的映射关系,另一种则是在代码中添加connect函数来实现。

因为互联网网络环境的不稳定性,RTSP RTP较少用于互联网视音频传输。互联网视频服务通常采用TCP作为其流媒体的传输层协议,因而像RTMP,MMS,HTTP这类的协议广泛用于互联网视音频服务之中。这类协议不会发生丢包,因而保证了视频的质量,但是传输的效率会相对低一些。

卡最多支持12通道。

(1)RTSP 标准码流(包括音视频)的实时预览播放;

  其中Player类中的media成员指向一个播放器对象,完成文件读取和分流的任务;vwidget指向播放界面,实现视频的播放;aOutput指向音频输出,实现音频的播放。volumeSlider指向音量控制控件,seekSlider指向播放进度控件。用createPath将media与vwidget链接起来,同样再将media与aOutput链接起来,使用Phonon提供的函数,实现3个按钮的功能,相当简单~~

此外RTMFP是一种比较新的流媒体协议,特点是支持P2P。

图片 5

(2)网络数据流的断线重连;

图片 6图片 7

封装格式 封装格式的主要作用是把视频码流和音频码流按照一定的格式存储在一个文件中。现如今流行的封装格式如下表所示:

(3)对存储文件的解码播放以及控制;

 1     media = new Phonon::MediaObject;
 2     vwidget = new Phonon::VideoWidget(ui->centralwidget);   //播放器界面
 3     Phonon::createPath(media,vwidget);
 4 
 5     //设置可播放的文件类型
 6     vwidget->setAspectRatio(Phonon::VideoWidget::AspectRatioAuto);
 7     aOutput = new Phonon::AudioOutput(Phonon::VideoCategory);
 8     Phonon::createPath(media,aOutput);
 9     volumeSlider = new Phonon::VolumeSlider;
10     volumeSlider->setAudioOutput(aOutput);
11 
12     volumeSlider->setSizePolicy(QSizePolicy::Maximum,QSizePolicy::Maximum);
13     seekSlider = new Phonon::SeekSlider;
14     seekSlider->setMediaObject(media);

图片 8

(4)音视频码流的同步存储,文件存储时以当前系统的时间戳作为音视频 播放时的索引,方便在文件播放时以时间戳作为检索条件来点播文件;

View Code

由表可见,除了AVI之外,其他封装格式都支持流媒体,即可以“边下边播”。有些格式更“万能”一些,支持的视音频编码标准多一些,比如MKV。而有些格式则支持的相对比较少,比如说RMVB。

(5)视频播放格式上支持 h.264、mpeg4、mpeg2 等,音频播放格式上支 持 AAC、AMR、G711 等;

图片 9图片 10

视频编码 视频编码的主要作用是将视频像素数据(RGB,YUV等)压缩成为视频码流,从而降低视频的数据量。如果视频不经过压缩编码的话,体积通常是非常大的,一部电影可能就要上百G的空间。视频编码是视音频技术中最重要的技术之一。视频码流的数据量占了视音频总数据量的绝大部分。高效率的视频编码在同等的码率下,可以获得更高的视频质量。

(6)视频抓拍;

 1 void Player::on_pbPlay_clicked()
 2 {
 3       media->play();
 4 }
 5 
 6 void Player::on_pbPause_clicked()
 7 {
 8     media->pause();
 9 }
10 
11 void Player::on_pbStop_clicked()
12 {
13      media->stop();
14 }

图片 11

(7)视频显示角度旋转;

View Code

由表可见,有两种视频编码方案是最新推出的:VP9和HEVC。目前这两种方案都处于研发阶段,还没有到达实用的程度。当前使用最多的视频编码方案就是H.264。

(8)画面填充控制显示比例。

 

主流编码标准 H.264仅仅是一个编码标准,而不是一个具体的编码器,H.264只是给编码器的实现提供参照用的。实际中使用最多的就是x264了,性能强悍(超过了很多商业编码器),而且开源。其基本教程网上极多,不再赘述。

3.程序框架

  播放器主界面如图所示,比较简略,但效果还不错:

音频编码 音频编码的主要作用是将音频采样数据(PCM等)压缩成为音频码流,从而降低音频的数据量。音频编码也是互联网视音频技术中一个重要的技术。但是一般情况下音频的数据量要远小于视频的数据量,因而即使使用稍微落后的音频编码标准,而导致音频数据量有所增加,也不会对视音频的总数据量产生太大的影响。高效率的音频编码在同等的码率下,可以获得更高的音质。

播放器整体设计参考VLC,MPLAYER等知名播放器,将整个数据的处理流程分为:input、demux、decode、output四个过程。其中input用来处理网络数据流的输入以及文件数据的读取;demux用来做数据流的解复用,将音频以及视频数据分离成ES流;decode用来解码视频以及音频ES流,并输出解码后的数据(视频为YUV数据,音频为PCM格式);output用来处理YUV视频数据的显示以及PCM音频数据的输出。

图片 12

图片 13

为支持多路媒体数据并行解码输出,对于每路媒体数据分别设计了相应的engine引擎机制来进行管理,具体实现方案如下:

  可以看到,主界面由播放界面、3个按钮、播放进度条、音频条、菜单、播放列表组成,功能也是一目了然,作为一个小播放器已经完全足够了。

由表可见,近年来并未推出全新的音频编码方案,可见音频编码技术已经基本可以满足人们的需要。音频编码技术近期绝大部分的改动都是在MP3的继任者——AAC的基础上完成的。

(1) 为实现多种输入方式的扩展性,将input、demux、decode、output四个过程划分为两个库来实现,分别为数据源解析库SourceSdk、播放库PlaySdk;

  菜单栏里主要功能有:1.File->(Open,OpenURI,Property,Exit)

现有网络视音频平台对比 现有的网络视音频服务主要包括两种方式:点播和直播。点播意即根据用户的需要播放相应的视频节目,这是互联网视音频服务最主要的方式。绝大部分视频网站都提供了点播服务。直播意即互联网视音频平台直接将视频内容实时发送给用户,目前还处于发展阶段。直播在网络电视台,社交视频网站较为常见。

(2) SourceSdK的管理功能由SourceEngine引擎来完成,主要对input以及demux模块进行封装管理。SourceEngine从数据源(直播、点播、文件)获取数据,并解析数据将数据源分离成音频ES流和视频ES流,并将解析的数据以私有格式进行封装,通过回调函数的机制传递给应用层;

            2.Edit->(Screenshort,ClearList)

图片 14

(3) PlaySdk的管理功能由PlayEngine引擎来完成,主要对decode以及output模块进行封装管理。PlayEngine提供了数据输入接口,通过该接口可以将从SourceEngine得到的数据传入该接口,放入PlayEngine缓存。PlayEngine从缓存中提取数据,并对数据按协议格式进行解析,将解析出的音视频数据分别回调;

               3.View->(FullScreen,NormalScreen,HideList)

直播服务普遍采用了RTMP作为流媒体协议,FLV作为封装格式,H.264作为视频编码格式,AAC作为音频编码格式。采用RTMP作为直播协议的好处在于其被Flash播放器支持。而Flash播放器如今已经安装在全球99%的电脑上,并且与浏览器结合的很好。因此这种流媒体直播平台可以实现“无插件直播”,极大的简化了客户端的操作。封装格式,视频编码,音频编码方面,无一例外的使用了FLV

(4) 为方便Engine对各模块的管理以及数据通讯,在内部设计了消息机制,可以通过Engine给模块发送消息控制各模块的正常运行;

            4.Sound->(Increase,Decrease)

  • H.264 AAC的组合。FLV是RTMP使用的封装格式,H.264是当今实际应用中编码效率最高的视频编码标准,AAC则是当今实际应用中编码效率最高的音频编码标准。视频播放器方面,都使用了Flash播放器。

(5) 在相互作用的模块之间,如decode与output之间采用高效的数据缓冲池机制来保证高效的内存分配,并通过队列机制将数据进行有效的传递;

  如果你想设置一个启动画面来显示进度和一些启动关于信息,则可以创建一个启动窗口类,在主函数中实例化Player类的对象前,先实例化一个启动窗口类,如图所示,图标是我随便从网上找的一个图,当进度条读完后,关于窗口关闭,显示播放器界面窗口。

图片 15

对于媒体数据大体处理流程图如下:

  图片 16

点播服务普遍采用了HTTP作为流媒体协议,H.264作为视频编码格式,AAC作为音频编码格式。采用HTTP作为点播协议有以下两点优势:一方面,HTTP是基于TCP协议的应用层协议,媒体传输过程中不会出现丢包等现象,从而保证了视频的质量;另一方面,HTTP被绝大部分的Web服务器支持,因而流媒体服务机构不必投资购买额外的流媒体服务器,从而节约了开支。点播服务采用的封装格式有多种:MP4,FLV,F4V等,它们之间的区别不是很大。视频编码标准和音频编码标准是H.264和AAC。这两种标准分别是当今实际应用中编码效率最高的视频标准和音频标准。

 

  main.cpp代码如下:

 

图片 17图片 18

4.主要技术

 1 #include <QtGui/QApplication>
 2 #include <QTextCodec>
 3 #include "player.h"
 4 #include "wizardpage.h"
 5 
 6 int main(int argc,char *argv[])
 7 {
 8     QApplication a(argc,argv);
 9     a.setApplicationName("VideoPlayer");
10     QTextCodec::setCodecForCStrings(QTextCodec::codecForName("UTF-8"));
11 
12 
13     WizardPage pg;
14     pg.show();
15     pg.processbar();
16 
17     Player w;
18     pg.close();
19 
20     w.show();
21     return a.exec();
22 }

播放器在功能和性能上具有较高的要求,具体的实现上,需要主要解决的关键技术点主要包括有:多路高清解码、兼顾低时延与流畅性、音视频同步以及浏览器扩展。针对以上问题,实现上采用的相应解决办法如下:

View Code

   4.1 多路高清解码
多路高清解码播放每路都由多个线程配合来完成整个数据的处理流程,在多路播放的情况下则更为复杂。因此需要在系统的实现上具有高效的多线程管理机制,以及对各模块的组织、内部互联互通上做出良好的设计:

   完成播放器的设计后还不够,仅仅这样是不能播放任何东西的,因为还需要解码器来解码视频,本程序是在linux下运行的,解码器用的比较好的是Gstreamer,楼主用的centos 6.0,默认状态下是没有安装任何解码器的,有一个省事的办法:centos一般都带了一个影音播放工具,可以直接打开播放一个视频,然后就会出现提示需要解码器,接着点击安装,就会自动安装相关的解码器以及一些必要的插件了,下载安装完成后再运行程序就能进行视频音频的播放了!Enjoy it~

(1) 通过SourceSdk、PlaySdk的实现,将繁琐的数据处理流程统一成了标准的数据接口,控制管理上方便有效;

   project下载地址:  有的还需要修改,还可以添加许多功能,比如快进等。

(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高清视频播放器下载地址:
多路RTSP播放器源码下载地址:
多路RTSP播放器SDK说明下载地址:

 ======================================================================

   QQ:1589385592 讨论群: 264575049 (群共享可直接下载)

(版权所有,转载请注明作者和出处)

本文由体育教学发布,转载请注明来源:多媒体编程学习01,ffmpeg的RTSP播放器直播与点播