बुनियादी सवाल: दोषरहित तरीके से वैज्ञानिक वीडियो डेटा संग्रहीत / संग्रह करने के लिए एक उपयुक्त कोडेक क्या है ?
मैं अपने शोध समूह को एक माइक्रोस्कोप के साथ रिकॉर्ड किए गए कुछ वीडियो को संग्रहीत / संग्रहीत करने में मदद करने की कोशिश कर रहा हूं। ये (ग्रेस्केल) वीडियो असम्पीडित (रॉविडियो) बीजीआर 24 प्रारूप, 660x492 @ 61fps और आमतौर पर लगभग 1 मिनट लंबे होते हैं। मेरी प्रयोगशाला के साथी इन फ़ाइलों के विशाल आकार (प्रत्येक गीगाबाइट्स) के साथ पागल हो रहे हैं। मैंने उन्हें एक दोषरहित कोडेक का उपयोग करके संपीड़ित करने का सुझाव दिया। (यहां दोषरहित की आवश्यकता है क्योंकि वीडियो वैज्ञानिक डेटा हैं; इसलिए कुछ खतरा है कि एक दोषपूर्ण कोडेक खराब / अप्रत्याशित तरीके से सामग्री को बदल सकता है।)
यहाँ मैंने कोशिश की है। सबसे पहले, मैंने इनमें से एक वीडियो के पहले 10 सेकंड को पकड़ा और एफएफएमपीपी का उपयोग करके मोनोक्रोम (कच्चे) प्रारूप में बदल दिया।
ffmpeg -t 10 -i RecordedData.avi -c:v rawvideo -pix_fmt gray raw_gray.mkv
फिर, मैंने -crf 0
परिणामी फ़ाइल को संपीड़ित करने के लिए libx264 के दोषरहित मोड (सेटिंग द्वारा ) का उपयोग करने का प्रयास किया
ffmpeg -i raw-gray.mkv -c:v libx264 -crf 0 -pix_fmt yuv420p -color_range pc x264-yuv420p.mkv
अंत में, मैंने कच्चे और h264 MKV फ़ाइलों से कच्चे YUV डेटा को निकाला और उनकी तुलना की।
ffmpeg -i raw-gray.mkv -c:v rawvideo -pix_fmt gray raw-gray.yuv
ffmpeg -i x264-yuv420p.mkv -c:v rawvideo -pix_fmt gray x264-decompressed.yuv
diff -sq raw-gray.yuv x264-decompressed.yuv
यहां, diff
कमांड रिपोर्ट करती है कि फाइलें अलग-अलग हैं जब मुझे उम्मीद थी कि वे समान होंगे। ऐसा क्यों है? यह सिर्फ कुछ मामूली गोलाई त्रुटि है, या मैं संभवतः H264 (माना दोषरहित) संपीड़न करने के बाद कुछ खो रहा हूं? पिक्सेल प्रारूपों के कुछ रूपांतरण हो रहे हैं ( gray (YUV400) <-> YUV420
), लेकिन रंग (यूवी) चैनल सिर्फ खाली होना चाहिए क्योंकि इनपुट मोनोक्रोम है।
अगर मैं वास्तव में कुछ खो रहा हूं, तो क्या ऐसा कुछ है जो मैं इसे ठीक कर सकता हूं? वहाँ एक और (दोषरहित) कोडेक है जो मेरे डेटा के लिए अधिक उपयुक्त हो सकता है?
अद्यतन 1 : मैंने अधिक विस्तार से असम्पीडित YUV डेटा की सामग्री raw-gray.yuv
(कभी संकुचित नहीं) और x264-decompressed.yuv
(संपीड़ित और फिर विघटित) की तुलना करने के लिए हेक्सडंप का उपयोग किया । यहाँ पहले कुछ बाइट्स हैं।
[raw-gray.yuv]
00000000 4e 50 51 53 53 52 51 50 51 51 50 4f 50 50 50 50
00000010 51 51 50 51 52 53 51 51 52 52 53 53 52 51 51 53
00000020 51 53 54 55 53 51 52 54 53 53 52 50 51 50 52 52
00000030 51 52 51 51 51 52 54 52 52 52 51 51 51 53 57 58
00000040 57 57 55 54 54 52 53 51 51 52 53 55 55 54 53 53
00000050 51 51 52 52 53 52 51 50 50 50 50 51 51 4f 4f 4e
00000060 4c 4d 4e 4d 4f 50 4f 50 51 51 51 52 52 52 52 50
00000070 50 50 52 52 53 55 55 55 57 52 53 53 53 54 56 56
[x264-decompressed.yuv]
00000000 53 55 56 57 57 56 56 55 56 56 55 54 55 55 55 55
00000010 56 56 55 56 56 57 56 56 56 56 57 57 56 56 56 57
00000020 56 57 58 59 57 56 56 58 57 57 56 55 56 55 56 56
00000030 56 56 56 56 56 56 58 56 56 56 56 56 56 57 5b 5c
00000040 5b 5b 59 58 58 56 57 56 56 56 57 59 59 58 57 57
00000050 56 56 56 56 57 56 56 55 55 55 55 56 56 54 54 53
00000060 51 52 53 52 54 55 54 55 56 56 56 56 56 56 56 55
00000070 55 55 56 56 57 59 59 59 5b 56 57 57 57 58 5a 5a
पूर्व फ़ाइल से मान बाद वाले मानों की तुलना में 4 से 5 कम हैं। एक ही फ़ाइल में एक छोटे से खुदाई खुदाई पाया जाता है।
अद्यतन 2 : यदि मैं आरजीबी मोड में libx264 का उपयोग करता हूं, तो मैं निम्नलिखित के अलावा ऊपर के रूप में भी ऐसा करके मूल के साथ सटीक मिलान प्राप्त कर सकता हूं।
ffmpeg -i raw-gray.mkv -c:v libx264rgb -crf 0 -pix_fmt bgr24 x264-bgr24.mkv
ffmpeg -i x264-bgr24.mkv -c:v rawvideo -pix_fmt gray x264-bgr24-decomp.yuv
diff -sq raw-gray.yuv x264-bgr24-decomp.yuv
अंतिम आदेश रिपोर्ट करता है कि दो फाइलें समान हैं । दुर्भाग्य से, x264-bgr24.mkv
लगभग 3 गुना बड़ा है x264-yuv420.mkv
, इसलिए आरजीबी मोड में संपीड़न उतना अच्छा नहीं है।
मैंने कहीं पढ़ा है कि libx264 स्केल वीडियो को कुशलतापूर्वक YUV मोड में कम्प्रेस करता है क्योंकि यह इस तथ्य पर निर्भर करता है कि केवल Y चैनल में कोई वास्तविक जानकारी है (यू और वी चैनल मोनोक्रोम वीडियो के लिए दोनों शून्य हैं)। RGB मोड में, मेरा मानना है कि सभी चैनलों में मोनोक्रोम इनपुट के लिए समान जानकारी होगी। शायद libx264rgb इसका लाभ नहीं उठाता है।
इसलिए, क्या मेरे लिए वीडियो बदलने के बिना YUV मोड का उपयोग करने का एक तरीका है, क्योंकि संपीड़न इस तरह से अधिक कुशल है?
अद्यतन 3 : मैं -pix_fmt yuvj420p
इसके बजाय का उपयोग करके libx264 के साथ समस्या को हल करने में सक्षम था -pix_fmt yuv420p -color_range pc
। फिर, मैं संपीड़न / विघटन के बाद मूल फ़ाइल को पुन: पेश करता हूं। FFmpeg प्रलेखन से, मुझे यह आभास हुआ कि झंडे के ये दो सेट बराबर थे, लेकिन यह स्पष्ट रूप से ऐसा नहीं है। एकमात्र मुद्दा यह है कि मुझे झंडे के बाद के सेट के साथ एक चेतावनी मिलती है [swscaler @ 0x55b56347fe20] deprecated pixel format used, make sure you set the range correctly
:। इसके अलावा, मुझे यह बग रिपोर्ट मिली जो मेरे मुद्दे से संबंधित हो सकती है। मैं स्पष्ट रूप से पदावनत yuvj420p पिक्सेल प्रारूप का उपयोग किए बिना चीजों को करने के "उचित" तरीके के बारे में निश्चित नहीं हूं।
compare
लिए इमेजमैजिक का उपयोग करने के लिए भी ffmpeg का उपयोग कर सकते हैं।
hexdump
) और उस पर फ़र्क चलाकर बेहतर होंगे।diff
केवल यह कहेंगे कि फाइलें कहीं अलग हैं। एक बिट, एक मेगाबाइट, यह सब एक ही है। हेक्स भिन्न का निरीक्षण करके आप बेहतर अनुमान लगा सकते हैं कि क्या हुआ और क्या इसके बारे में चिंता करने की कोई बात है। यह भी जांचें कि ऑपरेशन ने वीडियो की चौड़ाई या ऊंचाई को गोल नहीं किया था (मेरे पास ऐसा हुआ था)।