zoukankan      html  css  js  c++  java
  • 抛开flash,自己开发实现C++ RTMP直播流播放器

    抛开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协议的直播。

         

    +++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++

      haibindev.cnblogs.com,合作请联系QQ。(转载请注明作者和出处)

    +++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++

  • 相关阅读:
    编译 netcat for lineage-17.1-20210303-UNOFFICIAL-dipper.zip (ARM)
    Mi8-Android-arm 中网络接口命名:wlan0 & rmnet_data 《========》 VB-Android-x86 中网络接口命名:eth1 & wifi_eth
    HOW TO CHANGE LINUX KERNEL DMESG BUFFER SIZE
    Calculation of RTO in tcp and related open source implementation (Linux kernel, unbound) --- rtt, rttvar, cwnd, ssthresh
    图解Linux网络包接收过程
    Tcpprobe 在网络中的使用 --- tcp_probe has been removed from the kernel. --- Using ip-tcp_metrics --- Using ss (socket statistics)
    全面的 iPerf3 Android平台移植编译、运行过程记录
    socket、sock、sk_buff、net_device 关系图
    tcp: Add TCP_FREEZE socket option
    ECNU 2031 绝对值排序
  • 原文地址:https://www.cnblogs.com/haibindev/p/3466094.html
Copyright © 2011-2022 走看看