वीडियो रिकॉर्ड करते समय ffmpeg द्वारा CPU / मेमोरी का उपयोग कैसे कम करें


13

मैं Xvfb डिस्प्ले से वीडियो स्क्रीन कैप्चर बनाने के लिए FFmpeg का उपयोग करता हूं।

वर्तमान में मैं इसके साथ आह्वान करता हूं:

ffmpeg -y -r 15 -g 600 -s 1280x1024x24 -f x11grab -i :100 -vcodec libx264 /tmp/video.mov

जैसा कि मैंने लगभग 5 Xvfb सत्रों से वीडियो रिकॉर्ड किया है मेरा सीपीयू उपयोग बहुत अधिक है और इसके कारण पिछड़ रहे हैं। इसके अलावा मेमोरी उपयोग प्रत्येक ffmpeg प्रक्रियाओं के लिए लगभग 300 एमबी है।

वीडियो स्क्रीन कैप्चर बनाते समय कंप्यूटर संसाधनों के उपयोग (विशेष रूप से सीपीयू और मेमोरी) को कम करने के लिए मुझे ffmpeg के लिए कौन से मापदंडों का उपयोग करना चाहिए?

जवाबों:


17

1. पहले दोषरहित RGB आउटपुट करें

ffmpeg -y -framerate 25 -video_size 1280x1024 -f x11grab -i :0.0 -c:v libx264rgb \
-crf 0 -preset ultrafast temp.mp4
  • इनपुट RGB है, इसलिए एनकोडर libx264rgb का उपयोग करके YUV रूपांतरण के लिए संभावित धीमी RGB से बचेंगे यदि आप सादे libx264 का उपयोग करते हैं।

  • यह सबसे तेज x264 एन्कोडिंग प्रीसेट का उपयोग करता है: अल्ट्राफास्ट।

  • -crf 0उपयोग होने के कारण उत्पादन दोषरहित होगा ।

2. इसके बाद इसे फिर से एनकोड करें

पहले कमांड से आउटपुट बहुत बड़ा होगा, और अधिकांश गूंगे खिलाड़ी RGB H.264 को संभाल नहीं सकते हैं ताकि आप इसे फिर से एनकोड कर सकें:

ffmpeg -i temp.mp4 -c:v libx264 -crf 23 -preset medium -vf format=yuv420p out.mp4
  • आप -crfआउटपुट गुणवत्ता को नियंत्रित करने के लिए मूल्य के साथ प्रयोग कर सकते हैं । एक विषयगत रूप से सीमा की सीमा 18-28 है, जहां 18 नेत्रहीन रूप से दोषरहित है या लगभग ऐसा ही है। डिफ़ॉल्ट 23 है।

  • धीमी पूर्व निर्धारित आप के लिए धैर्य का उपयोग करें: ultrafast, superfast, veryfast, faster, fast, medium, slow, slower, veryslow। डिफ़ॉल्ट है medium

  • मैंने -vf format=yuv420pयह सुनिश्चित करने के लिए जोड़ा कि QuickTime और Windows Media Player जैसे डंबल प्लेयर के साथ आउटपुट काम करता है। यदि आप इसे YouTube पर अपलोड कर रहे हैं या केवल VLC, mpv, MPlayer, या किसी अन्य FFmpeg आधारित खिलाड़ी पर खेल रहे हैं, तो आप इसे छोड़ सकते हैं।

और देखें


मैं नॉन-डिफॉल्ट डिस्प्ले से वीडियो कैप्चर करता हूं (यह Xvfb है) इसलिए यह किसी भी संख्या में हो सकता है
आंद्रेई बोटालोव

@AndreyBotalov क्या आपने दोषरहित विधि की कोशिश की? क्या इसने आपके लिए बेहतर प्रदर्शन किया?
लल्गन

1
वर्तमान में मैं पैरामीटर के ffmpegसाथ आह्वान करता हूं -preset superfast(मैंने कोशिश नहीं की है -crf)। यह ऐसे मामले में कम संसाधन लेता है और अच्छे आकार के वीडियो तैयार करता है।
आंद्रेई बोटालोव

@AndreyBotalov -crf 23का उपयोग डिफ़ॉल्ट रूप से किया जाता है यदि आप एक मूल्य घोषित नहीं करते हैं, लेकिन वैसे भी अगर superfastआपके लिए पर्याप्त है तो शायद समस्या हल हो गई है।
21

1
आप h264_nvenc (nvidia) या h264_qsv (आधुनिक इंटेल सीपीयू) के माध्यम से हार्डवेयर एन्कोडिंग का भी प्रयास कर सकते हैं। यह आपके CPU से समर्पित h264 हार्डवेयर में एन्कोडिंग का भार स्थानांतरित कर देगा।
केएन

