मुझे अपने एसडीके का उपयोग करके एक डीवीआर से H.264 stream
प्राप्त हो रहा है। स्मृति रिसाव थे और मैंने सोचा था कि यह एसडीके था जो सभी रिसावों का कारण बनता था। लेकिन जब मैंने स्ट्रीम रिकॉर्ड की और फ्रेम से एक को पढ़ने के लिए फ्रेम चलाया (बिना किसी तीसरे पक्ष के डीएलएस के), मैंने देखा कि समस्या डीएलएल नहीं बल्कि धारा ही है।एच .264 फ्रेम्स मेमोरी लीक कुछ डिकोडर्स
अजीब पर्याप्त, DivX H264 Decoder
एकमात्र कोडेक है जो स्मृति रिसाव का कारण नहीं बनता है, लेकिन जब स्ट्रीम लंबे समय तक चलती है, तो कभी-कभी DivX डिकोडर भी क्रैश हो जाता है। मैं Microsoft DTV-DVD Video Decoder
का उपयोग करना पसंद करूंगा लेकिन यह बड़ी मेमोरी लीक का कारण बनता है और बहुत सारे फ्रेम छोड़ देता है। मैंने कोशिश की है कि कई अन्य H.264 डिकोडर्स वैसे ही व्यवहार करते हैं।
मैंने कुछ h.264 parsers
का उपयोग करके कुछ अन्य समस्या मुक्त धाराओं की तुलना में h.264 frames
की जांच की लेकिन मुझे लॉग से कुछ भी स्पष्ट नहीं देखा।
चूंकि मेरी समस्या h.264 फ्रेम संरचना के बारे में है, इसलिए मैंने FramesFromFileSourceFilter
नामक एक स्रोत फ़िल्टर तैयार किया है जिसे आप नीचे डाउनलोड कर सकते हैं।
http://www.akaydin.com/directshow/FramesFromFileSourceFilter.zip
यह एक Visual Studio 2008
परियोजना है और सभी निर्भरता अपेक्षाकृत स्थित फ़ोल्डर (264 फ्रेम सहित) में ज़िप फ़ाइल में शामिल कर रहे हैं। इसलिए, आपको केवल परियोजना को संकलित करना है, आउटपुट को regsvr32.exe
के साथ पंजीकृत करें और फ़िल्टर को किसी भी एच .264 डीकोडर के साथ चलाएं जिसे आप GraphEdit या GraphStudio से चाहते हैं। उदाहरण ग्राफ नीचे हैं।
इसके अलावा h264 फ्रेम लिंक जो नीचे वीएलसी द्वारा चलाया जा सकता है पर एक भी कच्चे h264 फ़ाइल के रूप में उपलब्ध हैं (मूल के बाद से गलत एफपीएस के साथ 12 एफपीएस) था।
http://www.akaydin.com/directshow/stream.zip
प्रश्न:
क्या डिवएक्स विकोडक को छोड़कर कई प्रसिद्ध H264 डिकोडर्स साथ स्मृति रिसाव समस्याओं का कारण हो सकता है। इस धारा के साथ क्या गलत है?
अद्यतन 1
पढ़ना डेटा धागा निकाल दिया जाता है और कार्यक्षमता किसी भी प्रतिरोधक और झंडे का उपयोग किए बिना FillBuffer में चले गए। समस्या वही बना है।
http://www.akaydin.com/directshow/FramesFromFileSourceFilterUpdate1.zip
अद्यतन 2
Update1 FillBuffer()
समारोह जो कुछ समस्या पैदा कर रहा था में Sleep()
उपयोग कर रहा था। अब मैंने Sleep()
हटा दिया है और ~ 12 एफपीएस रखने के लिए SetTime()
का उपयोग किया है। इसने Microsoft DTV-DVD Video Decoder
के ड्रॉप फ्रेम मुद्दों को भी हल किया लेकिन स्मृति समस्याओं को हल नहीं किया।
http://www.akaydin.com/directshow/FramesFromFileSourceFilterUpdate2.zip
मेमोरी वृद्धि केवल Working Set
पर होता है। Virtual Bytes
और Private Bytes
स्थिर प्रतीत होता है।क्या Working Set
स्मृति वृद्धि के कारण हो सकता है जो केवल Microsoft DTV-DVD Video Decoder
के साथ होता है?
असल में, मेरे असली फ़िल्टर में एक बेहतर तंत्र है, यह सरलीकृत है। लेकिन चूंकि फ्रेम के बीच 83 मिलीसेकंड की तरह नींद आ रही है, इसलिए समेकन यहां मामला नहीं होना चाहिए। प्लस, DivX डिकोडर किसी भी स्मृति रिसाव का कारण नहीं है। मुझे अभी भी विश्वास है कि धाराएं इस समस्या का कारण बन रही हैं। इसके अतिरिक्त, एक ही फ़िल्टर अन्य डी.264 धाराओं के साथ अन्य उपकरणों से ठीक काम करता है बिना किसी डिकोडर्स के मेमोरी लीक के। –
हो सकता है कि आपका असली फ़िल्टर बेहतर करे, लेकिन यह कोड ढेर भ्रष्टाचार का कारण बनता है। एक और रन पर जब यह गुजरने में कामयाब रहा, तो मुझे कोई रिसाव नहीं मिला (एमएस डीटीवी-डीवीडी डिकोडर के साथ), आप कैसे बताते हैं कि रिसाव हुआ था या नहीं? –
जब तक फ़िल्टर चलता है तब तक स्मृति प्रक्रिया के दौरान बढ़ती रहती है। निश्चित रूप से इस उदाहरण में सीमित संख्या में फ्रेम हैं। लेकिन एक लाइव स्ट्रीम के साथ काम करते समय, स्मृति उपयोग कुछ घंटों के बाद गीगाबाइट तक पहुंच जाता है। जब आप एमएस डीटीवी-डीवीडी वीडियो डिकोडर के साथ फ़िल्टर चलाते हैं तो क्या आपने ग्राफएडिट/ग्राफ़स्टूडियो की कोई स्मृति वृद्धि नहीं देखी है? यदि हां, तो आपका ओएस क्या है? मैंने Win7 32 बिट्स पर इसे धोखा दिया है। –