zoukankan      html  css  js  c++  java
  • 【项目一 · 直播】 ☞ 2. 拉流直播

    一、视频技术

    1. 简介

      视频是一种有结构的数据。直播的时候传的是数据,是视频的一个小单元。

      视频 = 图像 + 音频

    • 视频里边的原始图像数据 通常会采用“H.264编码格式” 进行压缩。

    • 音频采样数据 通常会采用“AAC编码格式” 进行压缩。

     

    2. 视频的实时传输

    • 视频是一种“有结构的数据”,视频直播就是实时传输这种“有结构的数据”。

    • 实时发生的事(直播)肯定是有延迟的。我们要提高直播的质量就需要减小延迟。

     

    3. 视频编码压缩

    • 视频内容的体积一般比较大,为了便于视频内容的存储和传输,通常需要将原始的内容元素(图像和音频)进行压缩。(压缩算法就是编码/压缩格式)

    • 在直播的时候传输的视频数据通常都要压缩(编码),传输数据的量是越少越好,播放的时候需要解压(解码/还原)。

     

    4. 视频解码压缩

    • 视频内容经过编码压缩后,有利于存储和传输。当要观看播放视频时,相应的需要解码。

    • 编码和解码之前,需要约定一种编码器和解码器都可以理解的约定。

    • 例如,视频图像编码和解码过程:

    编码器将多张图像进行编码后生成一段一段的GOP(Group of Pictures),传输的是GOP(Group of Pictures),解码器在播放时则是读取一段一段的GOP进行解码后读取画面再渲染显示。

    GOP:表示一组图片(即一组连续的画面),是视频图像编码器和解码器存取的基本单位,由一张I帧和数张B/P帧组成(I帧又叫关键帧,B/P帧又叫参考帧过渡帧),它的排列顺序将会一直重复到影像结束。

     

    5. 视频怎么传输?

    • 编码器将视频的多张图像进行编码后生成一段一段的GOP进行传输,传输的是GOP。

    • 将视频分成分子(GOP),再将分子分成原子(I帧、B帧、P帧)。

    想想一下,如果我们把传输一个“物体”,改成传输一个一个的“原子”,将最小颗粒以光速传送,那么以人的生物肉眼来感知,将是一种怎样的体验?

    ——— 这种体验就类似于直播。

    • 视频直播技术:就是将视频内容的最小颗粒(I / P / B帧, …),基于时间序列,以光速进行传送的一种技术。

     

    6. 用什么协议进行传输?

    • 直播就是将每一帧数据(Video/Audio/Data Frame),打上时序标签后进行流式传输的过程。发送端源源不断的采集音视频数据,经过编码、封包、推流(主播端),再经过中继分发网络进行扩散传播(就是把主播端的视频数据传到服务器,服务器再把数据传给粉丝),播放端再源源不断下载数据并按时序进行解码播放。如此就实现了“边生产、边传输、边消费”的直播过程。

     

    7. 直播的业务逻辑

    一对多模型:

      主播端 ——RTMP协议——》直播流媒体服务器 ——RTMP/HLS协议——》观众(粉丝)

    • RTMP协议:延时比较小,传输速度比较快。(主播录视频用这个协议,把视频数据即时传到服务器上)
    • HLS协议:把主播已经传好的视频流切片,切片之后再给粉丝传输。(根据时间点去播放,粉丝播放视频用这个协议,回看也用这个协议)

    协议差异:

    • RTMP(Real Time Messaging Protocol)协议:是一个TCP协议(长连接),每个时刻的数据,收到后立刻转发,延时 1~3秒。
    • HLS(HTTP Live Streaming)协议:是一个HTTP协议(短连接),集合一段时间数据,生成ts切片文件,更新m3u8,延时大于10秒。
    • RTMP-FLV(RTMP over HTTP)协议:是一个HTTP协议(长连接),同RTMP,使用HTTP协议,延时1~3秒。

     

    8. 延迟(Delay)

    • 物理延迟
      • 延迟指稳定网络下,发送和接收时差。
      • 转发环节越多,延迟越大。
      • 可计算。
        • 主播端(上海)——转发——》服务器1(北京)——转发——》 …... ——转发——》服务器n(香港)——转发——》粉丝端
        • 延迟跟服务器的转发数 / 主播与粉丝直接的距离有关。
    • 抖动(Jitter)延迟
      • 抖动,信号会不好。

     

    9. 直播过程

      一个完整的直播过程,主要包括:采集、处理、编码、封包、推流、传输、转码、分发、拉流、解码、播放。

      从推流到播放,再经过中间转发环节,延迟越低,则用户体验越好。

    10. 编码器

      编码器的编码方式分两种:软编和硬编。

      软编的意思是,资源消耗的是CPU,通过一些软件代码的模式去编码。(一般用软编)

      硬编的意思是,资源消耗的是GPU,GPU就相当于是显卡/显示的功能。(好手机不卡,坏手机很卡)

    二、直播/视频播放器

    1. ijkplayer 框架介绍

      视频端的播放用 ijkplayerijkplayer 是B站(bilibili)开源的第三方框架。ijkplayer 已经帮我们集成好了 FFmpeg。

    • FFmpeg 是音视频处理工具,既有音视频编码解码功能,又可以作为播放器使用。
    • 任何播放器都是基于FFmpeg的。苹果提供的AVPlayer,播放不了直播文件/播放不了直播格式(如,RTMP的播放不了,可以用 ijkplayer 去播放)。所以真正的要基于 FFmpeg 去播放,B站帮我们封装好了,所以我们使用 ijkplayer。
    • 斗鱼也用的这个,到公司如果不想花钱也可以用这个(ijkplayer)。 
    • ijkplayer 只能播放,不能推流。

      翻墙工具:多态

      VLC:视频播放器,编码格式多(支持的格式多,可以播直播格式的 rtmp://,一般可以用来测试直播地址)。

      测试地址:rtmp://live.hkstv.hk.lxdns.com/live/hks (提示:用Safari打开,会自动加入到VLC播放列表中去)

     

    2. ijkplayer 的使用

    • 第一步:配置好依赖环境:下载 FFmpeg,编译FFmpeg。(即如何把 ijkplayer自带的 IJKMediaDemo 运行起来)

      步骤:

        1) github网站上 搜 ijkplayer

        2) 来到README.md文档的 Build iOS 处,按步骤进行操作

        3) 克隆项目:git clone https://github.com/Bilibili/ijkplayer.git ijkplayer-ios

        4) 先进入ijkplayer-ios目录: cd ijkplayer-ios,执行: git checkout -B latest k0.7.7.1

        5) 再执行: ./init-ios.sh(意思是去下载 FFmpeg)

        (ijkplayer 是基于FFmpeg的,由于FFmpeg比较大,所以要单独去下载,下载比较慢)

        6) 下载完后,进入ios目录: cd ios,准备编译FFmpeg。

        7) 编译FFmpeg,需执行以下命令:

          ./compile-ffmpeg.sh clean

          ./compile-ffmpeg.sh all

        8) 编译成功后,我们就可以运行 IJKMediaDemo 了。

          

    • 第二步:将 IJKMediaPlayer(播放器)项目打包成 framework(方便集成到自己的项目中去)

          如何把视频播放器集成到自己的项目中去?

          把一个工程集成到另一个工程一般有两种方法:

            1)工程里集成工程。(这种方法比较麻烦、重量级,不推荐使用)

            2)把要集成的工程所有的源码打包成一个framework,我们只需要集成这个framework到其它项目即可。(推荐)

      生成framework的步骤:

        1)打开 IJKMediaPlayer 项目

            

        2)修改工程的编译模式为 Release (因为framework不需要调试,他的代码已经写好了的,不需要去修改,所以直接生成release版的framework)

        3)编译一个模拟器版本的framework

            

        4)再编译一个模拟器版本的framework

            

        5)最后将这两个framework合并成一个framework,这样就能保证这个framework既可以在模拟器上运行,又可以在真机上运行。

            

             

             

          

          合并文件命令: lipo -create "真机版本路径" "模拟器版本路径" -output "合并后文件的路径"

            

            

        6)替换文件:复制合并后的IJKMediaFramework文件到模拟器版/真机版framework中进行替换。

            

    3. 导入 ijkplayer 播放器的 framework 

      1)直接拖拽framework进行导入

        

      2)添加 ijkplayer 的一些依赖库

        ########################################################
          AudioToolbox.framework
          AVFoundation.framework
          CoreGraphics.framework
          CoreMedia.framework
          CoreVideo.framework
          libbz2.tbd
          libz.tbd
          MediaPlayer.framework
          MobileCoreServices.framework
          OpenGLES.framework
          QuartzCore.framework
          UIKit.framework
          VideoToolbox.framework
        ########################################################

        

        如果编译报以下错误:

          

         This is a linker error. You can resolve it by adding "-lc++" to Other Linker Flags in your Build Settings.

         解决办法:Build Settings —》Other Linker Flags —》 添加 -lc++

    4. 集成ijkplayer

      初始化播放器,设置相关属性。

    5. 创建直播播放界面和直播聊天界面

  • 相关阅读:
    linux shell
    jsp应用
    JavaScript基础整理(2)
    Struts2验证框架实例
    一个Struts2的实例
    Java继承和多态实例
    VS2010webConfig配置
    html兼容性
    Linux 入门记录:一、命令行 Bash 的基本操作
    微信支付:curl 出错,错误码: 60
  • 原文地址:https://www.cnblogs.com/bossren/p/6529473.html
Copyright © 2011-2022 走看看