Blame view

node_modules/videojs-contrib-media-sources/src/videojs-contrib-media-sources.js 4.04 KB
2a09d1a4   liuqimichale   添加宜春 天水 宣化
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
  /**
   * @file videojs-contrib-media-sources.js
   */
  import window from 'global/window';
  import FlashMediaSource from './flash-media-source';
  import HtmlMediaSource from './html-media-source';
  import videojs from 'video.js';
  let urlCount = 0;
  
  // ------------
  // Media Source
  // ------------
  
  const defaults = {
    // how to determine the MediaSource implementation to use. There
    // are three available modes:
    // - auto: use native MediaSources where available and Flash
    //   everywhere else
    // - html5: always use native MediaSources
    // - flash: always use the Flash MediaSource polyfill
    mode: 'auto'
  };
  
  // store references to the media sources so they can be connected
  // to a video element (a swf object)
  // TODO: can we store this somewhere local to this module?
  videojs.mediaSources = {};
  
  /**
   * Provide a method for a swf object to notify JS that a
   * media source is now open.
   *
   * @param {String} msObjectURL string referencing the MSE Object URL
   * @param {String} swfId the swf id
   */
  const open = function(msObjectURL, swfId) {
    let mediaSource = videojs.mediaSources[msObjectURL];
  
    if (mediaSource) {
      mediaSource.trigger({type: 'sourceopen', swfId});
    } else {
      throw new Error('Media Source not found (Video.js)');
    }
  };
  
  /**
   * Check to see if the native MediaSource object exists and supports
   * an MP4 container with both H.264 video and AAC-LC audio.
   *
   * @return {Boolean} if  native media sources are supported
   */
  const supportsNativeMediaSources = function() {
    return (!!window.MediaSource && !!window.MediaSource.isTypeSupported &&
      window.MediaSource.isTypeSupported('video/mp4;codecs="avc1.4d400d,mp4a.40.2"'));
  };
  
  /**
   * An emulation of the MediaSource API so that we can support
   * native and non-native functionality such as flash and
   * video/mp2t videos. returns an instance of HtmlMediaSource or
   * FlashMediaSource depending on what is supported and what options
   * are passed in.
   *
   * @link https://developer.mozilla.org/en-US/docs/Web/API/MediaSource/MediaSource
   * @param {Object} options options to use during setup.
   */
  export const MediaSource = function(options) {
    let settings = videojs.mergeOptions(defaults, options);
  
    this.MediaSource = {
      open,
      supportsNativeMediaSources
    };
  
    // determine whether HTML MediaSources should be used
    if (settings.mode === 'html5' ||
        (settings.mode === 'auto' && supportsNativeMediaSources())) {
      return new HtmlMediaSource();
    } else if (videojs.getTech('Flash')) {
      return new FlashMediaSource();
    }
  
    throw new Error('Cannot use Flash or Html5 to create a MediaSource for this video');
  };
  
  MediaSource.open = open;
  MediaSource.supportsNativeMediaSources = supportsNativeMediaSources;
  
  /**
   * A wrapper around the native URL for our MSE object
   * implementation, this object is exposed under videojs.URL
   *
   * @link https://developer.mozilla.org/en-US/docs/Web/API/URL/URL
   */
  export const URL = {
    /**
     * A wrapper around the native createObjectURL for our objects.
     * This function maps a native or emulated mediaSource to a blob
     * url so that it can be loaded into video.js
     *
     * @link https://developer.mozilla.org/en-US/docs/Web/API/URL/createObjectURL
     * @param {MediaSource} object the object to create a blob url to
     */
    createObjectURL(object) {
      let objectUrlPrefix = 'blob:vjs-media-source/';
      let url;
  
      // use the native MediaSource to generate an object URL
      if (object instanceof HtmlMediaSource) {
        url = window.URL.createObjectURL(object.nativeMediaSource_);
        object.url_ = url;
        return url;
      }
      // if the object isn't an emulated MediaSource, delegate to the
      // native implementation
      if (!(object instanceof FlashMediaSource)) {
        url = window.URL.createObjectURL(object);
        object.url_ = url;
        return url;
      }
  
      // build a URL that can be used to map back to the emulated
      // MediaSource
      url = objectUrlPrefix + urlCount;
  
      urlCount++;
  
      // setup the mapping back to object
      videojs.mediaSources[url] = object;
  
      return url;
    }
  };
  
  videojs.MediaSource = MediaSource;
  videojs.URL = URL;