MP4

2012-10-22 35 views
33

के माध्यम से लाइव स्ट्रीमिंग मैं एक ऑनलाइन टीवी सेवा पर काम कर रहा हूं। लक्ष्य में से कोई भी वीडियो बिना किसी अतिरिक्त ब्राउज़र प्लग-इन के बिना खेला जा सकता है (फ्लैश को छोड़कर)।MP4

मैंने एमपी 4 का उपयोग करने का निर्णय लिया, क्योंकि यह एचटीएमएल 5 ब्राउज़र और फ्लैश (फॉलबैक के लिए) द्वारा समर्थित है। एफएफएमपीईजी द्वारा सर्वर पर एएसएफ से वीडियो ट्रांसकोड किए जाते हैं।

हालांकि, मैंने पाया कि एमपी 4 लाइव स्ट्रीम नहीं हो सकता है क्योंकि इसमें मेटाडेटा के लिए एक मूव परमाणु है जिसे लंबाई निर्दिष्ट करना है। FFMpeg सीधे mp4 को stdout पर स्ट्रीम नहीं कर सकता है, क्योंकि यह फ़ाइल के अंत में moov डालता है। (Live transcoding and streaming of MP4 works in Android but fails in Flash player with NetStream.Play.FileStructureInvalid error)

बेशक, एमपीईजी-टीएस मौजूद है, लेकिन यह HTML5 <video> द्वारा समर्थित नहीं है।

मैंने जो सोचा था, वह एमपी 4 के लिए रीयल-टाइम में स्ट्रीम को ट्रांसकोड करने का तरीका है, और इसके लिए प्रत्येक नए HTTP अनुरोध पर, पहले एक मूव भेजें जो वीडियो की लंबाई के लिए बहुत लंबी संख्या निर्दिष्ट करता है, और फिर भेजना शुरू करता है एमपी 4 फ़ाइल के बाकी।

क्या स्ट्रीमिंग के लिए MP4 का उपयोग करना संभव है?

कुछ शोध और av501 के उत्तर के बाद, मैं समझता हूं कि फ्रेम के आकारों को जाना जाना चाहिए ताकि यह काम कर सके।

क्या mp4 फ़ाइल को छोटे हिस्सों में विभाजित किया जा सकता है ताकि इसे स्ट्रीम किया जा सके?

बेशक, किसी अन्य कंटेनर/प्रारूप में स्विच करना एक विकल्प है, लेकिन फ्लैश और एचटीएमएल 5 दोनों के साथ संगत एकमात्र प्रारूप mp4/h264 है, इसलिए यदि मुझे दोनों का समर्थन करना है, तो मुझे दो बार ट्रांसकोड करना होगा।

उत्तर

5

यहां मेरे विचार हैं दोस्तों में से कुछ दूसरों के रास्ते पर सही हो सकते हैं। मैं अज्ञानता की मांग करता हूं क्योंकि किसी ने वास्तव में इस प्रक्रिया को पूरी तरह से दस्तावेज नहीं किया है, यह सब एक शिक्षित अनुमान है।

AvAssetWriter केवल एक फ़ाइल में एन्कोड करता है, ऐसा लगता है कि एन्कोडेड वीडियो को स्मृति में प्राप्त करने का कोई तरीका नहीं है। एक पृष्ठभूमि थ्रेड से एक प्राथमिक धारा में सॉकेट परिणाम कहने के लिए फ़ाइल को पढ़ते समय, यह अनिवार्य रूप से एक एम 4 वी है, जिसमें एच 264/एसी एमडीएटी वाला कंटेनर है, लेकिन कोई मूव परमाणु नहीं है। (दूसरे शब्दों में कोई शीर्षलेख नहीं) कोई सेब आपूर्ति करने वाला खिलाड़ी इस स्ट्रीम को चला सकता है, लेकिन एफएफप्ले के आधार पर एक संशोधित प्लेयर स्ट्रीम को डीकोड और चलाने में सक्षम होना चाहिए। यह काम करना चाहिए, क्योंकि एफएफप्ले libavformat का उपयोग करता है जो प्राथमिक धाराओं को डीकोड कर सकता है, एक चेतावनी क्योंकि फ़ाइल की लंबाई की जानकारी नहीं है, कुछ चीजें नाटक, डीटीएस और पीटीएस द्वारा निर्धारित की जानी चाहिए और खिलाड़ी भी फाइल के भीतर नहीं खोज सकता है।

वैकल्पिक रूप से m4v स्ट्रीम से कच्चे नाउल का उपयोग आरटीएमपी स्ट्रीम बनाने के लिए किया जा सकता है।

यदि आप आगे चर्चा करना चाहते हैं तो आप सीधे मुझसे संपर्क कर सकते हैं।

डेटा पर आप कैसे प्राप्त करते हैं।

चूंकि आपको प्राप्त करने वाले पक्ष पर फ़ाइल को फिर से बनाने की ज़रूरत है, मुझे लगता है कि आप इसे केवल सेगमेंट कर सकते हैं, स्टीव मैकफारिन ने एक छोटे से सेब सेगमेंटेडएकॉर्डर लिखा है जिसे आप अपने जीथब पेज पर पा सकते हैं, इससे कुछ मुद्दों को हल किया जाता है moov परमाणुओं के बाद से आप सभी फ़ाइल जानकारी है।

+1

यहां एक अच्छा स्पष्टीकरण है, आरटीएमपी या कुछ कस्टम प्रोटोकॉल जैसे ध्वनि शुरू करने का तरीका http://fabiensanglard.net/mobile_progressive_playback/index.php –

+0

