Coder Social home page Coder Social logo

rust-hls's Introduction

Rust HTTP Live Stream Library

Date:07/06 2016

介绍

HTTP Live Stream Library (HLS) 是 Apple 开发的基于 HTTP 的串流规范,目前正在申请成为 IETF 组织的标准规范(当前为草案阶段)。

该协议优点:

  1. 完全基于 HTTP 协议,意味着可以直接穿越防火墙,浏览器可以直接使用。
  2. 视频分片机制有利于大规模的内容分发(这点,其它协议很难做到,比如 RTMP/RTSP )
  3. Apple 移动端 只支持该方案(没有 Flash , 没有 WebRTC ), 所以如果你想让 Apple 移动端的用户能用上你们的流服务,那么选择 HLS 吧 :))

该协议缺点:

  1. 延时高(纯粹就协议设计来讲,如果你架构够好,你完全可以使用 HLS 打造出延时低于 RTMP 的服务出来, 比如 YouTuBe )
  2. 单向流

哪些服务在使用该规范?:

  • Youtube , 直播和点播场景均首选 HLS 方案
  • TwitchTV , 之前使用的是 RTMP 方案,目前已经过渡到了 HLS 技术方案。

哪些云服务支持该规范?:

原理简介

直播模式

Server:

  1. 初始化视频片索引文件(比如 live.m3u8 )。
  2. 从视频源收集 视频帧 (AVFrame), 然后对 视频帧 进行编码(比如 H264 )。
  3. 收集固定时长(一般是5秒)的已编码的 视频帧 数据, 合并成一片 MPEG-TS 数据。
  4. 将合并完成的 MPEG-TS 片数据存储至 静态文件服务器(或者CDN)。
  5. 将已存储的 MPEG-TS 片数据公网访问路径(比如: http://live.com/object/d1162b6b627b8726f91e3d59feaf5db188e95219.ts ) 更新进 M3U8 索引文件。

Client:

  1. 下载视频流索引文件 M3U8,获得 MPEG-TS 数据片。
  2. 按照索引顺序下载 MPEG-TS 数据片,解码并播放(非 Apple 浏览器,可能需要 JavaScript 来做软解码)。
  3. 索引播放完毕,重新下载 M3U8 看是否更新了索引文件,如果更新,则继续重复上述步骤直至索引文件标示 结束 。

点播模式

这个模式没什么好讲的,对视频文件进行解码操作,得到 视频帧,然后后续操作跟 直播 流程一样, 只是对 索引文件 的处理方式不太一样。

已支持标签(TAG)

  • #EXTM3U
  • #EXT-X-VERSION
  • #EXT-X-TARGETDURATION
  • #EXT-X-MEDIA-SEQUENCE
  • #EXTINF
  • #EXT-X-BYTERANGE
  • #EXT-X-PLAYLIST-TYPE
  • #EXT-X-STREAM-INF
  • #EXT-X-ENDLIST

其它不常用的标签(TAG)暂未支持,在可预见的将来也不会考虑。

用例

解析M3U8 Playlist:

extern crate hls;

use std::str::FromStr;
use hls::Playlist;

static Master_Playlist: &'static str = r#"#EXTM3U
#EXT-X-VERSION:3
#EXT-X-TARGETDURATION:12
#EXT-X-MEDIA-SEQUENCE:1
#EXTINF:12.1,Title 1
media-b2000000_1.ts?wowzasessionid=2029972411
#EXTINF:12.1,Title 2
media-b2000000_2.ts?wowzasessionid=2029972411
#EXTINF:12.1,
media-b2000000_3.ts?wowzasessionid=2029972411
#EXTINF:12.1,
media-b2000000_4.ts?wowzasessionid=2029972411
#EXTINF:12.1,
media-b2000000_5.ts?wowzasessionid=2029972411
#EXTINF:12.1,
media-b2000000_6.ts?wowzasessionid=2029972411
#EXTINF:12.1,
media-b2000000_7.ts?wowzasessionid=2029972411
#EXT-X-ENDLIST"#;

fn main() {
    println!("Master Playlist:\n{}\n\n", Master_Playlist);
    let res = Playlist::from_str(Master_Playlist);
    assert_eq!(res.is_ok(), true);

    let playlist = res.unwrap();
    assert_eq!(Master_Playlist, playlist.to_string());
}

创建M3U8 Playlist:

TODO.

参考

JavaScript HTTP Live Stream Player:

rust-hls's People

Contributors

luozijun avatar

Stargazers

 avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar

Watchers

 avatar  avatar  avatar  avatar  avatar

Recommend Projects

  • React photo React

    A declarative, efficient, and flexible JavaScript library for building user interfaces.

  • Vue.js photo Vue.js

    🖖 Vue.js is a progressive, incrementally-adoptable JavaScript framework for building UI on the web.

  • Typescript photo Typescript

    TypeScript is a superset of JavaScript that compiles to clean JavaScript output.

  • TensorFlow photo TensorFlow

    An Open Source Machine Learning Framework for Everyone

  • Django photo Django

    The Web framework for perfectionists with deadlines.

  • D3 photo D3

    Bring data to life with SVG, Canvas and HTML. 📊📈🎉

Recommend Topics

  • javascript

    JavaScript (JS) is a lightweight interpreted programming language with first-class functions.

  • web

    Some thing interesting about web. New door for the world.

  • server

    A server is a program made to process requests and deliver data to clients.

  • Machine learning

    Machine learning is a way of modeling and interpreting data that allows a piece of software to respond intelligently.

  • Game

    Some thing interesting about game, make everyone happy.

Recommend Org

  • Facebook photo Facebook

    We are working to build community through open source technology. NB: members must have two-factor auth.

  • Microsoft photo Microsoft

    Open source projects and samples from Microsoft.

  • Google photo Google

    Google ❤️ Open Source for everyone.

  • D3 photo D3

    Data-Driven Documents codes.