झलक लागू करना

अपने ऐप्लिकेशन में झलक जोड़ते समय, PreviewView का इस्तेमाल करें. यह एक View है, जिसे सही तरीके से दिखाने के लिए काटा-छांटा, छोटा-बड़ा, और घुमाया जा सकता है.

कैमरा चालू होने पर, इमेज की झलक PreviewView के अंदर मौजूद किसी सतह पर स्ट्रीम होती है.

PreviewView का इस्तेमाल करना

PreviewView का इस्तेमाल करके, CameraX के लिए झलक दिखाने की सुविधा लागू करने के लिए, यहां दिया गया तरीका अपनाएं. इसके बारे में बाद के सेक्शन में बताया गया है:

  1. इसके अलावा, CameraXConfig.Provider को कॉन्फ़िगर करें.
  2. अपने लेआउट में PreviewView जोड़ें.
  3. ProcessCameraProvider का अनुरोध करें.
  4. View बनाने पर, ProcessCameraProvider देखें.
  5. कोई कैमरा चुनें. इसके बाद, लाइफ़साइकल और इस्तेमाल के उदाहरणों को बाइंड करें.

PreviewView का इस्तेमाल करने की कुछ सीमाएं हैं. PreviewView का इस्तेमाल करते समय, ये काम नहीं किए जा सकते:

  • TextureView और Preview.SurfaceProvider पर सेट करने के लिए, SurfaceTexture बनाएं.
  • TextureView से SurfaceTexture को निकालें और उसे Preview.SurfaceProvider पर सेट करें.
  • SurfaceView से Surface लें और उसे Preview.SurfaceProvider पर सेट करें.

इनमें से कुछ भी होने पर, Preview से PreviewView पर फ़्रेम स्ट्रीम होना बंद हो जाते हैं.

अपने लेआउट में PreviewView जोड़ना

यहां दिए गए सैंपल में, लेआउट में PreviewView को दिखाया गया है:

<FrameLayout
    android:id="@+id/container">
        <androidx.camera.view.PreviewView
            android:id="@+id/previewView" />
</FrameLayout>

CameraProvider का अनुरोध करना

यहां दिए गए कोड से, CameraProvider का अनुरोध करने का तरीका पता चलता है:

// import androidx.camera.lifecycle.ProcessCameraProvider
// import com.google.common.util.concurrent.ListenableFuture

class MainActivity : ComponentActivity() {
    private lateinit var cameraProviderFuture: ListenableFuture<ProcessCameraProvider>
    override fun onCreate(savedInstanceState: Bundle?) {
        super.onCreate(savedInstanceState)
        cameraProviderFuture = ProcessCameraProvider.getInstance(this)
    }
}

देखें कि CameraProvider उपलब्ध है या नहीं

CameraProvider का अनुरोध करने के बाद, पुष्टि करें कि व्यू बनने पर, इसकी शुरुआत हो गई है. यहां दिए गए कोड से पता चलता है कि ऐसा कैसे किया जा सकता है:

cameraProviderFuture.addListener(
    Runnable {
        val cameraProvider = cameraProviderFuture.get()
        bindPreview(cameraProvider)
    },
    ContextCompat.getMainExecutor(this)
)

इस सैंपल में इस्तेमाल किए गए bindPreview फ़ंक्शन का उदाहरण देखने के लिए, अगले सेक्शन में दिया गया कोड देखें.

कोई कैमरा चुनें और लाइफ़साइकल और इस्तेमाल के उदाहरणों को बाइंड करें

CameraProvider बनाने और उसकी पुष्टि करने के बाद, यह तरीका अपनाएं:

  1. Preview बनाएं.
  2. कैमरे के लिए, अपनी पसंद का LensFacing विकल्प चुनें.
  3. चुने गए कैमरे और इस्तेमाल के किसी भी उदाहरण को लाइफ़साइकल से बाइंड करें.
  4. Preview को PreviewView से कनेक्ट करें.

यहां दिए गए कोड में एक उदाहरण दिखाया गया है:

fun bindPreview(cameraProvider: ProcessCameraProvider) {
    var preview: Preview = Preview.Builder()
        .build()

    var cameraSelector: CameraSelector = CameraSelector.Builder()
        .requireLensFacing(CameraSelector.LENS_FACING_BACK)
        .build()

    preview.setSurfaceProvider(previewView.getSurfaceProvider())

    var camera = cameraProvider.bindToLifecycle(this as LifecycleOwner, cameraSelector, preview)
}

ध्यान दें कि bindToLifecycle(), Camera ऑब्जेक्ट लौटाता है. ज़ूम और एक्सपोज़र जैसे कैमरा आउटपुट को कंट्रोल करने के बारे में ज़्यादा जानने के लिए, कैमरा आउटपुट देखें.

