क्या एक ऑडियो सीडी से पहले जीवन था? पीसीएम सॉफ्टवेयर डिकोडर

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

PCM प्रोसेसर के साथ कैप्चर करें

पहले चरण में, हम एक सॉफ्टवेयर डिकोडर को लागू करने का प्रयास करेंगे। यह इस विषय पर अंतिम लेख नहीं है, क्योंकि जापानी नीलामियों पर प्रोसेसर खत्म हो सकते हैं, और पीसीएम हर घर में होना चाहिए! वीडियो प्लेयर ढूंढना कोई समस्या नहीं है।

काम करने के लिए, आपको इन समान क्यूआर कोडों की रिकॉर्डिंग के साथ एक फ़ाइल की आवश्यकता है। आप इसे वीडियो कैप्चर कार्ड का उपयोग करके प्राप्त कर सकते हैं। खैर, संकेत स्रोत, बिल्कुल। आप प्रोसेसर आउटपुट को सीधे कैप्चर कर सकते हैं या टेप रिकॉर्डर पर रिकॉर्ड कर सकते हैं। आदर्श रूप से, वास्तविक समय में संकेत को डिकोड करने के लिए कैप्चर डिवाइस के साथ तुरंत काम करें।

कोई भी भाषा करेगा। मैंने पायथन से शुरुआत की। लेकिन यह मेरे लैपटॉप पर धीमा हो गया, इसलिए परिणामस्वरूप मैंने C ++ पर स्विच किया। वैसे, एक दूसरे से स्वतंत्र (लगभग) हमारा छोटा समुदाय 3 डिकोडर प्रोजेक्ट विकसित कर रहा है: ओपनसीवी (सी ++) पर, क्यूटी (सी ++) पर और लैब व्यू पर। पहले एक पर चर्चा की जाएगी। OpenCV को कैप्चर डिवाइस और प्री-रिकॉर्डेड वीडियो दोनों के साथ काम करने की सरलता के कारण चुना गया था। इसके अलावा, छवि के साथ सभी जोड़तोड़ अत्यधिक अनुकूलित हैं।

आपके सामने आने वाली पहली समस्या डेटा खो जाएगी। किसी भी मामले में, वे "विशेष" उपकरणों के बिना किसी भी तरह से बचा नहीं जा सकता है। पीसीएम फ्रेम के दृश्य क्षेत्र में फिट से अधिक लाइनों का उपयोग करता है। NTSC क्षेत्र के मामले में, यह संख्या 480 के दृश्य क्षेत्र के साथ प्रति फ्रेम 492 लाइनें है। PAL के मामले में, सब कुछ बहुत दुखद है।
1. PCM NTSC 44,056 kHz, PAL 44,1 kHz.
2. VHS . ( ). , . , . , . .
इस समस्या के दो समाधान हैं। ड्राइवर को दरकिनार करते हुए कैप्चर कार्ड के साथ काम करें और ADC से डेटा लें, जिसके बाद उन्हें पूर्ण PCM फ्रेम में बदला जा सकता है, या लापता लाइनों पर हथौड़ा चलाया जा सकता है। दूसरा विकल्प थोड़ा जंगली लगता है, लेकिन डेटा भंडारण प्रारूप आपको डेटा का हिस्सा पुनर्प्राप्त करने की अनुमति देता है। NTSC क्षेत्र के मामले में, यह त्रुटि सुधार प्रणाली की सीमाओं को पूरा करता है।

सेवा लाइनों के उपयोग के कारण, आप समग्र आउटपुट के साथ वीडियो कार्ड नहीं ले सकते हैं और पीसीएम प्रोसेसर प्ले कर सकते हैं। यदि यह शीर्षक किसी विशिष्ट पंक्ति में नहीं मिलता है, तो लोहा पूरे फ्रेम की उपेक्षा करेगा। इस विषय पर कुछ विचार हैं, लेकिन इस बारे में किसी तरह बाद में।

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

इस बिंदु पर हमें वीडियो कैप्चर उपकरणों की सुविधाओं से जुड़ी तीन कठिनाइयाँ आती हैं। आप एक छवि को दूर करने के लिए एक स्थिर सीमा का उपयोग नहीं कर सकते। लेकिन OpenCV खुद इस समस्या को हल करता है, जिसकी मदद से हमें एक जादू की रेखा के साथ काफी सभ्य परिणाम मिलता है।

threshold(greyFrame, fullFrame, 0, 255, THRESH_BINARY + THRESH_OTSU);