4

विभिन्न ffmpeg विकल्पों का उपयोग करने पर ध्यान केंद्रित करना बेहतर होता है जो कम संसाधनों का उपयोग करने वाले तरीके से समान परिणाम प्राप्त करेंगे। उस ने कहा, कम संसाधनों का उपयोग करने के तरीके हैं यदि आपको वास्तव में ffmpeg के साथ एक विशेष चीज को पूरा करने की आवश्यकता है और यह बहुत सारे संसाधनों का उपयोग कर रहा है।

आप ffmpegCPU प्रक्रिया की प्राथमिकता को कम कर सकते हैं:

  • टर्मिनल विधि:nice प्रक्रिया की प्राथमिकता को बदलने के लिए कमांड का उपयोग करें nice -n 8 ffmpeg -y -r 15 -g 600 -s 1280x1024x24 -f x11grab -i :100 -vcodec libx264 /tmp/video.mov:। लिनक्स में, प्राथमिकता संख्या ( niceकमांड प्रारूप है nice -n <priority> <command>) -20 से 20 तक होती है। पूर्णांक जितना अधिक होता है, प्राथमिकता उतनी ही कम होती है; न्यूट्रल है 0. यदि आप मेरे द्वारा दिए गए कमांड का उपयोग करते हैं और इसे 8 पर सेट करते हैं, तो सीपीयू प्रक्रिया को कम समय देगा, जो "पावर" की तरह लगता है। यदि यह संख्या बहुत अधिक है या दो कम है, तो निश्चित रूप से, आप इसे बदल सकते हैं।
  • GUI विधि: यह अनुशंसित नहीं है क्योंकि यह आपको सटीक संख्या पर कम नियंत्रण देता है और प्रक्रिया शुरू होते ही यह प्रभावी नहीं होता है। हालांकि, यह अधिक व्यापक है। ffmpegरनिंग के साथ , सिस्टम मॉनिटर खोलें। नीचे दी गई प्रक्रिया पर स्क्रॉल ffmpegकरें, इसे चुनने के लिए बाएं क्लिक करें, राइट क्लिक करें, और प्राथमिकता को "कम" या "बहुत कम" पर सेट करें।

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

जानने के लिए कुछ उपयोगी बातें:

Cgroups के ज्ञान का उपयोग करना, आप बहुत सारी मजेदार चीजें कर सकते हैं जैसे कि एक प्रक्रिया के स्वपन को नियंत्रित करना ।


2
अगर मुझे सही तरीके से समझ में आ रहा है कि कम प्राथमिकता वाली कतार में ffmpeg लगाना लॅग्स के साथ वीडियो का निर्माण करेगा जो कि अवांछित है।
आंद्रेई बोटालोव

1
हम्म ... मैं यह कहते हुए ऑनलाइन कुछ भी नहीं देखता कि ... क्या आपके पास कोई ऐसा स्रोत है जो इंगित करता है? (यदि नहीं, तो यह एक बग होना चाहिए)।
रिचर्ड

2
अगर मैं सही ढंग से समझता हूं कि प्राथमिकता कम है तो इसका मतलब है कि ffmpeg के पास अब की तुलना में कम प्रोसेसर समय होगा। लेकिन प्रोसेसर लगभग 100% भरा हुआ है, इसलिए मुझे लगता है कि पुनर्मूल्यांकन मदद नहीं करेगा
आंद्रेई बोटालोव

1
यह प्रक्रिया के CPU उपयोग को सीमित करने के लिए डिज़ाइन किया गया है, इसलिए यदि आपका CPU 100% पर चल रहा है, तो इसे संभालने का एक आसान समय होगा।
रिचर्ड

4
मैंने इसे -1 किया है, क्योंकि आप प्राथमिकता को कैसे बदलते हैं, इससे कोई फर्क नहीं पड़ता, यह केवल बदतर बना देगा। कम प्राथमिकता निर्धारित करने से ffmpeg के लिए CPU समय कम हो जाएगा, जिसके परिणामस्वरूप अधिक गिरा हुआ फ्रेम या, प्राथमिकता बढ़ाकर, यह सिस्टम पर अन्य प्रक्रियाओं को और भी धीमा कर देगा। दोनों परिणाम अवांछित हैं।
gertvdijk 18

0

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


"वास्तविक हड़पने वाले उपकरणों के साथ उपयोग नहीं किया जाना चाहिए" जैसे कि x11grab।
ललगन
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.