अब आपने कैमरे की झलक दिखाने की सुविधा लागू कर ली है. अपना ऐप्लिकेशन बनाएं और पुष्टि करें कि झलक आपके ऐप्लिकेशन में दिख रही है और आपकी उम्मीद के मुताबिक काम कर रही है.

PreviewView के लिए अतिरिक्त कंट्रोल

CameraX PreviewView, प्रॉपर्टी को कॉन्फ़िगर करने के लिए कुछ अतिरिक्त एपीआई उपलब्ध कराता है. जैसे:

लागू करने का मोड

PreviewView, टारगेट View पर झलक वाली स्ट्रीम को रेंडर करने के लिए, इनमें से किसी एक मोड का इस्तेमाल कर सकता है:

  • PERFORMANCE डिफ़ॉल्ट मोड है. PreviewView, वीडियो स्ट्रीम दिखाने के लिए SurfaceView का इस्तेमाल करता है. हालांकि, कुछ मामलों में यह TextureView का इस्तेमाल करता है. SurfaceView में ड्रॉइंग के लिए एक खास सरफ़ेस होता है. इसमें इंटरनल हार्डवेयर कंपोज़िटर की मदद से, हार्डवेयर ओवरले को लागू करने की संभावना ज़्यादा होती है. खास तौर पर, तब जब वीडियो की झलक के ऊपर कोई अन्य यूज़र इंटरफ़ेस (यूआई) एलिमेंट (जैसे, बटन) न हो. हार्डवेयर ओवरले की मदद से रेंडर करने पर, वीडियो फ़्रेम जीपीयू पाथ का इस्तेमाल नहीं करते. इससे प्लैटफ़ॉर्म की बैटरी की खपत और इंतज़ार का समय कम हो सकता है.

  • COMPATIBLE मोड. इस मोड में, PreviewView एक TextureView का इस्तेमाल करता है. SurfaceView के उलट, इसमें ड्रॉइंग के लिए कोई खास सरफ़ेस नहीं होता. इस वजह से, वीडियो को ब्लेंड करके रेंडर किया जाता है, ताकि उसे दिखाया जा सके. इस अतिरिक्त चरण के दौरान, ऐप्लिकेशन बिना किसी पाबंदी के वीडियो को स्केल करने और घुमाने जैसी अतिरिक्त प्रोसेसिंग कर सकता है.

अपने ऐप्लिकेशन के लिए सही मोड चुनने के लिए, PreviewView.setImplementationMode() का इस्तेमाल करें. अगर डिफ़ॉल्ट PERFORMANCE मोड आपके ऐप्लिकेशन के लिए सही नहीं है, तो यहां दिए गए कोड सैंपल में COMPATIBLE मोड को सेट करने का तरीका बताया गया है:

// viewFinder is a PreviewView instance.
viewFinder.implementationMode = PreviewView.ImplementationMode.COMPATIBLE

स्केल टाइप

जब झलक वाले वीडियो का रिज़ॉल्यूशन, आपके टारगेट PreviewView के डाइमेंशन से अलग होता है, तो वीडियो कॉन्टेंट को व्यू में फ़िट करना पड़ता है. इसके लिए, वीडियो को काटा-छांटा जाता है या लेटरबॉक्स किया जाता है. इससे वीडियो का ओरिजनल आसपेक्ट रेशियो (लंबाई-चौड़ाई का अनुपात) बना रहता है. इस मकसद के लिए, PreviewView ये ScaleTypes उपलब्ध कराता है:

  • लेटरबॉक्सिंग के लिए, FIT_CENTER, FIT_START, और FIT_END. पूरे वीडियो वाले कॉन्टेंट को टारगेट PreviewView में दिखाए जा सकने वाले ज़्यादा से ज़्यादा साइज़ के हिसाब से, छोटा या बड़ा किया जाता है. हालांकि, पूरा वीडियो फ़्रेम दिखने के बावजूद, स्क्रीन का कुछ हिस्सा खाली दिख सकता है. इन तीनों में से चुने गए स्केल टाइप के आधार पर, वीडियो फ़्रेम टारगेट व्यू के बीच में, शुरुआत में या आखिर में अलाइन होता है.

  • FILL_CENTER, FILL_START, FILL_END, क्रॉप करने के लिए. अगर किसी वीडियो का आसपेक्ट रेशियो (लंबाई-चौड़ाई का अनुपात) PreviewView नहीं है, तो वीडियो का सिर्फ़ कुछ हिस्सा दिखता है. हालांकि, वीडियो पूरी PreviewView स्क्रीन पर दिखता है.

CameraX, डिफ़ॉल्ट रूप से FILL_CENTER स्केल टाइप का इस्तेमाल करता है. अपने ऐप्लिकेशन के लिए सबसे सही स्केल टाइप सेट करने के लिए, PreviewView.setScaleType() का इस्तेमाल करें. यहां दिया गया कोड सैंपल, FIT_CENTER स्केल टाइप सेट करता है:

// viewFinder is a PreviewView instance.
viewFinder.scaleType = PreviewView.ScaleType.FIT_CENTER

