लगभग हर कोई इसका उपयोग करता है, और, निश्चित रूप से, कई ने नेटवर्क बैंडविड्थ के लिए वीडियो स्ट्रीम के गतिशील अनुकूलन के बारे में सुना है। हाल ही में, इंटरनेट पर ऑनलाइन वीडियो के लिए यह लगभग अनिवार्य आवश्यकता बन गई है। अनुकूली वीडियो स्ट्रीम के लाभ स्पष्ट हैं: यदि नेटवर्क कभी-कभी "sags" करता है, तो वीडियो प्लेयर में बिना पेजिंग और बफरिंग के प्रदर्शित होना जारी रहता है; नेटवर्क बैंडविड्थ के लिए चित्र गुणवत्ता स्वचालित रूप से उपयुक्त है।
इस तथ्य के बावजूद कि वीडियो स्ट्रीम का गतिशील अनुकूलन पहले से ही अपेक्षाकृत "पुरानी" तकनीक है, सर्वश्रेष्ठ परिणाम प्राप्त करने के तरीके पर कई छोटे विवरण हैं। ताकि सर्वर की ओर से यह सरल और सस्ता हो, और यह कि इस तरह के वीडियो संभव के रूप में कई ग्राहकों के साथ संगत हो (वेब, आईओएस, एंड्रॉइड, ठीक है, स्मार्ट टीवी के बारे में मत भूलना)।
हब पर अनुकूली वीडियो पर पहले से ही कई लेख थे, इसलिए मैंने खुद को नहीं दोहराया और यह ध्यान देने की कोशिश की कि यह कैसे काम करता है और इसे कैसे बनाया जाए।
गीतात्मक विषयांतर (अनुकूली वीडियो के बारे में यथासंभव संक्षिप्त और सरल):
जाहिर है, इंटरनेट पर वीडियो वितरित करने का सबसे आसान तरीका एक mp4 फ़ाइल लेना है और इसे एक HTTP सर्वर पर अपलोड करना है। यह विकल्प बुरा है कि हमारे पास केवल 1 फ़ाइल है, और हमारे पास बहुत सारे क्लाइंट हैं और उच्च-गुणवत्ता वाले और बहुत ही इंटरनेट कनेक्शन नहीं हैं। यदि हम 20 मेगाबिट्स (ब्लूएरे क्वालिटी) की एक बिटरेट के साथ 1080p वीडियो अपलोड करते हैं, तो स्मार्टफ़ोन इसे नहीं देख पाएंगे, और अगर हम स्मार्टफ़ोन के लिए वीडियो अपलोड करते हैं (कहते हैं, 1 मेगाबिट / एस और 320x240), तो यह 55-इंच के टीवी पर भयानक लगेगा।
खैर, 1 फ़ाइल खराब होने के बाद, आइए एक दर्जन फाइलें, एक स्रोत से अलग-अलग वीडियो को "कट" करें, मोबाइल से 1080p तक, 1 मेगाबिट / एस से 20 तक बिटरेट के साथ सभी बिट्रेट और सभी फ़्रेम आकार होंगे। लेकिन एक समस्या है। एक ही स्मार्टफोन घर में वाई-फाई (यानी तेज), और एक रेस्तरां (यानी धीमा) दोनों में हो सकता है। वही टीवी मास्को में लोगों और सखालिन पर लोगों के लिए उपलब्ध हैं।
फिर खिलाड़ी को किसी भी तरह से जांचें कि नेटवर्क में क्या बैंडविड्थ है और, इसे मापा जाने पर, देखने के लिए आवश्यक फ़ाइल का चयन करता है। अंत में, एक और अनसुलझी समस्या इस तथ्य को ध्यान में रखना है कि फिल्म 2-3 घंटे तक चलती है, और इंटरनेट "बहुत" है, फिर "थोड़ा"। समय-समय पर नेटवर्क बैंडविड्थ पैमाइश चलाएं? यह विधि काम करेगी, लेकिन क्या करना है जब आपको नेटवर्क के "सब्सिडेंस" या "त्वरण" के दौरान अधिक या कम "उच्च-गुणवत्ता" फ़ाइल पर स्विच करने की आवश्यकता होती है? इसे जल्दी से करने के लिए (और यहां तक कि यह देखने के बिना कि क्या पहले से ही पंप किया गया है), आपको पहले से पता होना चाहिए कि नई फ़ाइल में किस जगह से आपको डाउनलोड करना शुरू करना है। दुर्भाग्य से, चर बिट दर के कारण, फ़ाइल की शुरुआत से फिल्म के समय तक ऑफसेट का अनुपात बहुत अक्सर गैर-रैखिक होता है। तेज दृश्यों पर, जब, उदाहरण के लिए, जेम्स बॉन्ड एक और दुश्मन का पीछा कर रहा है, तो तस्वीर अक्सर बदलती है और बिटरेट उच्च है, और बादल रहित आकाश के चिकनी चित्रमाला पर चित्र लगभग नहीं बदलता है और बिटरेट कम है।
इस कार्य के साथ सामना करने के लिए, अग्रिम में सभी फाइलों को अनुक्रमित करना आवश्यक है (जोड़े को "फिल्म के दृश्य / फ़ाइल की शुरुआत से स्थिति में।") इन जोड़ियों को खंड कहा जाता है। इसके बाद, वर्तमान देखने के समय को जानने के बाद, आप उस स्थान से किसी अन्य फ़ाइल में निर्धारित कर सकते हैं। अगला सेगमेंट डाउनलोड करें: सीमलेस स्विचिंग के लिए, विभिन्न बिटरेट से सेगमेंट को समय में संरेखित किया जाता है।
बेशक, इन सभी कार्यों को लंबे समय से लगभग सभी आधुनिक उपकरणों में लागू किया गया है। एक ही फिल्म के लिए कई अलग-अलग बिटरेट और फ्रेम आकार एक विशिष्ट प्रारूप में पैक किए जाते हैं, एक विशेष डिस्क्रिप्टर फाइल में कौन सी फाइलें और कहां वर्णित है (इसे अक्सर एक प्रकटन कहा जाता है) के बारे में जानकारी। देखने से पहले, क्लाइंट मैनिफ़ेस्ट फ़ाइल डाउनलोड करता है और "समझता" है कि इसे कहाँ से डाउनलोड करना है, वीडियो का आकार कहाँ है और सर्वर पर कौन सा बिटरेट है।
बुरी खबर यह है कि आधुनिक दुनिया में यह सरल दृष्टिकोण अलग-अलग कंपनियों द्वारा अलग-अलग समय पर और अलग-अलग तरीकों से लागू किया जाता है। यहां HTTP पर वीडियो को अनुकूल तरीके से वितरित करने के सबसे प्रसिद्ध और सामान्य तरीकों की एक सूची दी गई है:
- HTTP लाइव स्ट्रीमिंग (या Apple द्वारा आविष्कार किया गया HLS, कई उपकरणों में उपयोग किया जाता है)
- HTTP डायनामिक स्ट्रीमिंग (संक्षिप्त के लिए Adobe HDS)
- MPEG-DASH (जनवरी के अंत में प्रकाशित मानक)
- चिकनी स्ट्रीमिंग (Microsoft द्वारा आविष्कार)
यह भी ध्यान देने योग्य है कि कभी-कभी (एचडीएस और स्मूथ स्ट्रीमिंग प्रारूपों में) मैनिफ़ेस्ट से सीधे लिंक के बजाय, एक विशेष सेगमेंट एड्रेसिंग स्कीम का उपयोग किया जाता है, जब सर्वर इस विशेष स्कीम का उपयोग "गणना" करने के लिए करता है जो क्लाइंट अनुरोधों को दर्ज करता है और ऐसी स्कीम का समर्थन करने के लिए, सर्वर भी घोषणा पत्र।
आइए एचएलएस के उदाहरण का उपयोग करते हुए सबसे सरल प्रारूप और उपकरणों के सबसे व्यापक रूप से समर्थित प्रारूप के रूप में अनुकूली वीडियो की तैयारी पर करीब से नज़र डालें।
HLS में एक प्रदर्शन एक "मास्टर प्लेलिस्ट" और कई "स्ट्रीम प्लेलिस्ट" से प्लेलिस्ट का एक समूह है। इसे एक उदाहरण के साथ दिखाना सबसे आसान होगा। मान लीजिए हमारे पास एक बहुत ही छोटी फिल्म है (केवल 10 सेकंड के 3 खंड, सादगी के लिए), जिसके लिए हमने
500 केबीपीएस ,
1000 केबीपीएस और
2000 केबीपीएस के 3 वीडियो बिटरेट बनाए। सर्वर फ़ाइल सिस्टम में, यह उदाहरण के लिए, इस तरह स्थित हो सकता है:
/master-playlist.m3u8 /500K/ /500K/playlist-500K.m3u8 /500K/segment0.ts /500K/segment1.ts /500K/segment2.ts /1000K/ /1000K/playlist-1000K.m3u8 /1000K/segment0.ts /1000K/segment1.ts /1000K/segment2.ts /2000K/ /2000K/playlist-2000K.m3u8 /2000K/segment0.ts /2000K/segment1.ts /2000K/segment2.ts
मास्टर-प्लेलिस्ट .3u8 फ़ाइल अंदर की तरह दिखती है (मैंने प्रस्तुति की आसानी के लिए कुछ जानकारी हटा दी):
जो m3u प्रारूप से परिचित हैं वे आसानी से समझ सकते हैं कि क्या है। फ़ाइल में अन्य m3u8 प्लेलिस्ट के लिंक की तीन लाइनें हैं, और प्रत्येक लिंक के ऊपर '#' आइकन द्वारा टिप्पणी की गई रेखा में संबंधित बिटरेट के लिए डेटा है।
BANDWIDTH, CODECS, रिज़ॉल्यूशन - सामान्य तौर पर, शब्द अपने लिए बोलते हैं। यह देखना आसान है कि केवल BANDWIDTH अलग है, हालांकि वास्तव में सभी पैरामीटर अलग हो सकते हैं। क्लाइंट का कार्य इन मापदंडों से समझना है, जो वर्तमान में प्लेलिस्ट उसके लिए उपयुक्त है।
मान लीजिए कि एक ग्राहक जानता है कि उसके पास "अच्छा" इंटरनेट है और एक उच्च बिटरेट (2000K) पसंद करता है। क्लाइंट 2000K / प्लेलिस्ट- 2000K.m3u8 प्लेलिस्ट डाउनलोड करता है, जो अंदर इस तरह दिखता है:
व्यक्तिगत सेगमेंट के लिंक दिखाई देते हैं, सेकंड में उनकी अवधि शून्य सेगमेंट के लिए ऊपर की रेखा से संकेतित होती है, उदाहरण के लिए: "#EXTINF: 9.8849"। इस प्लेलिस्ट को डाउनलोड करने के बाद, ग्राहक पहले खंड से तीसरे तक खेलना शुरू कर देता है। एक सेगमेंट को देखते समय, आमतौर पर अगला भाग, और इसी तरह से होता है। यदि क्लाइंट को लगता है कि अगले सेगमेंट को बहुत धीरे-धीरे पंप किया जा रहा है, तो क्लाइंट किसी अन्य प्लेलिस्ट से उसी सेगमेंट (मूवी में उसी स्थान के लिए) को डाउनलोड करना और डाउनलोड करना बंद कर सकता है, उदाहरण के लिए, 500K / प्लेलिस्ट -500K.m3u8। जब इंटरनेट की गति बहाल हो जाती है, तो क्लाइंट फिर से 1000K या 2000K प्लेलिस्ट से डाउनलोडिंग सेगमेंट पर स्विच कर सकता है।
एचएलएस की सादगी आपको वस्तुतः किसी भी सर्वर प्लेटफॉर्म (सर्वर "लॉजिक" से वितरित करने की अनुमति देती है, वास्तव में, वितरण के लिए आवश्यक नहीं है)। व्यक्तिगत सेगमेंट, यदि आवश्यक हो, आसानी से किसी भी तरह से कैश किया जा सकता है।
अब देखते हैं कि एचएलएस में वीडियो बनाने और पैकेजिंग के लिए कौन से उपकरण उपलब्ध हैं। इस प्रक्रिया में तीन मुख्य चरण होते हैं:
चरण 1. वांछित बिटरेट और फ्रेम आकार के साथ स्रोत फ़ाइलों (.Mov या H.264 के साथ .mp4) की तैयारी।यहां कई विकल्प हैं, लेकिन सबसे स्पष्ट है कि निशुल्क
ffmpeg का उपयोग करना है। MacOSX और Windows के लिए कई GUI वीडियो संपादक हैं। इस चरण में ऊपर वर्णित उदाहरण के लिए, आपको 500K, 1000K और 2000K की औसत बिट्रेट के साथ तीन .mp4 या .Mov फाइलें प्राप्त करने की आवश्यकता है। उन सभी के लिए एक ही स्रोत लेना महत्वपूर्ण है, ताकि पूरी प्रक्रिया के अंत में आपको ऐसे सेगमेंट मिलें जो समय में समान हों।
उदाहरण के लिए, यदि आपके पास मूल
movie.mp4 फ़ाइल है (यह मानते हुए कि इसकी बिट दर 2000K से कम नहीं है), तो यह इस तरह ffmpeg चलाने के लिए पर्याप्त होगा (चाबियाँ इंगित करती हैं कि साउंडट्रैक को लिया जा सकता है, और वीडियो बिटरेट बदल गया है):
$ ffmpeg -i movie.mp4 -acodec copy -vb 500K movie-500K.mp4 $ ffmpeg -i movie.mp4 -acodec copy -vb 1000K movie-1000K.mp4 $ ffmpeg -i movie.mp4 -acodec copy -vb 2000K movie-2000K.mp4
मंच 2. एक-सा प्लेलिस्ट का निर्माण।इसके बाद, आपको प्रत्येक फिल्म- * K.mp4 से m3u8 प्लेलिस्ट और * .ts सेगमेंट का एक सेट बनाने की जरूरत है। यह महत्वपूर्ण है कि खंड अलग-अलग बिट दर के बीच समकालिक हों। मुझे तुरंत यह कहना चाहिए कि ffmpeg m3u8 + सेगमेंट में mp4 को "काट" सकता है, लेकिन केवल एक बिटरेट के ढांचे के भीतर। दुर्भाग्य से, मास्टर प्लेलिस्ट को फिर हाथ से बनाना होगा। यह बहुत मुश्किल नहीं है (न्यूनतम संस्करण में, कोई भी पाठ संपादक पर्याप्त है), लेकिन अगर आप Apple iOS या OSX डेवलपर बनते हैं, तो मैं
HTTP लाइव स्ट्रीमिंग टूल पैकेज (MacOSX के लिए) की सिफारिश कर सकता हूं। इसमें कई कार्यक्रम शामिल हैं, जिनमें से दो हमारे लिए उपयोगी हैं:
Mediafileseacter और
variantplaylistcreator । पहले mp4 फाइल को m3u8 प्लेलिस्ट और "स्लाइस" खंडों में बदल देता है, दूसरा एक मास्टर प्लेलिस्ट में कई एक-बिट प्लेलिस्ट एकत्र करता है।
तो, हम पिछले चरण में प्राप्त तीन फाइलों से तीन प्लेलिस्ट बनाते हैं (यह माना जाता है कि फिल्म - *। Mp4 फाइलें वर्तमान फ़ोल्डर में हैं)।
$ mkdir 500K $ mediafilesegmenter -I -f 500K -B segment movie-500K.mp4 $ mkdir 1000K $ mediafilesegmenter -I -f 1000K -B segment movie-1000K.mp4 $ mkdir 2000K $ mediafilesegmenter -I -f 2000K -B segment movie-2000K.mp4
थोड़ा स्पष्टीकरण:
-I स्विच के लिए एक विशेष फ़ाइल (वैरिएंट प्लिस्ट) बनाने की आवश्यकता होती है, जिसे बाद में वेरिएंटप्लेलिस्टक्रीट प्रोग्राम में आवश्यक होगा।
-F 500K स्विच निर्देशिका (500K) को इंगित करता है जिसमें "कटा हुआ" खंड जोड़ा जाना चाहिए।
-B खंड स्विच बताता है कि खंड फ़ाइलों को क्या कहा जाना चाहिए (एक अंक और विस्तार .ts द्वारा पूरक होने के लिए एक उपसर्ग)।
इस स्तर पर, आपके पास खंड फ़ाइलों से भरे 3 फ़ोल्डर, 3 प्लेलिस्ट, प्रत्येक फ़ोल्डर में एक और एक्सटेंशन .plist के साथ 3 फ़ाइलें होनी चाहिए। एकल-बिट प्लेलिस्ट को डिफ़ॉल्ट रूप से prog_index.m3u8 कहा जाता है। आप एक ही समय में देख सकते हैं कि वे क्लाइंट पर कैसे खेले जाते हैं, इसके लिए आपको उन्हें एक HTTP सर्वर पर रखना होगा और क्लाइंट पर इनमें से किसी भी prog_index.m3u8 पर देखना शुरू करना होगा।
स्टेज 3. हम एक ही मास्टर में तीन अलग-अलग प्लेलिस्ट इकट्ठा करते हैं।ऐसा करने के लिए,
variantplaylistcreator का उपयोग करें। यह इस तरह शुरू होता है (हमारे उदाहरण के लिए):
variantplaylistcreator -r -o movie.m3u8 \ 500K\prog_index.m3u8 movie-500K.plist \ 1000K\prog_index.m3u8 movie-1000K.plist \ 2000K\prog_index.m3u8 movie-2000K.plist
-R स्विच को तथाकथित रिज़ॉल्यूशन टैग (वीडियो फ्रेम आकार) निर्दिष्ट करने की आवश्यकता होती है। सामान्य तौर पर, यह आवश्यक नहीं है, लेकिन यदि आप एक मास्टर प्लेलिस्ट में विभिन्न प्रस्तावों (उदाहरण के लिए, मोबाइल गुणवत्ता, 480p और 1080p) के साथ कई वीडियो पैक करते हैं, तो आपको इसे निर्दिष्ट करना चाहिए। इस स्थिति में, मास्टर प्लेलिस्ट से सीधे क्लाइंट को पता चल जाएगा कि कौन सी अनुमतियां उपलब्ध हैं।
-O movie.m3u8 स्विच आउटपुट फ़ाइल (मास्टर प्लेलिस्ट) के नाम को इंगित करता है।
कमांड लाइन के शेष भाग प्रत्येक बिट दर के लिए प्लेलिस्ट-प्लिस्ट जोड़े हैं जो पिछले चरण में प्राप्त किए गए थे।
अब हमारे पास
मूवी .3u8 मास्टर प्लेलिस्ट है। आप एचटीटीपी सर्वर पर वर्तमान निर्देशिका और उपनिर्देशिका अपलोड कर सकते हैं और क्लाइंट पर मूवी.m3u8 फ़ाइल देखना शुरू कर सकते हैं। वैसे, * .Mov फ़ाइलों की अब आवश्यकता नहीं है, सामग्री के कब्जे वाले स्थान को कम करने के लिए, उन्हें फ़ोल्डर से हटाया जा सकता है।
यह सब अभी के लिए है, लेकिन अगर यह विषय एक सम्मानित समुदाय के लिए दिलचस्प है, तो मैं इसे जारी रख सकता हूं और आपको भविष्य की पोस्ट में बता सकता हूं कि वैकल्पिक ऑडियो ट्रैक और उपशीर्षक को एचएलएस में कैसे जोड़ा जाए, साथ ही साथ एचपीएस से स्मार्ट टीवी के साथ एमपीईजी-डैश को कैसे बनाया जाए। आपका ध्यान देने के लिए धन्यवाद।