抛开flash,自己开发实现C++ RTMP直播流播放器

众所周知,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

时间: 2024-08-30 06:00:59

抛开flash,自己开发实现C++ RTMP直播流播放器的相关文章

nginx开发(四)调用ffmpeg,搭建rtmp直播流。

1: 修改conf文件,配置rtmp直播 打开usr/local/nginx/conf/nginx.conf,添加红色内容: rtmp {#rtmp点播配置    server {        listen 1935;        chunk_size 4000;        application  vod {                play /usr/local/nginx/html/multimedia/rtmp/vod;  #点播媒体文件存放目录        }    }

Win8系统Flash视频无法观看提示未安装Falsh播放器怎么办?

Win8系统Flash视频无法观看提示未安装Falsh播放器怎么办? 解决步骤: 1.进入IE浏览器,打开右上角工具(是个小齿轮的标记,如图)---管理加载项; 2.查看Shockwave flashObject的加载项是否被禁用,如果禁用请启动该加载项; 3. 如果未解决问题,请通过微软网站下载微软补丁. 64位:http://go.microsoft.com/fwlink/?LinkId=252627 32位:http://go.microsoft.com/fwlink/?LinkId=25

Android应用开发之简易、大气音乐播放器实现专辑倒影效果_Android

今天要实现的功能是实现专辑倒影效果,这个功能已经属于图像处理方面的了,对图像处理我不怎么在行,等一下会介绍一个很实用的工具类,专门用来进行图像处理的.这个工具类不是我写的,我只是拿来用到自己的项目当中,这已经足够了,我已经完美实现我想要的效果. 效果图: < 一个很有用的工具类 /SimpleBeautyMusicPlayer/src/com/wwj/sb/utils/ImageUtil.java package com.wwj.sb.utils; import java.io.ByteArra

RTMP、RTSP、HTTP视频协议详解(附:直播流地址、播放软件)

一.RTMP.RTSP.HTTP协议 这三个协议都属于互联网 TCP/IP 五层体系结构中应用层的协议.理论上这三种都可以用来做视频直播或点播.但通常来说,直播一般用 RTMP.RTSP.而点播用 HTTP.下面分别介绍下三者的特点.   1,RTMP协议 (1)是流媒体协议. (2)RTMP协议是 Adobe 的私有协议,未完全公开. (3)RTMP协议一般传输的是 flv,f4v 格式流. (4)RTMP一般在 TCP 1个通道上传输命令和数据.   2,RTSP协议 (1)是流媒体协议.

Swift使用ijkplayer框架播放直播视频(RTMP/HTTP视频流播放)

BiliBili(简称B站),想必大家都不陌生.Ijkplayer 框架是B站提供了一个开源的流媒体解决方案,集成了 ffmpeg,还支持硬解码(需 iOS8 以上版本).使用 Ijkplayer 框架我们可以很方便地实现视频直播功能(Http/RTMP/RTSP 这几种直播源都支持). 本文主要介绍如何使用 Ijkplayer 框架播放在线直播视频(当然其本地播放能力也很强大).对于几种直播流不太清楚地,可以参考我前面写的这篇文章:RTMP.RTSP.HTTP视频协议详解(附:直播流地址.播放

Flash广告播放器开发

广告 很多网站都使用了swf格式的flash广告,如何让这些广告更有序的出现,网站建设者们都使用了flash广告播放器,其表现形式也非常丰富,但里面所含的技术大同小异.Flash广告播放器播放的广告经常需要更换,因此,使用外部文件导入到广告播放器是一种可行的方法.这些外部文件包括swf.jpg等格式的广告文件.组织数据的xml文件和用来格式化文本的css文件等,这样,更换广告,改变文本的格式就变得非常方便.: 准备播放器的素材 创建目录,用于保存相关文件,以播放jpg格式的图片为例,首先准备几张

Flash游戏开发系列一:游戏中的敌人(7)

第六篇:Flash游戏开发系列一:游戏中的敌人. 五.跟踪导弹(续完) 上次我们已经知道怎样让导弹的旋转看起来像那么回事,紧接着就是让导弹运动起来了. 导弹的一些属性,我们需要好好定义一下,这是完整的初始化函数: init = function () {enemy._x = 40;enemy._y = 350;enemy._rotation = 0;enemy_obj.MAXAngle = 6;enemy_obj.MAXSpeed = 4;enemy_obj.speedX = enemy_obj

Flash游戏开发系列一:游戏中的敌人(6)

第五篇:Flash游戏开发系列一:游戏中的敌人. 五.跟踪导弹(续) 前面讲过了如何让导弹朝向玩家,但是真正在应用的时候,不可能这么生硬的体现.大家可能也发现了,导弹的方向一直指向玩家,其实很不真实,那么如何才能更加真实一些呢.常用的方法有几种,我们这里介绍其中一种,其它的大家可能要去参考游戏开发图书了. 在这里,我们使用的方法是,导弹有一个最大转向角度,也就是说,如果转向达到这个角度,就不能再转了,这样,看起来就会真实一些,导弹也就不回一下子面对玩家,看看下面这个例子,我把导弹的最大转向角度设

Flash游戏开发系列一:游戏中的敌人(5)

第四篇:Flash游戏开发系列一:游戏中的敌人. 五.跟踪导弹 看看这个例子,在动画屏幕上按下鼠标,导弹就会跟踪玩家,直到击中玩家: 对于新手来说,一下子就实现它可能不太容易,我们来一点一点的做. (1)导弹的方向 我们先来实现导弹朝向玩家的功能,就像下面这个:(按下鼠标观看) 首先,我们注意到,敌人的导弹是要朝向玩家的,这和前面不同.前面的敌人是一个圆头圆脑的家伙,不用分辨它的方向.我们就先来看一下如何让敌人有方向感. 首先给新手讲解一下基本知识:用鼠标来触发动画. 我们先设定一个变量,布尔类