博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
抛开flash,自己开发实现C++ RTMP直播流播放器
阅读量:5951 次
发布时间:2019-06-19

本文共 1362 字,大约阅读时间需要 4 分钟。

众所周知,RTMP是以flash为客户端播放器的直播协议,主要应用在B/S形式的场景中。本人研究并用C++开发实现了RTMP直播流协议的播放器,结合之前做的RTMP直播采集端,可以将RTMP协议完全扩展到C/S形式的应用场景中,这将对之后的通用、全平台的流媒体架构设计和实现,打下坚实的基础。

开发的意义

  RTMP直播协议,是Adobe公司推出的以flash播放器为客户端的实时直播流协议,是一种应用非常广泛的通信协议。而flash直播,也是到目前为止,web页面上最成熟的直播技术。不过,因为flash主要是嵌入到web页面中,因此,RTMP直播,通常也就局限在B/S形式的直播应用。

  我之前陆续做了很多与RTMP直播协议相关的项目开发,都是采集发布端的,数据发往FMS等rtmp服务器之后,最终是通过flash来收看的。并不是考虑flash本身好或不好的问题,而是想把这个BS的技术直播协议,不借助Adobe Air平台,扩展到C/S场景中,这样,用户不仅可以在网页上收看RTMP协议的直播流,还可以通过客户端来收看,大大丰富了直播协议的灵活度。另外,实现了这一点,为RTMP直播协议的跨平台,以及跨移动平台(Android, iOS)的应用,也提供了可能。有很好的前景。

  比如,通过实现不同平台上的rtmp播放器,来实现如下架构。

  

设计和流程

  其实,实现RTMP直播流播放器,逻辑上和实现其他直播流协议播放器,是一致的,整体上程序可以分为三个部分

  • RTMP直播数据下载与数据包分解
  • 数据包中分离H.264和AAC数据,并解码
  • 视频渲染和音频播放

  实现的模块,以及主要流程,如下图所示

  

  目前为止,这个设计是为Windows PC端开发所做,将来会做进一步移植,这个情况下,主要是修改视频渲染和音频播放的实现。

细节与实现

1. RtmpDownloader

   RtmpDownloader模块非常重要,我这里是将librtmp作为底层的rtmp传输协议。在librtmp之上,除了接口调用,还需要进行数据包的解析,h.264视频数据和aac音频数据的分离,以及从中解析出重要的解码信息,交给解码器解码,并初始化渲染器。整个的框架和流程如下图

  

 

  RtmpPlayer四个接口所代表的意义下面列了出来。这就是RTMP下载最需要获取到的数据,以及解码信息。

  

2. 渲染和播放

   说到视频渲染,这似乎是个坑,相信做播放器开发的朋友会有说不完的话,不过我在这里就简单贴下我的主要渲染流程。Windows上视频渲染可以选择的方式有很多,比如Direct3D、DirectDraw、GDI,OpenGL等,这里选择d3d的方式来渲染。

  音频播放可以选择WAVE系列函数,或者DirectSound的接口等,这里我选择使用WAVE接口,原因当然是比较简单啦 :)

  

  

实际效果

  播放一下从网上找到的深圳卫视rtmp直播流地址,画面清晰,音视频同步,效果还不错 :)

  

  配合之前做的RTMP采集推送端,可以完全脱离flash来实现基于RTMP协议的直播。

     

 

from:http://www.cnblogs.com/haibindev/p/3466094.html

你可能感兴趣的文章
成为Java顶尖程序员 ,看这11本书就够了
查看>>
新手入门学习(一)
查看>>
day10 nfs服务,nginx负载均衡,定时任务
查看>>
linux概念之/dev/shm
查看>>
shell之条件表达式
查看>>
实例!软件缺陷数据度量和分析
查看>>
sql performance Kill Lock
查看>>
php上传视频html代码,HTML_html5拍照功能实现代码(htm5上传文件),1、 视频流HTML5 The Media Capture - phpStudy...
查看>>
php intelephense,vsCode 使用 PHP Intelephense插件函数跳转跟踪
查看>>
mysql 日期小时,如何从MySQL中的日期时间减去3小时?
查看>>
mysql存储过程批量多表删除,[mysql]表批量操作的存储过程
查看>>
linux界面如何配置永久路由,linux 添加永久路由的几种方法。
查看>>
c语言程序设计 平时作业,20春学期《C语言及程序设计》在线平时作业1答卷.txt...
查看>>
linux搭建nfs实验报告,Linux配置NFS服务【实验】
查看>>
c语言中存储器的绝对地址,51单片机C语言编程中对单片机绝对地址访问的两种方法...
查看>>
首师大852c语言真题2005,2005年上半年全国计算机二级C语言笔试真题
查看>>
html 引入地址地址,jQuery 在线引用地址
查看>>
html中值怎么传给qml函数,qt – 如何将“this”从QML元素传递给JS函数
查看>>
php7扩展安装奇葩事
查看>>
Android架构纵横谈之二—基于性能的考虑(1)
查看>>