Skip to content

hanzeil/Media-Slice-And-Play

Repository files navigation

#Media Slice And Play ##概述 对于一个逻辑上完整的可以播放的视频,在服务器上实际存放的却是一堆视频切片,而且切片的URI不一定相同,甚至存放在不同的服务器上。在服务器上用一个Json文件描述逻辑文件的信息,包括文件的类型、大小、文件名,每个切片的URI、大小、偏移量等信息。如下图所示。 Introduction ###本项目具有两个模块

  • 用JS将客户端的视频文件切片,并上传切片和Json描述文件到服务器的uploads/目录。
  • 在浏览器加载服务器的Json描述文件,将视频播放,目前支持MP4和WEBM两个格式的视频文件。

##切片 切片功能的实现主要由sliceFile.js完成,用FILE API切片,用XMLHttpRequest发送切片。 注意,用File对象操作文件的时候,并不会真正读整个文件,在XMLHttpRequest加载文件发送到服务端时,才会读。因此不用担心浏览器内存的问题。

  • 打开文件

    <input type="file" id="file" name="file" />
    <script>var file = document.getElementById('file').files[0];</script>
  • 切片

    var chunk = file.slice(startByte, startByte + chunkSize);
  • 异步上传切片,服务端使用HTTP POST方式接收切片并保存到服务器。

    var xhrSend = new XMLHttpRequest();
    xhrSend.open('POST', url, true);
    var formdata = new FormData();
    formdata.append("file", chunk);
    xhrSend.send(formdata);
    xhrSend.onload = function() {}
  • 最后上传Json描述文件,描述文件的key如下

    {
    	"fileName": "chrome.webm",
    	"fileType": "webm",
    	"fileLength": 5140356,
    	"chunkJsons": [{
    		"chunkName": "uploads/chrome/chrome0.webm",
    		"chunkOffset": 0,
    		"chunkSize": 3170304
    	}, {
    		"chunkName": "uploads/chrome/chrome1.webm",
    		"chunkOffset": 3170304,
    		"chunkSize": 1970052
    	}]
    }

##播放MP4 用HTML5播放媒体,需要用到的技术:

  • Media Source Extension API
    Media Source Extension API允许JavaScript向<video><audio>标签动态构造媒体流,它定义对象允许JavaScript加载媒体分片转化为HTMLMediaElement.同时,通过一种缓冲模型也可以实现用浏览器播放无序被添加的媒体分片。在MSE-REGISTRY中定义了媒体流的格式规范。 pieline_model

  • MP4Box.js
    MP4Box是一个JavaScript库,可以处理MP4文件,是GPAC项目中的MP4Box的JS版本,它可以用来

    • 获取MP4文件的信息
    • 构造Media Segment,用于Media Source Extension API
    • 提取MP4文件中的样本,创建TextTracks
    • More and More

###概念

  • MediaSource
    MediaSource对象表示HTMLMediaElement的媒体数据源。它具有一个SourceBuffer对象列表,可以用来添加媒体数据用来播放。MediaSource对象被web应用所创建,然后连接到一个HTMLMediaElement上。引用通过SourceBuffer列表中的SourceBuffer对象添加媒体数据到源中。当需播放这些媒体数据时,HTMLMediaElement从MediaSource对象中获取这些媒体数据。

  • Initialization Segment(初始化分片)
    包含所有初始化信息的一个字节序列,可以解码剩下所有的媒体分片。它包含初始化解码信息,多轨道分片的轨道ID,和相应的时间偏移量。

  • Media Segment(媒体分片)
    一段封装的、具有时间戳的一部分媒体数据,媒体分片跟最先添加的初始化分片相关联。

  • Random Access Point(随机访问点)
    指任意媒体分片的任意一个位置,当指定该位置后,媒体可以从该位置继续解码和播放,不需要依赖之前分段的任何数据。对于视频,指第i帧的位置。对于音频,大多音频帧可以被当做随机访问点。因为视频轨道倾向于具有稀疏分布的随机接入点。这些点的位置通常被认为多轨道媒体流的随机访问点。

  • SourceBuffer configuration(SourceBuffer配置)
    创建MediaSource的实例SourceBuffer对象。而一组特定的轨道分布在一个或者多个SourceBuffer对象中。 实现必须具有至少一个MediaSource对象,并需要以下配置。

    • 一个SourceBuffer对象加载一个音频或视频轨道;
    • 两个SourceBuffer,一个加载一个音频轨道,另一个SourceBuffer加载一个视频轨道。
  • Track Description(轨道描述)
    一个字节流格式的特定的结构,包含轨道ID,编解码器的配置,和每个轨道的元配置。每个轨道的描述包括一个初始化分片,和唯一的轨道ID。如果在初始化分片时,轨道ID不唯一,用户代理必须运行append error algorithm并将decode error属性设置为true。

  • Track ID(轨道ID)
    轨道ID是一个轨道的标示符。轨道ID在轨道描述里识别媒体分片属于哪个轨道。

###UML ####类图 ClassDiagram ####顺序图 SequenceDiagram

About

No description, website, or topics provided.

Resources

Stars

Watchers

Forks

Releases

No releases published

Packages

 
 
 

Contributors