मीडिया सोर्स एपीआई - यह पक्का करें कि मीडिया सेगमेंट को जोड़ने के क्रम में, बिना किसी रुकावट के वीडियो चलाया जा सके

एचटीएमएल ऑडियो और वीडियो एलिमेंट की मदद से, मीडिया को लोड, डिकोड, और चलाया जा सकता है. इसके लिए, आपको सिर्फ़ src यूआरएल देना होगा:

    <video src='foo.webm'></video>

यह सामान्य इस्तेमाल के उदाहरणों में अच्छी तरह से काम करता है. हालांकि, अडैप्टिव स्ट्रीमिंग जैसी तकनीकों के लिए, मीडिया सोर्स एक्सटेंशन एपीआई (एमएसई) ज़्यादा कंट्रोल देता है. एमएसई की मदद से, ऑडियो या वीडियो के सेगमेंट से JavaScript में स्ट्रीम बनाई जा सकती हैं.

एमएसई को simpl.info/mse पर आज़माया जा सकता है:

MSE API का इस्तेमाल करके चलाए जा रहे वीडियो का स्क्रीनशॉट.

नीचे दिया गया कोड उस उदाहरण से लिया गया है.

MediaSource, किसी ऑडियो या वीडियो एलिमेंट के लिए मीडिया का सोर्स दिखाता है. MediaSource ऑब्जेक्ट का इंस्टैंश बनने और उसका open इवेंट ट्रिगर होने के बाद, उसमें SourceBuffer जोड़े जा सकते हैं. ये मीडिया सेगमेंट के लिए बफ़र के तौर पर काम करते हैं:

var mediaSource = new MediaSource();
video.src = window.URL.createObjectURL(mediaSource);
mediaSource.addEventListener('sourceopen', function() {
    var sourceBuffer =
        mediaSource.addSourceBuffer('video/webm; codecs="vorbis,vp8"');
    // Get video segments and append them to sourceBuffer.
}

हर सेगमेंट को appendBuffer() वाले SourceBuffer में जोड़कर, मीडिया सेगमेंट किसी ऑडियो या वीडियो एलिमेंट पर 'स्ट्रीम' किए जाते हैं. इस उदाहरण में, वीडियो को सर्वर से फ़ेच किया जाता है और फिर File API का इस्तेमाल करके सेव किया जाता है:

reader.onload = function (e) {
    sourceBuffer.appendBuffer(new Uint8Array(e.target.result));
    if (i === NUM_CHUNKS - 1) {
    mediaSource.endOfStream();
    } else {
    if (video.paused) {
        // start playing after first chunk is appended
        video.play();
    }
    readChunk(++i);
    }
};

प्लेबैक का क्रम सेट करना

Chrome 50 में SourceBuffer mode एट्रिब्यूट के लिए अतिरिक्त सहायता जोड़ी गई है. इससे, यह तय किया जा सकता है कि मीडिया सेगमेंट को उसी क्रम में चलाया जाए जिस क्रम में उन्हें जोड़ा गया था. भले ही, शुरुआत में मीडिया सेगमेंट के टाइमस्टैंप अलग-अलग हों.

मीडिया सेगमेंट के लिए, वीडियो चलाने का क्रम तय करने के लिए mode एट्रिब्यूट का इस्तेमाल करें. इसकी दो वैल्यू में से कोई एक हो सकती है:

  • सेगमेंट: हर सेगमेंट के टाइमस्टैंप (जिसमें timestampOffset ने बदलाव किया गया है) के हिसाब से वीडियो चलाने का क्रम तय होता है. इस बात से कोई फ़र्क़ नहीं पड़ता कि सेगमेंट किस क्रम में जोड़े गए हैं.
  • क्रम: मीडिया टाइमलाइन में बफ़र किए गए सेगमेंट का क्रम, SourceBuffer में सेगमेंट जोड़ने के क्रम से तय होता है.

अगर मीडिया सेगमेंट को SourceBuffer में जोड़ने के बाद, उनके टाइमस्टैंप को बाइट स्ट्रीम डेटा से पार्स किया जाता है, तो SourceBuffer की mode प्रॉपर्टी को सेगमेंट पर सेट कर दिया जाएगा. ऐसा न करने पर, mode को sequence पर सेट कर दिया जाएगा. ध्यान दें कि टाइमस्टैंप देना ज़रूरी है: ज़्यादातर स्ट्रीम टाइप के लिए, टाइमस्टैंप देना ज़रूरी है. हालांकि, अन्य स्ट्रीम टाइप के लिए टाइमस्टैंप नहीं दिए जा सकते: इनबैंड टाइमस्टैंप, उन स्ट्रीम टाइप के लिए ही होते हैं जिनमें ये शामिल होते हैं.

mode एट्रिब्यूट की वैल्यू देना ज़रूरी नहीं है. जिन स्ट्रीम में टाइमस्टैंप (ऑडियो/mpeg और ऑडियो/aac) नहीं हैं उनके लिए mode को सिर्फ़ सेगमेंट से क्रम में बदला जा सकता है: mode को क्रम से सेगमेंट में बदलने की कोशिश करने पर गड़बड़ी दिखेगी. जिन स्ट्रीम में टाइमस्टैंप होते हैं उनके लिए, सेगमेंट और सीक्वेंस के बीच स्विच किया जा सकता है. हालांकि, ऐसा करने पर शायद ऐसा व्यवहार दिखे जो पसंद न आए, समझने में मुश्किल हो या जिसका अनुमान लगाना मुश्किल हो.

हर तरह की स्ट्रीम के लिए, वैल्यू को सेगमेंट से बदलकर क्रम किया जा सकता है. इसका मतलब है कि सेगमेंट उसी क्रम में चलाए जाएंगे जिस क्रम में उन्हें जोड़ा गया था. साथ ही, उनके हिसाब से नए टाइमस्टैंप जनरेट किए जाएंगे:

sourceBuffer.mode = 'sequence';

mode वैल्यू को क्रम पर सेट करने से, मीडिया को लगातार चलाया जाता है. भले ही, मीडिया सेगमेंट के टाइमस्टैंप बंद हों. उदाहरण के लिए, वीडियो की मक्सिंग करने में समस्या होने पर या (किसी भी वजह से) जो सेगमेंट जोड़े नहीं गए हैं. अगर स्ट्रीम का सही मेटाडेटा उपलब्ध है, तो ऐप्लिकेशन के लिए timestampOffset से पॉलीफ़िल किया जा सकता है, ताकि वीडियो को लगातार चलाया जा सके. हालांकि, सीक्वेंस मोड इस प्रोसेस को आसान बनाता है और गड़बड़ी होने की आशंका कम करता है.

MSE ऐप्लिकेशन और डेमो

हालांकि, ये SourceBuffer.mode में बदलाव के बिना भी MSE को काम करते हुए दिखाते हैं:

  • Media Source API
  • Shaka Player: वीडियो प्लेयर का डेमो, जो Shaka JavaScript लाइब्रेरी के साथ DASH लागू करने के लिए MSE का इस्तेमाल करता है

ब्राउज़र समर्थन

  • Chrome 50 और उसके बाद के वर्शन पर डिफ़ॉल्ट रूप से
  • Firefox के लिए, ज़्यादा जानकारी के लिए MDN देखें

खास जानकारी

एपीआई की जानकारी