हमारे पास एक स्ट्रीम है जो क्लाउड (अमेज़ॅन एस 3) में अलग-अलग एच 264 फ्रेम के रूप में संग्रहीत है। फ़्रेम को framexxxxxx.264 के रूप में संग्रहीत किया जाता है, नंबरिंग 0 से शुरू नहीं होती है, बल्कि कुछ बड़ी संख्या से शुरू होती है, जैसे 1000 (इसलिए, frame001000.264)

लक्ष्य एक mp4 क्लिप बनाना है जो या तो टाइमलैप्स हो या निरीक्षण और अन्य जाँच के लिए बहुत तेज़ हो (बहुत तेज़, लगभग 3 घंटे के वीडियो को <20 मिनट तक कम करना), इसके लिए हमें फ़्रेम नंबर (फ़ाइल नाम) को ओवरले करना भी आवश्यक है। फ्रेम ही

सबसे पहले मैं S3 से केवल कीफ्रेम (i-फ्रेम? अभी भी कोडेक्स और सामान के लिए नया) खींचकर एक टाइमलैप्स बना रहा था और उन पर फ़ाइल नाम को ओवरले कर रहा था और png के रूप में सहेज रहा था (जिसकी शायद आवश्यकता नहीं है, लेकिन मैंने यही किया है) ) का उपयोग कर (यह आदेश एक पायथन लिपि के अंदर प्रयोग किया जाता है)

ffmpeg -y -i {h264_name} -vf \"scale=1920:-1, 
drawtext=fontfile=/usr/share/fonts/truetype/ubuntu-font-family/Ubuntu-B.ttf:fontsize=34:text={txt}:fontcolor=white:x=50:y=50:bordercolor=black:borderw=2\" 
-c:a copy -pix_fmt yuv420p {basename}.png

इसके बाद मैंने सबसे कम संख्या वाले फ्रेम को 0.png में बदलने के लिए अजगर का उपयोग करके सभी फ़्रेमों को जोड़ दिया और वृद्धि (इसलिए यह निरंतर होगा, क्योंकि मैंने केवल कीफ़्रेम का उपयोग किया था जो मूल रूप से अनुक्रमिक नहीं थे) और चल रहे थे

ffmpeg -y -f image2 -i %d.png -r {self.params.fps} -vcodec libx264 -crf {self.params.crf} -pix_fmt yuv420p {out_file}

और इसने बहुत अच्छा काम किया, लेकिन उचित निरीक्षण की अनुमति देने के लिए कीफ़्रेम के बीच का अंतर बहुत लंबा था

तो अब प्रश्न के लिए

चूँकि मैं ऐसे फ़्रेम जानता हूँ जो कीफ़्रेम नहीं हैं (p-फ़्रेम?) ffmpeg द्वारा अकेले उपयोग नहीं किया जा सकता है, फ़ाइल नाम को ओवरले करने और इसे png में परिवर्तित करने की विधि (या h264 के रूप में रखें, वही चीज़) काम नहीं करेगी, या कम से कम, मुझे इसके काम करने का कोई तरीका नहीं मिला, हो सकता है कि फ्रेम के कीफ्रेम को निर्दिष्ट करने का कोई तरीका हो?, कोई फ़ाइल नाम को कैसे ओवरले कर सकता है (और फ्रेम नंबर जैसा दिखाया गया है यहां उदाहरण के लिए)

साथ ही, क्या कीफ्रेम के बीच कुछ पी-फ्रेम को छोड़ना संभव है? (इसलिए यदि हर 30 फ्रेम में एक कीफ्रेम होता है, तो हम एक कीफ्रेम लेते हैं, एक फ्रेम 15 फ्रेम बाद में, और अगला एक और कीफ्रेम)

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

साथ ही, यदि कोई अन्य विकल्प है जो इसे प्राप्त कर सकता है (पहले मैं फ़ाइल नाम जोड़ने के लिए पायथन और ओपनसीवी का उपयोग करके पीएनजी में कनवर्ट कर रहा था और फिर पीएनजी को एमपी 4 में विलय कर रहा था, लेकिन फिर मैंने पाया कि ड्रॉटेक्स्ट एक ही कमांड में ऐसा कर सकता है इसलिए मैंने इस्तेमाल किया यह)

1
La bla bla 24 सितंबर 2020, 10:38

1 उत्तर

सबसे बढ़िया उत्तर

मैंने https://github.com/DaWelter/h264decoder का उपयोग किया और सीधे ffmpeg का उपयोग नहीं किया।

इसका एक बहुत ही सरल इंटरफ़ेस है, मैंने अभी कॉल किया

decoder = h264decoder.H264Decoder()
# For each file, in order call
framedatas = decoder.decode(data_in)
for framedata in framedatas:
    (frame, w, h, ls) = framedata
    self.process_frame(frame, path) # Using OpenCV to manipulate, resize, add the overlay, etc.

और उसके बाद आउटपुट डेटा को ffmpeg में एक MP4 फ़ाइल बनाने के लिए संयोजित करने के लिए पाइप किया

0
La bla bla 4 अक्टूबर 2020, 05:35