इस बारे में चिकोटी के पास एक पोस्ट है। वे बताते हैं कि उन्होंने कई कारणों से अपने स्वयं के कार्यक्रम का उपयोग करने का निर्णय लिया; उनमें से एक यह था कि ffmpeg आपको अलग-अलग थ्रेड्स में अलग-अलग x264 इंस्टेंस चलाने नहीं देता, बल्कि अगले आउटपुट पर जाने से पहले सभी निर्दिष्ट थ्रेड्स को एक आउटपुट में एक फ्रेम में दे देता है।
यदि आप वास्तविक समय की स्ट्रीमिंग नहीं कर रहे हैं, तो आपके पास अधिक लक्जरी हैं। 'सही' तरीका संभवत: -जी के साथ निर्दिष्ट जीओपी आकार के साथ एक रिज़ॉल्यूशन पर एनकोड करना है, और फिर उसी स्थान पर कीफ़ोर्स को मजबूर करने वाले अन्य रिज़ॉल्यूशन को एनकोड करना है।
यदि आप ऐसा करना चाहते हैं, तो आप keyf टाइम्स को प्राप्त करने के लिए ffprobe का उपयोग कर सकते हैं और फिर एक ffmpeg कमांड में परिवर्तित करने के लिए एक शेल स्क्रिप्ट या वास्तविक प्रोग्रामिंग भाषा का उपयोग कर सकते हैं।
लेकिन अधिकांश सामग्री के लिए, हर 5 सेकंड में एक कीफ्रेम और हर 5 सेकंड में दो कीफ्रेम होने के बीच बहुत कम अंतर होता है (एक मजबूर और एक दर्शनीय स्थल से)। यह पी-फ्रेम और बी-फ्रेम के आकार के औसत आई-फ्रेम आकार के बारे में है। यदि आप सामान्य सेटिंग्स के साथ x264 का उपयोग करते हैं (केवल यही कारण है कि मुझे लगता है कि आपको प्रभावित करने के लिए कुछ भी करना चाहिए यदि आप सेट -मिन करते हैं, तो x264 को आसान सामग्री पर बिटरेट का उपयोग करने से रोकने के खराब तरीके के रूप में; यह सभी फ्रेम प्रकारों को एक ही मूल्य तक सीमित करता है; , मुझे लगता है) और 46 kB के I- फ्रेम औसत आकार, पी-फ्रेम 24 kB, B- फ्रेम 17 kB (पी-फ्रेम के रूप में लगातार आधे) जैसे परिणाम प्राप्त करें, फिर 30 सेकंड में हर सेकंड एक अतिरिक्त I- फ्रेम करें फ़ाइल आकार में केवल 3% की वृद्धि है। H264 और h263 के बीच का अंतर 3% की कमी से बना हो सकता है, लेकिन एक भी बहुत महत्वपूर्ण नहीं है।
अन्य प्रकार की सामग्री पर, फ़्रेम का आकार अलग होगा। निष्पक्ष होने के लिए, यह अस्थायी जटिलता और स्थानिक जटिलता के बारे में है, इसलिए यह केवल आसान सामग्री बनाम कठिन सामग्री नहीं है। लेकिन आम तौर पर, स्ट्रीमिंग वीडियो साइटों में एक बिटरेट सीमा होती है, और अपेक्षाकृत बड़े आई-फ़्रेम के साथ सामग्री आसान सामग्री होती है जिसे उच्च गुणवत्ता पर एन्कोड किया जाएगा चाहे कितना भी अतिरिक्त कीफ़्रेम जोड़ा जाए। यह बेकार है, लेकिन इस कचरे पर आमतौर पर ध्यान नहीं दिया जाएगा। सबसे बेकार मामला शायद एक वीडियो है जो एक गाने के साथ बस एक स्थिर छवि है, जहां प्रत्येक कीफ़्रेम बिल्कुल समान है।
एक बात मुझे यकीन नहीं है कि कैसे मजबूर keyframes दर सीमक के साथ बातचीत -maxrate और -bufsize के साथ सेट है। मुझे लगता है कि यहां तक कि YouTube को भी हाल ही में लगातार गुणवत्ता देने के लिए बफर सेटिंग्स को सही ढंग से कॉन्फ़िगर करने में समस्याएं हुई हैं। यदि आप औसत बिटरेट सेटिंग्स का उपयोग कर रहे हैं, जैसा कि कुछ साइटों द्वारा देखा जा सकता है (क्योंकि आप हेडर / मूव एटम में x264 के विकल्पों का निरीक्षण कर सकते हैं। हेक्स संपादक के साथ) तो बफर मॉडल कोई समस्या नहीं है, लेकिन यदि आप उपयोगकर्ता-जनित सामग्री की सेवा, औसत बिटरेट उपयोगकर्ताओं को अपने वीडियो के अंत में एक काली स्क्रीन जोड़ने के लिए प्रोत्साहित करता है।
Ffmpeg का -g विकल्प, या आपके द्वारा उपयोग किया जाने वाला कोई अन्य एनकोडर विकल्प, एन्कोडर-विशिष्ट विकल्प पर मैप किया जाता है। तो '-x264-params keyint = GOPSIZE' '-g GOPSIZE' के बराबर है।
दृश्य पहचान का उपयोग करने के साथ एक समस्या यह है कि यदि आप जो भी कारण के लिए विशिष्ट संख्या के पास keyframes पसंद करते हैं। यदि आप प्रत्येक 5 सेकंड में keyframes निर्दिष्ट करते हैं और दृश्य पहचान का उपयोग करते हैं, और 4.5 पर एक दृश्य परिवर्तन होता है, तो इसका पता लगाया जाना चाहिए, लेकिन फिर अगला कीफ़्रेम 9.5 पर होगा। अगर समय इसी तरह बढ़ता रहा, तो आप 40, 45, 50, 55 के बजाय 42.5, 47.5, 52.5 आदि पर कीफ्रेम के साथ समाप्त हो सकते हैं। इसके विपरीत, यदि 5.5 पर कोई दृश्य परिवर्तन होता है, तो वहाँ होगा ५ और ५.५ पर एक कीफ्रेम एक दूसरे के लिए बहुत जल्दी होगा। Ffmpeg आपको यह निर्दिष्ट नहीं करने देता है कि "अगर अगले 30 फ्रेम के भीतर कोई दृश्य परिवर्तन नहीं हुआ है तो यहां एक कीफ़्रेम बनाएं।" कोई है जो C को समझता है, हालांकि वह विकल्प जोड़ सकता है।
चर-फ्रेम-दर वीडियो के लिए, जब आप ट्विच की तरह लाइव-स्ट्रीमिंग नहीं करते हैं, तो आपको स्थायी फ्रेम को स्थायी फ्रेम-दर में परिवर्तित किए बिना दृश्य परिवर्तनों का उपयोग करने में सक्षम होना चाहिए। यदि आप ffmpeg में 'सेलेक्ट' फ़िल्टर का उपयोग करते हैं और एक्सप्रेशन में 'सीन' कंटीन्यू का उपयोग करते हैं, तो डिबग आउटपुट (-v डीबग या एन्कोडिंग करते समय कई बार '+' दबाएं) सीन चेंज नंबर दिखाता है। यह शायद इससे अलग है, और उतना उपयोगी नहीं है, जितना कि x264 द्वारा उपयोग किया गया, लेकिन यह अभी भी उपयोगी हो सकता है।
प्रक्रिया, तब, शायद एक वीडियो परीक्षण करना होगा जो केवल की-फ़्रेम परिवर्तनों के लिए है, लेकिन शायद 2-पास का उपयोग करते हुए दर नियंत्रण डेटा के लिए उपयोग किया जा सकता है। (यह सुनिश्चित नहीं है कि उत्पन्न डेटा विभिन्न रिज़ॉल्यूशन और सेटिंग्स के लिए सभी उपयोगी है; मैक्रोब्लॉक-ट्री डेटा नहीं होगा।) इसे निरंतर-फ़्रैमरेट वीडियो में कनवर्ट करें, लेकिन जब आप तय करते हैं तो फ्रैमरेट को रोकते समय आउटपुट के बारे में इस बग को देखें। अन्य उद्देश्यों के लिए एफपीएस फ़िल्टर का उपयोग करें। अपने इच्छित कीफ़्रेम और GOP सेटिंग्स के साथ x264 के माध्यम से इसे चलाएं।
तो बस मूल चर फ्रेम दर वीडियो के साथ इन कीफ़्रेम समय का उपयोग करें।
यदि आप फ़्रेम के बीच 20-सेकंड के अंतराल के साथ पूरी तरह से पागल उपयोगकर्ता-उत्पन्न सामग्री की अनुमति देते हैं, तो चर फ्रेम-दर एन्कोड के लिए, आप आउटपुट को विभाजित कर सकते हैं, एफपीएस फ़िल्टर का उपयोग कर सकते हैं, किसी भी तरह चुनिंदा फ़िल्टर का उपयोग करें (शायद वास्तव में लंबी अभिव्यक्ति का निर्माण करें हर कीफ़्रेम समय) ... या हो सकता है कि आप परीक्षण वीडियो को इनपुट के रूप में उपयोग कर सकते हैं और या तो केवल कीफ़्रेम को डिकोड कर सकते हैं, यदि वह ffmpeg विकल्प काम करता है, या कीफ़्रेम का चयन करने के लिए चयन फ़िल्टर का उपयोग करें। फिर इसे सही आकार में स्केल करें (इसके लिए एक स्केल 2 एसआर फिल्टर भी है) और इस पर मूल वीडियो ओवरले करें। फिर इन वीडियो को मूल वीडियो के साथ मजबूर करने के लिए संयोजित करने के लिए इंटरलेव फ़िल्टर का उपयोग करें। यदि यह दो तख्ते में परिणत होता है, जो 0.001 सेकेंड के अलावा होता है, जो कि इंटरलेव फिल्टर को रोकता नहीं है, तो इस समस्या को दूसरे चुनिंदा फिल्टर के साथ स्वयं संबोधित करें। इंटरलेव फिल्टर के लिए फ्रेम बफर सीमा से निपटना यहां की मुख्य समस्या हो सकती है। ये सभी काम कर सकते हैं: सघन धारा (पंद्रो फिल्टर?) को बफर करने के लिए किसी प्रकार के फिल्टर का उपयोग करें; इनपुट फ़ाइल को कई बार देखें ताकि यह एक से अधिक बार डिकोड हो जाए और फ़्रेम को संग्रहीत न करना पड़े; 'स्ट्रीमसेलेक्ट' फिल्टर का उपयोग करें, जो मैंने कभी नहीं किया है, बिल्कुल केफ्रेम के समय पर; अपने डिफ़ॉल्ट व्यवहार को बदलकर या एक फ्रेम छोड़ने के बजाय बफर में सबसे पुराने फ्रेम को आउटपुट करने के लिए एक विकल्प जोड़कर इंटरलेव फ़िल्टर को बेहतर बनाएं। जो मैंने कभी नहीं किया है, बिल्कुल केफ्रेम के समय पर; अपने डिफ़ॉल्ट व्यवहार को बदलकर या एक फ्रेम छोड़ने के बजाय बफर में सबसे पुराने फ्रेम को आउटपुट करने के लिए एक विकल्प जोड़कर इंटरलेव फ़िल्टर को बेहतर बनाएं। जो मैंने कभी नहीं किया है, बिल्कुल केफ्रेम के समय पर; अपने डिफ़ॉल्ट व्यवहार को बदलकर या एक फ्रेम छोड़ने के बजाय बफर में सबसे पुराने फ्रेम को आउटपुट करने के लिए एक विकल्प जोड़कर इंटरलेव फ़िल्टर को बेहतर बनाएं।