दूसरी समस्या है, अचानक, रंग। पीसीएम प्रोसेसर वीडियो सिग्नल के रंग घटक का उपयोग नहीं करते हैं, लेकिन कैप्चर कार्ड शोर से इसे निकालने की कोशिश कर सकते हैं। यह सबसे आसान EasyCAP पर विशेष रूप से ध्यान देने योग्य है। यह बिनाराइजेशन के परिणाम को थोड़ा खराब कर सकता है, इसलिए पहले आपको छवि को ग्रे के रंगों में बदलने की आवश्यकता है।

cvtColor(srcFrame, greyFrame, CV_BGR2GRAY);

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

EasyCAP वीडियो कैसेट से कब्जा

रंग स्पॉट और डेटा बिट्स की चमक का एक उच्च स्तर छवि में देखा जा सकता है जब मैजवेल प्रो कैप्चर एआईओ पर कब्जा किए गए लेख के पहले चित्रण के साथ तुलना की जाती है।

यह याद रखने का समय है कि सिग्नल किस पर संग्रहीत है। वीएचएस टेप रिकार्डर विशेष गुणवत्ता में भिन्न नहीं होते हैं, क्योंकि यह एक घरेलू प्रारूप है। फ्रेम और लाइन सिंक दालों अकेले स्थिर संचालन के लिए पर्याप्त नहीं हैं। इसलिए, वीडियो सिग्नल में अतिरिक्त सिंक्रनाइज़ेशन निशान जोड़े जाते हैं। शुरुआत में प्रत्येक पंक्ति में दो सफ़ेद और दो काले "पिक्सल" को बदलने का क्रम है, और पंक्ति के अंत में अधिकतम चमक वाला एक छोटा क्षेत्र है, जो एजीसी को समायोजित करता है। डेटा बिट्स में स्वयं 1 के लिए अधिकतम 60% की चमक और 0. के लिए 20% से कम है। यहां एक उदाहरण है कि ये लेबल क्यों आवश्यक हैं: फ्रेम की शुरुआत और अंत में कैसेट से चित्र का उलटा।

फ्रेम की शुरुआत में मोड़

तुल्यकालन के निशान के अनुसार, प्रत्येक पंक्ति में एक डेटा क्षेत्र है। अगला, आपको बिट चौड़ाई (प्रति पंक्ति केवल 128 बिट) निर्धारित करने की आवश्यकता है और छवि रेखा को 16 बाइट्स तक सिकोड़ें।

आइए डेटा प्रारूप पर करीब से नज़र डालें। लाइन में 14 बिट्स के 8 ब्लॉक होते हैं, जिनमें से प्रत्येक में DAC (नमूने) और त्रुटि सुधार कोड के लिए मान होते हैं, और एक चेकसम (CRC-16 / CCITT-FALSE) के साथ एक ब्लॉक होता है। चेकसम द्वारा, गिराई गई रेखाएं निर्धारित की जाती हैं, जिसमें डेटा पुनर्प्राप्त करने का प्रयास करेगा। प्रत्येक पंक्ति में बाएँ और दाएँ चैनल के लिए तीन नमूने होते हैं, एक समता खंड P (सभी नमूनों का x) और एक रहस्यमय Q. क्रम निम्नानुसार है: L0, R0, L1, R1, L2, R2, P, Q। आज, Q सुधार संभव नहीं है। हम इस सामग्री को अभी तक पूरी तरह से समझ नहीं पाए हैं और कार्यान्वयन के लिए डीबगिंग की आवश्यकता है।

पंक्तियों में डेटा ऑर्डर

यदि आप "जैसा है" का उपयोग करते हैं, तो एक टूटी हुई रेखा का अर्थ है एक ही बार में तीन नमूनों का नुकसान, जो धातु की अंगूठी पर कान पर ध्यान देने योग्य होगा। लेकिन दीदा होशियार थीं और उन्होंने सीढ़ी से डेटा रिकॉर्ड करने का फैसला किया। एक लाइन से केवल एक ब्लॉक लिया जाता है। अगला एक मामूली ऑफसेट के साथ लिया जाता है। सीढ़ियों के कदम में 16 लाइनें हैं। ब्लॉक एल 0 को 1 लाइन से लिया गया है। पंक्ति 17 के साथ R0 को ब्लॉक करें ... इस प्रकार, समता ब्लॉक का उपयोग करके, आप एक पंक्ति में खोए गए 16 पंक्तियों से डेटा पुनर्प्राप्त कर सकते हैं। लेकिन केवल अगर सीढ़ी के अंदर एक त्रुटि है। ब्लॉक क्यू आपको दो त्रुटियों को ठीक करने की अनुमति देता है, जो 32 खो लाइनों तक पुनर्स्थापित करता है।

छवि

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

आर2=एल0आर0एल1आर1एल2पी


