0

我使用 ffmpeg 将 mp4 转换为 m3u8;并且它保持相同的编解码器值。当我使用 fetch 获取 ts 缓冲区并将其附加到 MSE 实例时。如此糟糕。它不起作用。

这里有一些代码:

function sourceOpen(e) {
    URL.revokeObjectURL(video.src);
    // var mime = 'video/mp4; codecs="avc1.42c015, mp4a.40.5"';avc1.42001e"
    var mime = 'video/mp4; codecs="avc1.42E01E, mp4a.40.2"';
    var mediaSource = e.target;
    sourceBuffer = mediaSource.addSourceBuffer(mime);
    var videoUrl = './video/' + playManifest.segments[index]['uri'];
    log('.js-log-m3u8', 'Fetch Segment ~' + videoUrl);
    fetch(videoUrl, {
        // headers: { range: 'bytes=0-5671398' }
    })
        .then(function (response) {
            return response.arrayBuffer();
        })
        .then(function (arrayBuffer) {
            sourceBuffer.appendBuffer(arrayBuffer);
            sourceBuffer.addEventListener('updateend', updateEnd);
        });
}

整个代码

在线测试页面:http ://events.jackpu.com/media-source/

4

1 回答 1

0

您正在将 mime 类型设置为 video/mp4,但尝试将传输流段附加到源缓冲区。结果,追加失败并且没有数据被缓冲。

一旦所有的段都被获取,你就调用 play ,而不检查是否有任何数据被缓冲,并且 Promise 拒绝。

假设您的用户代理能够这样做,您需要创建一个具有正确 mime 类型的 SourceBuffer。

于 2018-02-28T14:27:43.873 回答