मेरे पास स्थिर कैमरे से आने वाला वीडियो है। संकल्प और एफपीएस दोनों काफी अधिक हैं। मुझे जो डेटा मिलता है वह बायर प्रारूप में है और प्रति पिक्सेल 10 बिट का उपयोग करता है। जैसा कि मेरे प्लेटफ़ॉर्म पर कोई 10 बिट डेटा प्रकार नहीं है, मूल डेटा 16-बिट शब्दों का उपयोग करके मेमोरी में संग्रहीत किया जाता है। मैं नेटवर्क पर संचारित करने से पहले डेटा के कुछ प्रकार के दोषरहित संपीड़न को लागू करना चाहता हूं ।
- कैमरा हिलता नहीं है, इसलिए लगातार फ़्रेम के बड़े हिस्से लगभग समान होते हैं - लेकिन फिर भी पूरी तरह से नहीं, अपरिहार्य शोर के कारण (निंदा करना एक विकल्प नहीं है, क्योंकि यह दोषरहित माना जाता है और शोर को "खोना" भी नहीं चाहिए) )।
- उच्च एफपीएस के कारण, यहां तक कि जो हिस्से बदलते हैं, वे किसी भी दो लगातार फ्रेम के बीच ज्यादा नहीं बदलते हैं।
- हालाँकि, ऐसा लग रहा है कि कैमरा भी थोड़ा हिलता है। बहुत कम, लेकिन फिर भी, यहां तक कि स्थिर ऑब्जेक्ट पूरी तरह से छवि स्थान में नहीं हैं।
- संपीड़न को मक्खी पर किया जाना है, इसलिए मैं बहुत सारे फ़्रेमों को इकट्ठा नहीं कर सकता और उन सभी को एक साथ संपीड़ित कर सकता हूं, लेकिन मैं 1 फ्रेम को वापस देख सकता हूं और इसे संदर्भ के रूप में उपयोग कर सकता हूं।
उपरोक्त के आधार पर, मेरा पहला विचार डेटा को बिट-पैक करना था, ताकि हर शब्द पर उन 6 अनावश्यक बिट्स बर्बाद न हों। हालाँकि, मैंने सोचा कि अगर मैं कुछ एन्ट्रापी कोडिंग (जैसे हफ़मैन आदि) का उपयोग करता हूं, तो अतिरेक को स्वचालित रूप से ध्यान में रखा जाएगा, इसलिए कोई अतिरिक्त पैकिंग आवश्यक नहीं है। इसलिए मैंने निम्नलिखित कार्य किए हैं:
- दो लगातार फ्रेम के बीच द्विआधारी अंतर लिया। मूल डेटा सीमा 0 ~ 1023 (जैसे अहस्ताक्षरित 10 बिट्स) थी। अंतर डेटा पर हस्ताक्षर किए जाते हैं और सीमा -1023 ~ 1023 तक बढ़ जाती है, लेकिन डेटा भिन्नता (या क्या सही गणितीय शब्द है) मूल डेटा की तुलना में बहुत कम हो जाता है, वास्तव में, अधिकांश मूल्य आश्चर्यजनक रूप से शून्य के करीब नहीं हैं। ।
- लागू चावल कोडिंग अंतर के लिए। जो मैं समझता हूं, वह ज्यादातर छोटे संख्यात्मक मूल्यों के डेटा सेट के लिए एक अच्छा विकल्प है।
यह मुझे 1280x720 फ्रेम के लिए आकार में लगभग 60% की कमी देता है, और मेरी परीक्षा प्रणाली (एक कोर में वर्चुअलबॉक्स में लिनक्स) प्रति सेकंड 40 (अधिक अनुकूलन के बिना) ऐसा कर सकता है। यह महान नहीं है, लेकिन उचित है, मुझे लगता है (या यह है?)।
क्या बेहतर तरीके हैं? मैंने जो भी सामान्य गलतियाँ की हैं? कोई भी सामान्य चरण जो मैंने याद किया? उच्च रिज़ॉल्यूशन फ़्रेम का उपयोग बाद में किया जा सकता है - क्या मुझे बड़े फ्रेम आकारों के लिए बेहतर संपीड़न दरों की उम्मीद करनी चाहिए?
युपीडी .:
- मैंने इस लाइब्रेरी का इस्तेमाल राइस एन्कोडिंग के लिए किया। पुस्तकालय बहुत धीमा है (लेखक स्वयं इसे वास्तविक उपयोग के बजाय सीखने के लिए कुछ के रूप में वर्णित करता है), उदाहरण के लिए यह छोरों को एक-एक करके पढ़ता और लिखता है, जो प्रदर्शन को मारता है। प्रारंभ में इसने केवल मुझे ~ 20 एफपीएस दिया, कुछ बहुत ही बुनियादी अनुकूलन के बाद यह 40 एफपीएस बन गया (जैसा कि ऊपर बताया गया है), बाद में मैंने इसे कुछ और अनुकूलित किया, यह 80 हो गया। यह बिना वेक्टरकरण के एक एकल i7 कोर पर है।
- वैश्वीकरण के रूप में, हालांकि, दुर्भाग्य से मैं चावल कोड को वेक्टर करने का तरीका नहीं सोच सकता (यह भी नहीं जानता कि क्या यह सब संभव है - राइस कोड पर कोई डेटा नहीं मिल सकता है, हफमैन कोड के बारे में मुझे क्या पता चलता है कि पता चलता है) यह अनुक्रमिक है और कुशलता से सदिश नहीं किया जा सकता है, जो राइस कोड के साथ-साथ अन्य चर-लंबाई कोड पर भी लागू हो सकता है)।
- मैंने भी पूरी तरह से अलग दृष्टिकोण की कोशिश की: डेटा को छोटे टुकड़ों में विभाजित करें (जैसे 64 पिक्सेल एपलस) और सरल शून्य दमन का उपयोग करें। हम एक ब्लॉक में सबसे बड़ी संख्या पाते हैं, इसे ब्लॉक की शुरुआत में प्रतिनिधित्व करने के लिए आवश्यक बिट्स की संख्या लिखें (4 अतिरिक्त बिट्स उसके लिए आवश्यक थे, मेरे मामले में), फिर ब्लॉक में सभी संख्याओं को समान संख्या में घटाएं बिट्स। मुझे उम्मीद है कि संपीड़न दर खराब होगी, लेकिन अगर टुकड़े छोटे होते हैं, तो उनमें से कई में शोर स्पाइक्स नहीं होंगे, इसलिए उनके द्विआधारी अंतर को प्रति मूल्य 4 ~ 6 बिट्स की तरह कम किया जा सकता है, और यह वास्तव में, केवल था चावल कोड की तुलना में लगभग 5% खराब है, जबकि दो बार तेजी से (उदाहरण के लिए मेरे मामले के लिए 160 एफपीएस)। मैंने इसे वेक्टर करने की कोशिश की, लेकिन मैं वेक्टराइज़ेशन में चूसना चाहता हूं, इसलिए शायद इस वजह से मैं केवल आगे की गति के X1.8 के बारे में हासिल कर सका।
क्योंकि ऋणात्मक संख्याओं में अग्रणी शून्य नहीं होता है, मैंने द्विआधारी अंतर के बाद और चावल / शून्य दमन से पहले ज़िगज़ैग एन्कोडिंग लागू किया ।