नतीजतन, हमें प्रारंभिक मूल्य मिलता है। यदि दो त्रुटियां हैं, तो क्यू ब्लॉक का उपयोग करके पुनर्स्थापित करने का प्रयास किया जाता है। यदि उनमें से अधिक हैं, तो इसके साथ कुछ भी नहीं किया जाना चाहिए, केवल पीटा नमूनों के मूल्यों को प्रक्षेपित करने या उन्हें रीसेट करने के अलावा।

क्षेत्र से गुजरने की प्रक्रिया को छोटे जीआईएफ एनीमेशन पर देखा जा सकता है।

छवि

और इसलिए हम सीढ़ी के अंतिम चरण तक मैदान के अंत तक आराम करते हैं। हार्डवेयर पीसीएम में एक परिपत्र बफर है। जैसे ही लाइन को संसाधित किया गया है, इसे नए डेटा से भरा जा सकता है। इस प्रकार, अंतिम चरण प्लेबैक को बाधित किए बिना कूदता है।

मैंने काम का थोड़ा अलग सिद्धांत चुना। अब ऐसी मेमोरी सीमा नहीं है, इसलिए बफर का आकार थोड़ा बड़ा है: फ़ील्ड ऊंचाई और सीढ़ी ऊंचाई। जैसे ही सीढ़ी बफर के अंत तक पहुंचती है, अंतिम 111 लाइनों को शुरुआत में स्थानांतरित कर दिया जाता है, और नए डेटा के साथ भरना पहले से ही 112 लाइनों के साथ होता है। बेशक, हमें यह नहीं भूलना चाहिए कि कैप्चर कार्ड के साथ काम करते समय हम कुछ लाइनों को खो देते हैं। इसलिए, सीआरसी त्रुटियों द्वारा आगे की वसूली के लिए उन्हें चिह्नित करने के लिए शून्य के साथ लापता लाइनों को भरना सुनिश्चित करें।

पीसीएम मूल रूप से 14-बिट था। लेकिन समय के साथ, जब वीएचएस वीडियो रिकॉर्डर ने तस्वीर की गुणवत्ता में सुधार किया, तो निर्माताओं ने 16 बिट्स पर स्विच किया, बिना पिछड़े संगतता के बारे में भूल गए।
3. 14- PCM 12 . ( ).
16-बिट पीसीएम में, कोई क्यू ब्लॉक बिल्कुल नहीं है, इसलिए "क्यू सुधार संभव नहीं है" शीर्षक के क्षेत्र में एक विशेष चिह्न है। इसके बजाय, नमूने और पी के 2 लापता बिट्स एकत्र किए गए थे। इस मामले में, सीढ़ी की ऊंचाई 8 कदम नहीं है, लेकिन केवल 7, क्योंकि ब्लॉक के लापता बिट्स अपनी लाइन पर संग्रहीत किए जाते हैं, और अलग से नहीं। यह समझना कि 16-बिट पीसीएम कैसे काम करता है, 100 हर्ट्ज की आवृत्ति और अधिकतम आयाम के साथ एक मेन्डर्स को कैप्चर करने के उदाहरण का उपयोग करना काफी सरल है। सब कुछ तुरंत जगह में गिर जाता है।

14-बिट और 16-बिट पीसीएम की तुलना

अब परिणाम को एक wav फ़ाइल में सहेजने का समय है। Libsndfile पुस्तकालय इसमें मदद करेगा। हालांकि ... पीसीएम फाइलों को सहेजता नहीं है, लेकिन तुरंत इसे खेलता है। यहां आप इस तरह के एक शांत चीज़ के बारे में याद कर सकते हैं, जैसे कि पाइप। जब एक प्रोग्राम का आउटपुट दूसरे के लिए इनपुट होता है। हम बस गंतव्य के रूप में स्टडआउट निर्दिष्ट करते हैं और स्ट्रीम को ffplay प्रोग्राम पर पुनर्निर्देशित करते हैं।

./ggg -i easycap.avi -o - | ffplay -

अब आप बूंदों का आनंद ले सकते हैं और उनसे छुटकारा पाने के लिए कोड को डिबग करना जारी रख सकते हैं ...

आज के लिए बस इतना ही। आप GitHub: https://github.com/walhi/pcm पर पेज से डिकोडर स्रोत डाउनलोड कर सकते हैं एक जनरेटर भी है। किसी दिन मैं इसे फोब्बर के लिए एक प्लगइन के रूप में डिजाइन करूंगा ...

क्यू ब्लॉक पर रिकवरी खत्म करने के लिए सक्रिय काम चल रहा है, इसलिए कम या ज्यादा सही काम के लिए, आपको कमिट्स पर कूदना होगा। लेकिन ये ट्राइफल्स हैं। जो लोग खेलना चाहते हैं वे कैप्चर उदाहरण डाउनलोड कर सकते हैं

All Articles