flv.js 1.0 源码学习(一)

一.入口

flv.js-flvjs 对象入口

flvjs对象

它做了以下几件事:

  1. 激活了 polyfill
  2. 组合播放器实例以及相关方法:FlvPlayer 和 NativePlayer,createPlayer、isSupported、getFeatureList。这里个人建议使用 Object.assign 完成组合
    2.1 createPlayer 接收两个参数:媒体资源 mediaDataSource 和配置 optionalConfig,根据媒体类型( type 属性)创建一个播放器
    2.2 isSupported 实际上是 Features.supportMSEH264Playback()
    2.3 getFeatureList 实际上是 Features.getFeatureList()
  3. 关联相关事件和错误、调试工具
  4. 挂载到window对象导出

polyfill.js-Polyfill类-es6的polyfill

  1. 引入了 Object.setPrototypeOf、Object.assign、promise 的 polyfill,包装在 install 函数里
  2. 这一块完全可以交给 polyfill 库或者从 MDN 引,不是 flv.js 的重点

features.js-Features 类-MSE 特征检测

重点文件,可以知道浏览器目前支持 MSE 的哪些功能


Features 类

全是静态方法:

  1. supportMSEH264Playback 判断全局上是否有 MediaSource 这个对象,并且需要支持 video/mp4; codecs="avc1.42E01E,mp4a.40.2"这种类型。
    1.1 从此我们可以看出,最后 flv.js 是将 flv 格式转换成 "avc1.42E01E,mp4a.40.2" 格式了。
    1.2 MDN 的 MediaSource 示例也给我们展示了如何通过 MediaSource 的方法和事件加载一个 mp4 文件。
  2. supportNetworkStreamIO 通过创建一个 IOController 来判断加载器是否支持流。 (只能是 fetch-stream-loader 类型或 xhr-moz-chunked-loader 类型)
  • 疑问:为什么只判断这两种?谜底我们去第二节揭晓。
  1. getNetworkLoaderTypeName 实现和上个方法异曲同工,只不过返回的是加载器类型。
  2. supportNativeMediaPlayback 通过创建一个 video 元素,利用它的 canPlayType 方法判断是否支持某种 mime 的数据
  3. getFeatureList 获取支持的特性列表,分别是:
    5.1 mseFlvPlayback MSE是否支持
    5.2 networkStreamIO 数据流是否支持
    5.3 networkLoaderName 数据加载器名称
    5.4 mseLiveFlvPlayback MSE 流视频是否支持
    5.5 nativeMP4H264Playback 原生 MP4 格式是否支持
    5.6 nativeWebmVP8Playback 原生 Webm VP8 格式是否支持
    5.7 nativeWebmVP9Playback 原生 Webm VP9 格式是否支持
    getFeatureList

logging-control.js-LoggingControl类-调试控制器

这里涉及到繁琐的参数设置,并且使用 get 和 set 控制了读写过程,不具体介绍每个方法,主要是介绍用途和事件的使用。


LoggingControl类
  1. 组合了 EventEmitter,采用发布-订阅模式管理调试,getConfig 方法可以获得所有调试选项,applyConfig 方法可以接受一个 config 对象来配置调试选项。
  2. forceGlobalTag 是否开启强制全局标签和 globalTag 全局标签在 set 中使用了 _notifyChange 方法发布变化。
  3. enableAll/enableDebug/enableVerbose/enableInfo/enableWarn/enableError 这六个方法是是否允许特定模式的 console,刚好对应原生的调试 API,同上会在 set 中发布了变化
  4. _notifyChange 关键是利用 emitter 触发一个 change 事件,参数是所有调试配置。
    4.1 这里利用 listenerCount 方法让多个事件只触发一次。
  5. registerListener(listener) 和 removeListener(listener) 是让 emitter 注册或移除事件监听。
    5.1 代码初始化的时候 new 了一个 EventEmitter 注入到 LoggingControl 中。

exception.js

这个文件里有四个类,用来描述代码运行中的三类错误,其中 RuntimeException 是基类。


exception
  1. RuntimeException类-运行时错误,基类,拥有 _message 私有属性和 message、name 两个只读属性,以及一个 toString 方法用来描述完整的错误信息。
  2. IllegalStateException类-无效状态,name 只读属性重写为 'IllegalStateException'
  3. InvalidArgumentException类-无效参数,name 只读属性重写为 'InvalidArgumentException'
  4. NotImplementedException-未实现功能,name 只读属性重写为 'NotImplementedException'

核心就是 this.name + ': ' + this.message 这句代码。

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 204,921评论 6 478
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 87,635评论 2 381
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 151,393评论 0 338
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 54,836评论 1 277
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 63,833评论 5 368
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 48,685评论 1 281
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 38,043评论 3 399
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 36,694评论 0 258
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 42,671评论 1 300
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 35,670评论 2 321
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 37,779评论 1 332
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 33,424评论 4 321
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 39,027评论 3 307
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 29,984评论 0 19
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 31,214评论 1 260
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 45,108评论 2 351
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 42,517评论 2 343

推荐阅读更多精彩内容