2015-08-15 7 views
6

FFmpeg Bitstream Filters Documentation की सावधानीपूर्वक पढ़ने के बाद, मुझे अभी भी समझ में नहीं आता कि वे वास्तव में क्या हैं।ffmpeg में बिटस्ट्रीम फ़िल्टर क्या हैं?

दस्तावेज़ कहा गया है कि फिल्टर:

डिकोडिंग बिना प्रदर्शन बिटस्ट्रीम स्तर संशोधनों करता

किसी को भी आगे समझा सकते हैं कि मेरे पास? एक उपयोग केस चीजों को स्पष्ट रूप से स्पष्ट करेगा। इसके अलावा, स्पष्ट रूप से अलग-अलग फ़िल्टर हैं। वे अलग कैसे होते हैं?

+0

मैंने डाउनवोट नहीं किया था, लेकिन शायद यह वही व्यक्ति था जिसने इस साइट के लिए ऑफ-विषय होने के लिए सवाल बंद करने के लिए वोट दिया (प्रोग्रामिंग से संबंधित नहीं)। – mark4o

उत्तर

19

उदाहरण के द्वारा मुझे समझाएं। एफएफएमपीईजी वीडियो डिकोडर्स आम तौर पर एक वीडियो फ्रेम प्रति कॉल को avcodec_decode_video2 में परिवर्तित करके काम करते हैं। तो इनपुट बिटस्ट्रीम डेटा के लायक "एक छवि" होने की उम्मीद है। आइए एक फ़ाइल के लिए छवियों (डिस्क के बाइट्स की सरणी) से जाने के इस मुद्दे पर विचार करें।

के लिए "कच्चे" (annexb) H264 (.H264/.bin/.264 फ़ाइलें), व्यक्तिगत एनएएल इकाई डेटा (एसपीएस/पी पी एस बिटस्ट्रीम या CABAC एन्कोड फ्रेम डेटा हेडर) एनएएल इकाइयों के एक दृश्य में concatenated है , प्रारंभ कोड (00 00 01 एक्सएक्स) के बीच, जहां एक्सएक्स नल इकाई प्रकार है। (नाल डेटा को 00 00 01 डेटा रखने से रोकने के लिए, यह आरबीएसपी बच निकला है।) तो h264 frame parser बस प्रारंभ कोड मार्कर पर फ़ाइल काट सकता है। वे 00 00 01 के साथ और 00 00 01 के अगले अवसर को छोड़कर लगातार पैकेट की खोज करते हैं। फिर वे नल इकाई प्रकार और स्लाइस हेडर को पार्स करते हैं ताकि यह पता चल सके कि प्रत्येक पैकेट किस फ्रेम से संबंधित है, और नाल का एक सेट वापस कर देता है h264 decoder में इनपुट के रूप में एक फ्रेम बनाने वाली इकाइयां।

.mp4 फ़ाइलों में H264 डेटा अलग है, हालांकि। आप कल्पना कर सकते हैं कि 00 00 01 स्टार्ट कोड को अनावश्यक माना जा सकता है यदि muxing प्रारूप में पहले से ही लंबाई मार्कर हैं, जैसा कि mp4 के मामले में है। तो, प्रति फ्रेम 3 बाइट्स को बचाने के लिए, वे 00 00 01 उपसर्ग को हटा दें। उन्होंने पहले फ्रेम से पहले इसे प्रस्तुत करने के बजाय फ़ाइल शीर्षलेख में पीपीएस/एसपीएस भी लगाया, और इन्हें 00 00 01 उपसर्ग भी याद आते हैं। इसलिए, अगर मैं इसे h264 डीकोडर में इनपुट करना चाहता था, जो सभी नल इकाइयों के उपसर्गों की अपेक्षा करता है, तो यह काम नहीं करेगा। h264_mp4toannexb बिटस्ट्रीम फ़िल्टर फ़ाइल हेडर के निकाले गए हिस्सों में पीपीएस/एसपीएस की पहचान करके इसे ठीक करता है (ffmpeg इस "extradata" को कॉल करता है), इसे और प्रत्येक नाल को प्रारंभ कोड के साथ अलग-अलग फ्रेम पैकेट से प्रीपेड करना और उन्हें पहले एक साथ जोड़ना उन्हें h264 डीकोडर में इनपुट करना।

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

अन्य मामलों में जहां इस तरह के "बिटस्ट्रीम तोड़ मरोड़" मदद डिकोडर सरल और वर्दी रखने के लिए, लेकिन हम सभी फाइलों वेरिएंट कि जंगली में मौजूद होने का समर्थन करने के लिए अनुमति देते हैं:

  • MPEG4 (Divx) b frame unpacking (प्राप्त करने के लिए बी आईबीपी जैसे आईपीपी के रूप में कोड किए गए अनुक्रम अनुक्रम, और टाइमस्टैम्प को सही करने के लिए, लोग बी-फ्रेम पैकिंग की इस अवधारणा के साथ आए, जहां आईबीपी/आईपीबी फ्रेम में पैक किया गया है I-(PB)-(), यानी तीसरा पैकेट खाली है और दूसरा दो फ्रेम हैं। इसका मतलब है कि डीकोडिंग चरण में पी और बी फ्रेम से जुड़े टाइमस्टैम्प सही है।इसका मतलब यह भी है कि आपके पास एक पैकेट के लिए दो फ्रेम इनपुट इनपुट डेटा है, जो ffmpeg की एक-फ्रेम-इन-वन-फ्रेम अवधारणा का उल्लंघन करता है, इसलिए हमने पैकेट को दो में विभाजित करने के लिए एक बीएसएफ लिखा - मार्कर को हटाने के साथ-साथ कहते हैं कि पैकेट में दो फ्रेम होते हैं, इसलिए एक बीएसएफ और एक पार्सर नहीं - इसे डीकोडर में इनपुट करने से पहले। अभ्यास में, यह फ्रेम multithreading के साथ अन्यथा मुश्किल समस्या हल करता है। वीपी 9 वही काम करता है (जिसे सुपरफ्रेम कहा जाता है), लेकिन parser में फ़्रेम को विभाजित करता है, इसलिए पार्सर/बीएसएफ विभाजन हमेशा सैद्धांतिक रूप से सही नहीं होता है; शायद VP9 के aac के लिए एक बीएसएफ बुलाया जाना चाहिए)
  • HEVC के रूप में ऊपर रूपांतरण (एक ही कहानी annexb को mp4, लेकिन HEVC के लिए)
  • aac adts to asc रूपांतरण (यह मूल रूप से h264/HEVC annexb बनाम mp4 के रूप में ही है, लेकिन ऑडियो)
+1

ध्यान दें कि बिटस्ट्रीम फ़िल्टर और पार्सर नियमित वीडियो और ऑडियो फ़िल्टर से अलग होते हैं, जिसमें वे एन्कोडेड (सामान्य रूप से संपीड़ित) बिटस्ट्रीम पर काम करते हैं, जबकि नियमित वीडियो और ऑडियो फ़िल्टर असंपीड़ित वीडियो और ऑडियो पर काम करते हैं। – mark4o

+0

मार्क 4o क्या कह रहा है, ध्यान दें कि ffmpeg चलाते समय और स्ट्रीमकॉपी नहीं कर रहे हैं (यानी वास्तव में वीडियो ट्रांसकोडिंग) बिटस्ट्रीम फ़िल्टर पुनः-एन्कोड के बाद लागू होते हैं। – bhh1988