वीडियो दिखाने की प्रोसेस में ये चरण शामिल हैं:

  1. वीडियो को स्केल करना:
    • FIT_* स्केल टाइप के लिए, वीडियो को min(dst.width/src.width, dst.height/src.height) के साथ स्केल करें.
    • FILL_* स्केल टाइप के लिए, वीडियो को max(dst.width/src.width, dst.height/src.height) के साथ स्केल करें.
  2. स्केल किए गए वीडियो को डेस्टिनेशन PreviewView के साथ अलाइन करें:
    • FIT_CENTER/FILL_CENTER के लिए, स्केल किए गए वीडियो और डेस्टिनेशन PreviewView को बीच में अलाइन करें.
    • FIT_START/FILL_START के लिए, स्केल किए गए वीडियो और डेस्टिनेशन PreviewView को हर एक के सबसे ऊपर बाएं कोने के हिसाब से अलाइन करें.
    • FIT_END/FILL_END के लिए, स्केल किए गए वीडियो और डेस्टिनेशन PreviewView को हर एक के सबसे नीचे दाएं कोने के हिसाब से अलाइन करें.

उदाहरण के लिए, यहां 640x480 रिज़ॉल्यूशन वाला सोर्स वीडियो और 1920x1080 रिज़ॉल्यूशन वाला डेस्टिनेशन वीडियो दिया गया है PreviewView:

इमेज में 640x480 रिज़ॉल्यूशन वाले वीडियो की तुलना, 1920x1080 रिज़ॉल्यूशन वाले वीडियो की झलक से की गई है

यहां दी गई इमेज में, FIT_START / FIT_CENTER / FIT_END को स्केल करने की प्रोसेस दिखाई गई है:

इस इमेज में, FIT_START, FIT_CENTER, और FIT_END स्केलिंग प्रोसेस दिखाई गई है

यह प्रोसेस इस तरह काम करती है:

  1. वीडियो फ़्रेम को min(1920/640, 1080/480) = 2.25 से स्केल करें (ओरिजनल आसपेक्ट रेशियो को बनाए रखते हुए), ताकि 1440x1080 का इंटरमीडिएट वीडियो फ़्रेम मिल सके.
  2. 1440x1080 वीडियो फ़्रेम को 1920x1080 PreviewView के साथ अलाइन करें.
    • FIT_CENTER के लिए, वीडियो फ़्रेम को PreviewView विंडो के सेंटर में अलाइन करें. PreviewView के शुरुआती और आखिरी 240 पिक्सल कॉलम खाली हैं.
    • FIT_START के लिए, वीडियो फ़्रेम को PreviewView विंडो के शुरुआत (सबसे ऊपर बाईं ओर) के साथ अलाइन करें. PreviewView के आखिरी 480 पिक्सल कॉलम खाली हैं.
    • FIT_END के लिए, वीडियो फ़्रेम को PreviewView विंडो के आखिर (सबसे नीचे दाईं ओर का कोना) में अलाइन करें. PreviewView के शुरुआती 480 पिक्सल कॉलम खाली हैं.

यहां दी गई इमेज में, FILL_START / FILL_CENTER / FILL_END को स्केल करने की प्रोसेस दिखाई गई है:

इमेज में FILL_START, FILL_CENTER, और FILL_END स्केलिंग प्रोसेस दिखाई गई है

यह प्रोसेस इस तरह काम करती है:

  1. max(1920/640, 1080/480) = 3 की मदद से वीडियो फ़्रेम को स्केल करें, ताकि 1920x1440 का इंटरमीडिएट वीडियो फ़्रेम मिल सके. यह PreviewView के साइज़ से बड़ा होता है.
  2. 1920x1440 वीडियो फ़्रेम को क्रॉप करें, ताकि वह 1920x1080 PreviewView विंडो में फ़िट हो सके.
    • FILL_CENTER के लिए, 1920x1440 के स्केल किए गए वीडियो के सेंटर से 1920x1080 को क्रॉप करें. वीडियो की ऊपर और नीचे की 180 लाइनें नहीं दिखती हैं.
    • FILL_START के लिए, 1920x1440 के स्केल किए गए वीडियो की शुरुआत से 1920x1080 को काटें. वीडियो की सबसे नीचे की 360 लाइनें नहीं दिख रही हैं.
    • FILL_END के लिए, 1920x1440 स्केल किए गए वीडियो के आखिर से 1920x1080 को काटें. वीडियो की सबसे ऊपर की 360 लाइनें नहीं दिख रही हैं.

अन्य संसाधन

CameraX के बारे में ज़्यादा जानने के लिए, यहां दिए गए अन्य संसाधन देखें.

कोडलैब (कोड बनाना सीखना)

  • CameraX का इस्तेमाल शुरू करना
  • कोड सैंपल

  • CameraX के सैंपल ऐप्लिकेशन