2017-09-05 14 views
6

मान लिया जाये कि हम Android में एक Surface एक वीडियो प्रदर्शित करता है कि है (उदाहरण के लिए h264) एक MediaPlayer साथ:वीडियो: दृश्य गुण (जैसे संतृप्तता, चमक) को बदलने

1) यह प्रदर्शित संतृप्ति बदलने के लिए संभव है, विपरीत वीडियो पर प्रदर्शित & चमक की चमक? वास्तविक समय में? जैसे छवियों का उपयोग setColorFilter वीडियो फ्रेम को संसाधित करने के लिए एंड्रॉइड में समान कुछ भी हो सकता है?

वैकल्पिक प्रश्न (यदि कोई 1 भी मुश्किल है।):

2) हम जैसे के साथ इस वीडियो निर्यात करना चाहते हैं एक संतृप्ति में वृद्धि, हमें कोडेक का उपयोग करना चाहिए, उदा। MediaCodec। संतृप्ति परिवर्तन को लागू करने के लिए कोडक/सेव एक्शन से पहले हमें किस तकनीक (विधि, कक्षा, पुस्तकालय, आदि ...) का उपयोग करना चाहिए?

+0

क्या आप एक तैयार पुस्तकालय चाहते हैं जो प्रदर्शन के लिए वीडियो (जैसे नीचे दिए गए जवाब में) में हेरफेर कर सकता है, या क्या आपके पास अन्य आवश्यकताएं हैं जो इसकी अनुमति नहीं देती हैं? उत्तर में लिंक्ड प्रोजेक्ट 'MediaPlayer' के साथ' GLSurfaceView' का उपयोग करके प्रदर्शन पर फ़िल्टरिंग करने के लिए ओपनजीएल शेडर्स को लागू करता है। अगर आपको फ़िल्टर किए गए वीडियो को निर्यात करने की आवश्यकता नहीं है तो यह निश्चित रूप से एक उचित दृष्टिकोण है। अब से आपकी 'सतह' कहां से आ रही है? – Dave

+0

हाय @ डेव, मैं वर्तमान में जांच कर रहा हूं कि प्रदर्शित वीडियो (आमतौर पर सतह पर) दोनों को समायोजित करना संभव है, लेकिन समायोजित वीडियो भी निर्यात करें। तो मेरे पास कोई ठोस 'सतह' नहीं है - यही वह है जिसे मैं ढूंढ रहा हूं :) – Diolor

उत्तर

2

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

इसी तरह, आप MediaCodec और MediaExtractor साथ ओपन उपकरण इस्तेमाल कर सकते हैं वीडियो फ्रेम डिकोड करने के लिए। MediaCodec को SurfaceTexture पर आउटपुट करने के लिए कॉन्फ़िगर किया जाएगा, इसलिए आउटपुट बफर प्रदान करने के लिए आपको कुछ बॉयलरप्लेट कोड से अधिक कुछ करने की आवश्यकता नहीं होगी। फ़िल्टरिंग प्रक्रिया MediaPlayer के समान होगी। उपलब्ध एक डिकोडर के रूप में MediaCodec का उपयोग कर कई उदाहरण हैं, उदा। here और here। Prokash के उदाहरण के GLSurfaceView के साथ उन उदाहरणों में TextureView या SurfaceView को प्रतिस्थापित करने के लिए यह काफी सरल होना चाहिए।

इस दृष्टिकोण का लाभ यह है कि आपके पास मीडिया फ़ाइल में सभी अलग-अलग ट्रैक तक पहुंच है। इसके कारण, आप ओपनजीएल के साथ वीडियो ट्रैक को फ़िल्टर करने और सीधे निर्यात के लिए अन्य ट्रैक कॉपी करने में सक्षम होना चाहिए। आप Surface के साथ के साथइनपुट के रूप मेंइनपुट और MediaMuxer के साथ सभी को एक साथ रखने के लिए उपयोग करेंगे। आप BigFlake पर कई प्रासंगिक उदाहरण देख सकते हैं।

