[流媒體 & web前端] MSE | Media Source Extensions小試


注意點(diǎn)

1. 獲取編碼信息比較重要:
var mimeCodec = 'video/mp4; codecs="avc1.42C00D,mp4a.40.5"';

可以通過(guò)mp4info工具得到:
mp4info test.mp4 | grep Codec

2.mp4源文件

mp4的需要為fragment類(lèi)型;
可以通過(guò)mp4fragment工具去轉(zhuǎn)換生成:文檔https://www.bento4.com/documentation/


MSE中使用blob url去實(shí)現(xiàn)播放的代碼:

<!DOCTYPE html>
<html>
    <head>
        <meta charset="utf-8"/>
    </head>
    <body>
        <video controls></video>
        <script>
            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();
            }
            
            var video = document.querySelector('video');

            var assetURL = 'output.mp4';
            // var assetURL = 'fmp4.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"';
            var mimeCodec = 'video/mp4; codecs="avc1.42C00D,mp4a.40.5"';

            if ('MediaSource'in window && 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);
            }
            </script>
    </body>
</html>

最終效果

如圖:

image.png

如圖中,最終video標(biāo)簽的src為自動(dòng)生成的一個(gè)blob鏈接


Bootom
最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時(shí)請(qǐng)結(jié)合常識(shí)與多方信息審慎甄別。
平臺(tái)聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀(guān)點(diǎn),簡(jiǎn)書(shū)系信息發(fā)布平臺(tái),僅提供信息存儲(chǔ)服務(wù)。

友情鏈接更多精彩內(nèi)容