aboutsummaryrefslogtreecommitdiff
path: root/files/zh-cn/web/api/mediasource/index.html
blob: bd15ef934d93fec35af2c353b9995449cc29d661 (plain)
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
---
title: MediaSource
slug: Web/API/MediaSource
translation_of: Web/API/MediaSource
---
<p>{{APIRef("Media Source Extensions")}}{{SeeCompatTable}}</p>

<p><strong><code>MediaSource</code></strong><a href="/en-US/docs/Web/API/Media_Source_Extensions_API">Media Source Extensions API</a> 表示媒体资源{{domxref("HTMLMediaElement")}}对象的接口。<code>MediaSource</code> 对象可以附着在{{domxref("HTMLMediaElement")}}在客户端进行播放。</p>

<h2 id="构造函数">构造函数</h2>

<dl>
 <dt>{{domxref("MediaSource.MediaSource", "MediaSource()")}}</dt>
 <dd>构造并且返回一个新的<code>MediaSource</code>的空对象(with no associated source buffers)。</dd>
</dl>

<h2 id="属性">属性</h2>

<dl>
 <dt>{{domxref("MediaSource.sourceBuffers")}} {{readonlyInline}}</dt>
 <dd>返回一个{{domxref("SourceBufferList")}} 对象,包含了这个<code>MediaSource的</code>{{domxref("SourceBuffer")}}的对象列表。</dd>
 <dt>{{domxref("MediaSource.activeSourceBuffers")}} {{readonlyInline}}</dt>
 <dd>返回一个 {{domxref("SourceBufferList")}} 对象,包含了这个{{domxref("MediaSource.sourceBuffers")}}中的{{domxref("SourceBuffer")}} 子集的对象—即提供当前被选中的视频轨 (video track),启用的音频轨 (audio tracks) 以及显示/隐藏的字幕轨 (text tracks) 的对象列表。</dd>
 <dt> </dt>
 <dt>{{domxref("MediaSource.readyState")}} {{readonlyInline}}</dt>
 <dd><code><font face="Open Sans, arial, x-locale-body, sans-serif">返回一个包含当前</font>MediaSource</code>状态的集合,即使它当前没有附着到一个media元素(<code>closed</code>),或者已附着并准备接收{{domxref("SourceBuffer")}} 对象 (<code>open</code>),亦或者已附着但这个流已被{{domxref("MediaSource.endOfStream()")}}关闭(<code>ended</code>.)</dd>
 <dt>{{domxref("MediaSource.duration")}}</dt>
 <dd>获取和设置当前正在推流媒体的持续时间。</dd>
</dl>

<dl>
</dl>

<dl>
</dl>

<h2 id="方法">方法</h2>

<p><em>从父接口{{domxref("EventTarget")}}上继承而来。</em></p>

<dl>
 <dt>{{domxref("MediaSource.addSourceBuffer()")}}</dt>
 <dd>创建一个带有给定MIME类型的新的 {{domxref("SourceBuffer")}} 并添加到 <code>MediaSource 的 </code>{{domxref("SourceBuffers")}} 列表。</dd>
 <dt>{{domxref("MediaSource.removeSourceBuffer()")}}</dt>
 <dd>删除指定的{{domxref("SourceBuffer")}} 从这个<code>MediaSource</code>对象中的 {{domxref("SourceBuffers")}}列表。</dd>
 <dt>{{domxref("MediaSource.endOfStream()")}}</dt>
 <dd>表示流的结束。</dd>
 <dt>
 <h2 id="静态方法">静态方法</h2>
 </dt>
 <dt>{{domxref("MediaSource.isTypeSupported()")}}</dt>
 <dd>返回一个 {{domxref("Boolean")}} 值表明给定的MIME类型是否被当前的浏览器支持——这意味着是否可以成功的创建这个MIME类型的{{domxref("SourceBuffer")}} 对象。</dd>
</dl>

<h2 id="示例">示例</h2>

<p>这个例子尽可能快地逐块加载视频,并在加载好后立刻播放。 这个示例是由Nick Desaulniers 编写,你可以<a href="http://nickdesaulniers.github.io/netfix/demo/bufferAll.html">点这里查看</a>  (你也可以<a href="https://github.com/nickdesaulniers/netfix/blob/gh-pages/demo/bufferAll.html">点这里下载</a>来进一步研究)。</p>

<pre class="brush: js">var video = document.querySelector('video');

var assetURL = 'frag_bunny.mp4';
// Need to be specific for Blink regarding codecs
// ./mp4info frag_bunny.mp4 | grep Codec
var mimeCodec = 'video/mp4; codecs="avc1.42E01E, mp4a.40.2"';

if ('MediaSource' in window &amp;&amp; MediaSource.isTypeSupported(mimeCodec)) {
  var mediaSource = new MediaSource();
  //console.log(mediaSource.readyState); // closed
  video.src = URL.createObjectURL(mediaSource);
  mediaSource.addEventListener('sourceopen', sourceOpen);
} else {
  console.error('Unsupported MIME type or codec: ', mimeCodec);
}

function sourceOpen (_) {
  //console.log(this.readyState); // open
  var mediaSource = this;
  var sourceBuffer = mediaSource.addSourceBuffer(mimeCodec);
  fetchAB(assetURL, function (buf) {
    sourceBuffer.addEventListener('updateend', function (_) {
      mediaSource.endOfStream();
      video.play();
      //console.log(mediaSource.readyState); // ended
    });
    sourceBuffer.appendBuffer(buf);
  });
};

function fetchAB (url, cb) {
  console.log(url);
  var xhr = new XMLHttpRequest;
  xhr.open('get', url);
  xhr.responseType = 'arraybuffer';
  xhr.onload = function () {
    cb(xhr.response);
  };
  xhr.send();
};</pre>

<h2 id="说明">说明</h2>

<table class="standard-table">
 <tbody>
  <tr>
   <th scope="col">Specification</th>
   <th scope="col">Status</th>
   <th scope="col">Comment</th>
  </tr>
  <tr>
   <td>{{SpecName('Media Source Extensions', '#mediasource', 'MediaSource')}}</td>
   <td>{{Spec2('Media Source Extensions')}}</td>
   <td>Initial definition.</td>
  </tr>
 </tbody>
</table>

<h2 id="浏览器支持情况">浏览器支持情况</h2>

<div>
<p>{{Compat("api.MediaSource")}}</p>
</div>

<h2 id="See_also">See also</h2>

<ul>
 <li>{{domxref("SourceBuffer")}}</li>
 <li>{{domxref("SourceBufferList")}}</li>
</ul>