आपके उत्तर में चेतावनी है, यह उपरोक्त पर लिखा गया है। समय स्ट्रीमिंग और प्लेबैक के लिए मामला है। तो -1 – agfe2

2

नहीं, यह केवल बहुत लंबी लंबाई नहीं है .. आपको mp4 में शीर्षलेख बनाने के लिए प्रत्येक फ्रेम के सटीक आकार को जानने की आवश्यकता है। [यही वजह है कि यह विभिन्न एन्कोडर्स द्वारा अंत में बनाया जाता है]।

+0

क्या वह जानकारी खाली नहीं छोड़ी जा सकती है? कुछ tweaking के बाद, मैं एक moov परमाणु के बिना एक एम 4 वी फ़ाइल (मूल रूप से एक एमपी 4) बनाने में कामयाब रहे, और यह टोटेम में खेला, वीडियो लंबाई के बारे में कोई जानकारी दिखाए बिना। – Ivo

+0

क्या आपका m4v एक mp4 (कंटेनर) है जिसमें प्राथमिक फ़ाइल या केवल प्राथमिक फ़ाइल है? शीर्षलेख के बिना यह अब अनुपालन नहीं है। तो चाहे वह खेलता है या नहीं, इस पर निर्भर करता है कि प्लेयर कितना बुद्धिमान है। कुछ खिलाड़ी कड़ी मेहनत कर सकते हैं और फ़ाइल को ठीक करने का प्रयास कर सकते हैं। लेकिन ज्यादातर इसे नहीं खेलेंगे। – av501

+0

हां, ऐसा लगता है कि एम 4 वी या तो सिर्फ एक एमपी 4 फ़ाइल या कच्ची एच 264 धारा हो सकती है। ब्राउज़र में काम करने वाले लोग mp4 थे, और ffmpeg द्वारा जेनरेट किया गया एक कच्चा स्ट्रीम था। तो ऐसा लगता है कि यह सब के बाद नहीं किया जा सकता है। – Ivo

0

बस अपने प्रश्न के दूसरे पैरा को देखते हुए ("वीडियो को एफएमपीपीजी द्वारा सर्वर पर एएसएफ से ट्रांसकोड किया जाता है।"), आपने बताया है कि आप सर्वर पर वीडियो ट्रांसकोड करने के लिए ffmpeg का उपयोग कर रहे हैं।

फ़ाइल की शुरुआत में एमओवीवी परमाणु रखने के लिए क्यूटी-फास्टस्टार्ट या एमपी 4 बॉक्स का उपयोग करें। (यह भी सुनिश्चित करें कि H264 वीडियो & सार्वभौमिक समर्थन के लिए एएसी ऑडियो कोडेक का उपयोग करना)

आशा है कि इससे आपकी मदद मिलेगी।

+2

यह नहीं करता है। कई Google खोजों के बाद, मैंने पाया कि क्यूटी-फास्टस्टार्ट का बहुत उल्लेख किया गया था - लेकिन यह लाइव स्ट्रीमिंग के लिए काम नहीं करेगा क्योंकि स्ट्रीम जारी है - फ्रेम/लंबाई को शुरुआत से नहीं जाना जा सकता है, इसलिए एक एमओवीवी परमाणु नहीं बनाया जा सकता है। क्यूटी-फास्टस्टार्ट मदद करेगा अगर मुझे जो चाहिए वह छद्म प्रवाह (निरंतर डाउनलोड) था। – Ivo

17

आप खंडित एमपी 4 का उपयोग कर सकते हैं। एक खंडित MP4 फ़ाइल एक इस प्रकार बनाया गया है:

moov [moof mdat]+ 

Moov बॉक्स उसके बाद ही पटरियों बारे में बुनियादी जानकारी (कितने, उनके प्रकार, कोडेक आरंभीकरण और इसी तरह) लेकिन ट्रैक में नमूने के बारे में कोई जानकारी है। नमूना स्थानों और नमूना आकारों के बारे में जानकारी मूफ बॉक्स में है, प्रत्येक मूफ बॉक्स के बाद एक एमडीएटी होता है जिसमें पिछले मूफ बॉक्स में वर्णित नमून होते हैं। आम तौर पर एक (moof, mdat) की लंबाई का चयन करेगा -पियर लगभग 2,4 या 8 सेकंड होने के लिए (उस पर कोई विनिर्देश नहीं है लेकिन अधिकांश मान अधिकांश उपयोग के लिए उचित मानते हैं)।

यह एक neverending एमपी 4 स्ट्रीम बनाने का एक तरीका है।

+0

यहां एक नज़र डालें: https://groups.google.com/forum/?fromgroups=#!topic/mp4parser-discussion/e7yg6clATHc इस लड़के को बहुत ही समान समस्याएं प्रतीत होती हैं। –

+3

आखिरकार खंडित एमपी 4 ऐप्पल HTTP लाइव स्ट्रीमिंग की तरह है और एक अच्छी नौकरी करता है। मैंने उपेक्षा की कि शुरुआत में क्योंकि मैंने सोचा था कि खंडन एक अनावश्यक जटिलता प्रतीत होता है, लेकिन अब मुझे लगता है कि यह एकमात्र विकल्प है। – Ivo

+0

@ सेबेस्टियनएनीज़ यह काम करता प्रतीत होता है, हालांकि (कम से कम) सफारी अलग-अलग रेंज जीईटी अनुरोध के साथ प्रत्येक टुकड़े का अनुरोध करता है (खंड से ईओएफ तक शुरू होता है, लेकिन समय-समय पर समाप्त हो जाता है), जिससे धारा के पूरे संचालन को अधिक परेशानी होती है। क्या आपके पास एक ही अनुभव है? –