zoukankan      html  css  js  c++  java
  • 视频流协议HLS与RTMP 直播原理 点播原理

    小结:

    1、HLS原理

    视频--->图像、声音分别编码打包切割容器文件ts,建立纯文本索引文件.m3u8
    --->播放器http下载容器文件、索引文件,播放,下载

    基于HLS可以实现直播和点播

    直播有延迟

    事先生成容器文件和索引文件,即可点播

    HTML5实现视频直播功能思路详解_html5教程技巧_脚本之家 https://m.jb51.net/html5/587215.html

    发布时间:2017-11-16 17:16:11 作者:脚本之家

    发现目前 WEB 上主流的视频直播方案有 HLS 和 RTMP,移动 WEB 端目前以 HLS 为主(HLS存在延迟性问题,也可以借助 video.js 采用RTMP),PC端则以 RTMP 为主实时性较好,接下来将围绕这两种视频流协议来展开H5直播主题分享。

    一、视频流协议HLS与RTMP

    1. HTTP Live Streaming

    HTTP Live Streaming(简称 HLS)是一个基于 HTTP 的视频流协议,由 Apple 公司实现,Mac OS 上的 QuickTime、Safari 以及 iOS 上的 Safari 都能很好的支持 HLS,高版本 Android 也增加了对 HLS 的支持。一些常见的客户端如:MPlayerX、VLC 也都支持 HLS 协议。 

    HLS 协议基于 HTTP,而一个提供 HLS 的服务器需要做两件事:

    编码:以 H.263 格式对图像进行编码,以 MP3 或者 HE-AAC 对声音进行编码,最终打包到 MPEG-2 TS(Transport Stream)容器之中;分割:把编码好的 TS 文件等长切分成后缀为 ts 的小文件,并生成一个 .m3u8 的纯文本索引文件;浏览器使用的是 m3u8 文件。m3u8 跟音频列表格式 m3u 很像,可以简单的认为 m3u8 就是包含多个 ts 文件的播放列表。播放器按顺序逐个播放,全部放完再请求一下 m3u8 文件,获得包含最新 ts 文件的播放列表继续播,周而复始。整个直播过程就是依靠一个不断更新的 m3u8 和一堆小的 ts 文件组成,m3u8 必须动态更新,ts 可以走 CDN。一个典型的 m3u8 文件格式如下:

    #EXTM3U
    #EXT-X-STREAM-INF:PROGRAM-ID=1, BANDWIDTH=200000
    gear1/prog_index.m3u8
    #EXT-X-STREAM-INF:PROGRAM-ID=1, BANDWIDTH=311111
    gear2/prog_index.m3u8
    #EXT-X-STREAM-INF:PROGRAM-ID=1, BANDWIDTH=484444
    gear3/prog_index.m3u8
    #EXT-X-STREAM-INF:PROGRAM-ID=1, BANDWIDTH=737777
    gear4/prog_index.m3u8

    可以看到 HLS 协议本质还是一个个的 HTTP 请求 / 响应,所以适应性很好,不会受到防火墙影响。但它也有一个致命的弱点:延迟现象非常明显。如果每个 ts 按照 5 秒来切分,一个 m3u8 放 6 个 ts 索引,那么至少就会带来 30 秒的延迟。如果减少每个 ts 的长度,减少 m3u8 中的索引数,延时确实会减少,但会带来更频繁的缓冲,对服务端的请求压力也会成倍增加。所以只能根据实际情况找到一个折中的点。

    对于支持 HLS 的浏览器来说,直接这样写就能播放了:  

    <video src=”./bipbopall.m3u8″ height=”300″ width=”400″  preload=”auto” autoplay=”autoplay” loop=”loop” webkit-playsinline=”true”></video>

    注意:HLS 在 PC 端仅支持safari浏览器,类似chrome浏览器使用HTML5 video  

    标签无法播放 m3u8 格式,可直接采用网上一些比较成熟的方案,如:sewise-player、MediaElement、videojs-contrib-hls、jwplayer。

    2. Real Time Messaging Protocol

    Real Time Messaging Protocol(简称 RTMP)是 Macromedia 开发的一套视频直播协议,现在属于 Adobe。这套方案需要搭建专门的 RTMP 流媒体服务如 Adobe Media Server,并且在浏览器中只能使用 Flash 实现播放器。它的实时性非常好,延迟很小,但无法支持移动端 WEB 播放是它的硬伤。

    虽然无法在iOS的H5页面播放,但是对于iOS原生应用是可以自己写解码去解析的, RTMP 延迟低、实时性较好。浏览器端,HTML5 video

    标签无法播放 RTMP 协议的视频,可以通过 video.js 来实现。

    <link href=“http://vjs.zencdn.net/5.8.8/video-js.css” rel=“stylesheet”>
    <video id=“example_video_1″ class=“video-js vjs-default-skin” controls preload=“auto” width=“640” height=“264” loop=“loop” webkit-playsinline>
    <source src=“rtmp://10.14.221.17:1935/rtmplive/home” type=‘rtmp/flv’>
    </video>
    <script src=“http://vjs.zencdn.net/5.8.8/video.js”></script>
    <script>
    videojs.options.flash.swf = ‘video.swf’;
    videojs(‘example_video_1′).ready(function() {
    this.play();
    });
    </script>
     3. 视频流协议HLS与RTMP对比
     

    二、直播形式

     

    目前直播展示形式,通常以YY直播、映客直播这种页面居多,可以看到其结构可以分成三层:  

    ① 背景视频层  

    ② 关注、评论模块  

    ③ 点赞动画

    而现行H5类似直播页面,实现技术难点不大,其可以通过实现方式分为:  

    ① 底部视频背景使用video视频标签实现播放  

    ② 关注、评论模块利用 WebScoket 来实时发送和接收新的消息通过DOM 和 CSS3 实现  

    ③ 点赞利用 CSS3 动画

    了解完直播形式之后,接下来整体了解直播流程。

    HLS 视频点播初探 - 云+社区 - 腾讯云 https://cloud.tencent.com/developer/article/1020521

    视频精简下减少时长?创意不同意,要不把视频压缩下,挖槽那么模糊,创意不同意,好吧,还有其他的优化方案吗?

    HTTP Live Streaming(HLS)是苹果公司实现的基于HTTP的流媒体传输协议,可实现流媒体的直播和点播。原理上是将视频流分片成一系列HTTP下载文件。特点是将流媒体切分为若干 TS 片段(比如每10秒一段),然后通过一个扩展的 m3u 列表文件将这些 TS 片段集中起来供客户端播放器接收。

    Native支持

    Android 3.0+

    iOS 3.0+

    怎么把mp4文件切分成若干TS片段?

    我这里使用了ffmpeg,去官网下载你需要的系统版本,解压到本地(E:ffmpeg),配置环境变量(E:ffmpegin),dos窗口输入ffmpeg -version 如有信息则说明成功,可以进行接下来切分mp4了。

    1、首页需要切分的视频必须是视频编码为H.264,音频编码aac格式的mp4,可通过 ffprobe dnf.mp4命令来查看文件编码

    2、如果不是mp4格式,可用如下命令转

    ffmpeg -i demo.mkv -acodec copy -vcodec copy demo.mp4

    3、将mp4切分为ts切片

    ffmpeg -i dnf.mp4 -codec:v libx264 -codec:a mp3 -map 0 -f ssegment -segment_format mpegts -segment_list video/index.m3u8 -segment_time 10 video/%03d.ts

    -segment_time每隔十秒切一个文件

    切片完成后入下所示:

    前端页面可以用video标签引入扩展m3u8文件将这些TS片段集中来供客户端播放了。

    <video  src="video/index.m3u8"></video>

  • 相关阅读:
    app-授权登录插件配置
    微信公众号-公众号设置-功能设置
    Java变量
    Java数据类型
    计算机存储单元
    Java常量
    k8s
    第一个Java程序
    旋转木马
    tools
  • 原文地址:https://www.cnblogs.com/rsapaper/p/9807816.html
Copyright © 2011-2022 走看看