आप डीकोडेड बाइट डेटा तक पहुंचने के लिए के बिनाका उपयोग कर सकते हैं और इसे इस तरह से कुशल बना सकते हैं। This example उस दृष्टिकोण को दर्शाता है। आप डेटा में हेरफेर कर सकते हैं और निर्यात के लिए एन्कोडर को भेज सकते हैं या फिट बैठकर इसे प्रस्तुत कर सकते हैं। कच्चे बाइट डेटा से निपटने में कुछ अतिरिक्त जटिलता है। ध्यान दें कि मुझे यह उदाहरण पसंद है क्योंकि यह अलग-अलग ऑडियो और वीडियो ट्रैक से निपटने का वर्णन करता है।

आप देशी कोड में या जावा रैपर में से किसी एक के माध्यम से FFMpeg का भी उपयोग कर सकते हैं। यह विकल्प तत्काल प्लेबैक की तुलना में निर्यात की दिशा में अधिक तैयार है। कुछ पुस्तकालयों के लिए here या here देखें जो जावा पर FFMpeg उपलब्ध कराने का प्रयास करते हैं। वे मूल रूप से कमांड लाइन इंटरफेस के चारों ओर रैपर हैं। आपको एफएफएमपीईजी के माध्यम से प्लेबैक प्रबंधित करने के लिए कुछ अतिरिक्त काम करने की आवश्यकता होगी, लेकिन यह निश्चित रूप से करने योग्य है।

यदि आपके कोई प्रश्न हैं, तो पूछने के लिए स्वतंत्र महसूस करें, और मैं आपके उपयोग के मामले में जो भी विकल्प सबसे अधिक समझ में आता हूं, उस पर विस्तार करने की कोशिश करूंगा।

+0

हाय डेव, आप निश्चित रूप से बकाया होने का हकदार हैं क्योंकि यह बहुत विश्लेषणात्मक है। दृश्य फ़िल्टर और उन्हें निर्यात करने के लिए सबसे संतुलित समाधान 'MediaCodec' के साथ मैन्युअल कार्य दिखता है। निश्चित रूप से मैं देख रहा हूं कि मैं कुछ "पूर्वावलोकन" संभावना के साथ एफएफएमपीईजी (जो कि शानदार लग रहा है) का उपयोग कर सकता हूं। धन्यवाद! – Diolor

1

यदि आप वीडियो फ़िल्टर का समर्थन करने वाले खिलाड़ी का उपयोग कर रहे हैं तो आप ऐसा कर सकते हैं।

ऐसे खिलाड़ी का उदाहरण VLC है, जो FFMPEG [1] के आसपास बनाया गया है।

वीएलसी एंड्रॉइड के लिए संकलन करना बहुत आसान है। फिर आपको केवल libvlc (aar फ़ाइल) की आवश्यकता है और आप अपना स्वयं का ऐप बना सकते हैं। संकलन निर्देश here देखें।

आपको write your own module की भी आवश्यकता होगी। बस एक मौजूदा डुप्लिकेट करें और इसे संशोधित करें। कहने की जरूरत नहीं है कि वीएलसी मजबूत ट्रांसकोडिंग और स्ट्रीमिंग क्षमताओं की पेशकश करता है।

एंड्रॉइड के लिए शक्तिशाली वीएलसी के रूप में, यह एक बड़ी कमी है - वीडियो फ़िल्टर हार्डवेयर डिकोडिंग (केवल एंड्रॉइड) के साथ काम नहीं कर सकता है। इसका मतलब है कि पूरी वीडियो प्रोसेसिंग सीपीयू पर है।


आपका अन्य विकल्प GLSurfaceView और TextureView तरह सतहों पर GLSL/ओपन उपयोग करने के लिए कर रहे हैं। यह गारंटी जीपीयू शक्ति।

संबंधित मुद्दे