Dash.js 是用 JavaScript 编写的开源 MPEG-DASH 视频播放器。其目标是提供可以在需要视频播放的应用程序中自由重用的功能强大的跨平台播放器。
JavaScript 是目前所有主流浏览器上唯一支持的脚本语言,其主要作用是在不与服务器交互的情况下修改HTML页面内容。
MPEG-DASH 是视频内容自适应流式处理的 ISO 标准。使用 MPEG-DASH,当网络阻塞时,视频流会自动调整到较低清晰度;当网络拥塞减少时,视频播放器将转而恢复到较高质量的流。
DASH 使用客户端的 js 库,利用由万维网联盟(W3C)定义的媒体源扩展(MSE)接口集。
Node.js 是一个服务器程序,运行于服务器端。
npm 是一个 node 包管理器,包括安装、卸载、更新、查看、发布等。
Grunt 基于 Node.js,用 js 开发,是一个自动化任务处理工具,是一个工具框架,有很多插件。
.editorconfig 文件:该文件的内容定义该项目的编码规范。可以让使用不同编辑器的开发者在共同开发一个项目时遵循一致的编码规范(编码风格)
.gitignore 文件:使用 Git 进行版本控制的时候,有些文件是无需纳入 Git 管理的,通常都是些自动生成的文件,像日志或者编译过程中创建的文件。我们可以创建一个名为 .gitignore 的文件,列出要忽略的文件来解决这个问题。
.jscsrc 文件:JSCS 是一个 JavaScript 的代码风格检查工具,配置文件来改变或禁用任何预设规则,可以在团队协作中大大提升代码的正确性、准确性、完整性、简洁性、统一性及易读性。
.jshintrc 文件:JSHint 是一个Javascript代码检查工具,使用它可以找出代码里的一些错误和潜在的问题。
.npmignore 文件:使用.npmignore 文件让一些文件不在包里。如果没有.npmignore ,但是有.gitignore 文件,那就会根据.gitignore 匹配不要的文件。如果还有.gitignore 不满足,就得需要.npmignore 来覆盖了。就像git,npm会在所有的子目录里寻找.gitignore 和.npmignore 文件,而不只是根目录。
Gruntfile.js 文件:是 Grunt 的配置文件, 可以自动实现:检查每个 JS 文件语法、合并两个 JS 文件、将合并后的 JS 文件压缩、将 SCSS 文件编译、新建一个本地服务器监听文件变动自动刷新 HTML 文件等功能。
index_mediaplayerOnly.js 文件:
index.d.ts 文件:用 ts (typescript)写的模块在发布的时候仍然是用 js 发布,这就导致一个问题:ts 那么多类型数据都没了,所以需要一个 d.ts 文件来标记某个 js 库里面对象的类型。
inde.js 文件:index.js是模块的入口,也就是这个工程的主模块。
package-lock.json 文件:锁定安装时的包的版本号,并且需要上传到git,以保证其他人在npm install时大家的依赖能保证一致。
package.json 文件:每个项目的根目录下面,一般都有一个 package.json 文件,定义了这个项目所需要的各种模块,以及项目的配置信息(比如名称、版本、许可证等元数据)。npm install 命令根据这个配置文件,自动下载所需的模块,也就是配置项目所需的运行和开发环境。
项目结构在 src/ 文件夹中
/streaming 文件夹:MPEG-DASH 规范的跨硬件代码。代码里面不会出现 Period 或者 AdaptationSet类似的术语。这样,其他流传输技术如 MicroSoft Smooth Streaming 或 HLS 可以在 /streaming 文件夹中的代码中扩展并应用。总调度逻辑,ABR 规则和系统逻辑都在这个文件夹。
/dash 文件夹:DASH 规范的特定代码。DASH 的所有核心逻辑都在这一层,包括 segment template, index 和 timeline logic。DASH 的 秘钥清单(manifest)解析也在这一层。
/mss 文件夹:MicroSoft Smooth Streaming 相关的特定代码。
这个类调用 player.create() 来初始化所有对象。这个类是一个重要的工厂,对所有对象的创建过程负责。
FactoryMaker 的逻辑在项目每个文件的底部,请熟知这些代码。你需要利用这个方法来添加一个单件模块或者类。
这是一个 MediaPlayerModel.js 被创建为一个单件模块的例子:
let factory = FactoryMaker.getSingletonFactory(MediaPlayerModel);
export default factory;
这是一个 MediaPlayerModel.js 被创建为一个类的例子:
let factory = FactoryMaker.getClassFactory(MediaPlayer);
export default factory;
这是如何将一个常量类或其他对象放置于其余代码库的例子:
// Take note of how we expose the public event class from mediaplayer.
// More info in EVENTS section.
factory.events = MediaPlayerEvents;
factory.DEFAULT_UTC_TIMING_SOURCE = DEFAULT_UTC_TIMING_SOURCE;
最后,所有对象都需要参考名称,以便在创建后查找对象来扩展或重写。
MediaPlayer.__dashjs_factory_name = 'MediaPlayer';
项目的主要入口点,对初始化负责。
主要的接口(API)层,像与流库交互的外层。
所有公用接口(API)在实例对象中列出。
使用 MediaPlayerModel.js 通过接口(API)来为配置集保持状态。
通过 MediaPlayer.events.
EventBus.js -
Event Aggregation system
public_
Events.js vs
CoreEvents vs MediaPlayerEvents vs ProtectionEvents.
There is a Stream instance for every period in the MPD. Created by the StreamController.
StreamController will handle the transition to the next stream if there are multiple periods.
StreamController flush metrics for the stream upon ending.
StreamController will open and close new media sources for each period.
未完待续……