Chr*_*let 25 javascript html5 media-source
我正在尝试Chrome中提供的新MediaSource API.
我正试图将二进制数据从WebSocket动态附加到视频媒体源.
从https://html5-demos.appspot.com/static/media-source.html上的示例开始,我的代码目前是:
var websocket = new WebSocket('ws://localhost:8080');
websocket.binaryType = 'arraybuffer';
var mediaSource = new MediaSource();
var buffer;
var queue = [];
var video = $('.video')[0];
video.src = window.URL.createObjectURL(mediaSource);
mediaSource.addEventListener('sourceopen', function(e) {
video.play();
buffer = mediaSource.addSourceBuffer('video/mp4; codecs="avc1.64001E"');
buffer.addEventListener('updatestart', function(e) { console.log('updatestart: ' + mediaSource.readyState); });
buffer.addEventListener('update', function(e) { console.log('update: ' + mediaSource.readyState); });
buffer.addEventListener('updateend', function(e) { console.log('updateend: ' + mediaSource.readyState); });
buffer.addEventListener('error', function(e) { console.log('error: ' + mediaSource.readyState); });
buffer.addEventListener('abort', function(e) { console.log('abort: ' + mediaSource.readyState); });
buffer.addEventListener('update', function() { // Note: Have tried 'updateend'
if (queue.length > 0 && !buffer.updating) {
buffer.appendBuffer(queue.shift());
}
});
}, false);
mediaSource.addEventListener('sourceopen', function(e) { console.log('sourceopen: ' + mediaSource.readyState); });
mediaSource.addEventListener('sourceended', function(e) { console.log('sourceended: ' + mediaSource.readyState); });
mediaSource.addEventListener('sourceclose', function(e) { console.log('sourceclose: ' + mediaSource.readyState); });
mediaSource.addEventListener('error', function(e) { console.log('error: ' + mediaSource.readyState); });
websocket.addEventListener('message', function(e) {
if (typeof e.data !== 'string') {
if (buffer.updating || queue.length > 0) {
queue.push(e.data);
} else {
buffer.appendBuffer(e.data);
}
}
}, false);
Run Code Online (Sandbox Code Playgroud)
我一直收到错误消息:InvalidStateError: Failed to execute 'appendBuffer' on 'SourceBuffer': This SourceBuffer has been removed from the parent media source.
一个追加后.看起来MediaSource在调用后立即关闭buffer.appendData()
.
任何方式优雅地做到这一点?
注意:chrome:// media-internals /不会返回任何有用的信息.
最终问题是我在websocket上发送h264视频.MediaSource API目前仅支持带有关键帧的MPEG-DASH和VP8(在Chrome 35上).
另外,一旦我尝试了VP8,我看到我正在添加一些乱序的帧.
if (buffer.updating || queue.length > 0)
在websocket.onmessage
被要求.if (queue.length > 0 && !buffer.updating)
在buffer.addEventListener('update', ...)
还要求.注意:我将此处提到的编辑应用于问题中的代码,因此问题中代码的唯一问题是编解码器是错误的
归档时间: |
|
查看次数: |
14825 次 |
最近记录: |