প্রিভিউ প্রয়োগ করুন

আপনার অ্যাপে প্রিভিউ যোগ করার সময়, 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-এর জন্য অনুরোধ করতে হয়:

Kotlin

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

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

জাভা

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

public class MainActivity extends AppCompatActivity {
    private ListenableFuture<ProcessCameraProvider> cameraProviderFuture;

    @Override
    protected void onCreate(@Nullable Bundle savedInstanceState) {
        cameraProviderFuture = ProcessCameraProvider.getInstance(this);
    }
}

CameraProvider উপলভ্য কিনা তা চেক করুন

CameraProvider-এর অনুরোধ করার পরে, ভিউ তৈরি করার সময় সেটির ইনিশিয়ালাইজেশন সম্পূর্ণ হয়েছে কিনা তা যাচাই করুন। এটি কীভাবে করতে হয় তা নিম্নলিখিত কোড থেকে জানতে পারবেন:

Kotlin

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

জাভা

cameraProviderFuture.addListener(() -> {
    try {
        ProcessCameraProvider cameraProvider = cameraProviderFuture.get();
        bindPreview(cameraProvider);
    } catch (ExecutionException | InterruptedException e) {
        // No errors need to be handled for this Future.
        // This should never be reached.
    }
}, ContextCompat.getMainExecutor(this));

এই স্যাম্পেলে ব্যবহার করা bindPreview ফাংশনের উদাহরণ দেখতে, পরবর্তী বিভাগে দেওয়া কোড দেখুন।

একটি ক্যামেরা বেছে নিন এবং লাইফসাইকেল ও ব্যবহারের কেস বাইন্ড করুন

আপনি CameraProvider তৈরি ও কনফার্ম করার পরে, নিম্নলিখিত ধাপগুলি অনুসরণ করুন:

  1. Preview তৈরি করুন।
  2. পছন্দসই ক্যামেরা LensFacing বিকল্প নির্দিষ্ট করুন।
  3. বেছে নেওয়া ক্যামেরা এবং যেকোনও ব্যবহারের কেস লাইফসাইকেলে বাইন্ড করুন।
  4. PreviewView-এর সাথে Preview কানেক্ট করুন।

নিচের কোডটি একটি উদাহরণ দেখায়:

Kotlin

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)
}

জাভা

void bindPreview(@NonNull ProcessCameraProvider cameraProvider) {
    Preview preview = new Preview.Builder()
            .build();

    CameraSelector cameraSelector = new CameraSelector.Builder()
            .requireLensFacing(CameraSelector.LENS_FACING_BACK)
            .build();

    preview.setSurfaceProvider(previewView.getSurfaceProvider());

    Camera camera = cameraProvider.bindToLifecycle((LifecycleOwner)this, cameraSelector, preview);
}

মনে রাখবেন যে bindToLifecycle() একটি Camera অবজেক্ট রিটার্ন করে। জুম ও এক্সপোজারের মতো ক্যামেরা আউটপুট নিয়ন্ত্রণ করার ব্যাপারে আরও তথ্যের জন্য, ক্যামেরা আউটপুট দেখুন।

ক্যামেরা প্রিভিউ প্রয়োগ করার কাজ এখন সম্পূর্ণ হয়েছে। আপনার অ্যাপ তৈরি করুন এবং কনফার্ম করুন যে আপনার প্রিভিউ আপনার অ্যাপে দেখা যাচ্ছে এবং আপনার ইচ্ছা অনুযায়ী কাজ করছে।

PreviewView-এর জন্য অতিরিক্ত কন্ট্রোল

CameraX PreviewView প্রপার্টি কনফিগার করার জন্য কিছু অতিরিক্ত API প্রদান করে, যেমন:

প্রয়োগ মোড

PreviewView টার্গেট View-এ প্রিভিউ স্ট্রিম রেন্ডার করার জন্য নিম্নলিখিত মোডগুলির মধ্যে একটি ব্যবহার করতে পারে:

  • PERFORMANCE হল ডিফল্ট মোড। PreviewView ভিডিও স্ট্রিম দেখানোর জন্য SurfaceView ব্যবহার করে, কিন্তু নির্দিষ্ট কিছু ক্ষেত্রে TextureView-এ ফিরে যায়। SurfaceView-এর একটি ডেডিকেটেড ড্রয়িং সারফেস আছে, যা ইন্টার্নাল হার্ডওয়্যার কম্পোজিটর-এর মাধ্যমে হার্ডওয়্যার ওভারলে দিয়ে প্রয়োগ করার সম্ভাবনা বেশি, বিশেষ করে যখন প্রিভিউ ভিডিওর উপরে অন্য কোনও UI এলিমেন্ট (যেমন বোতাম) থাকে না। হার্ডওয়্যার ওভারলে দিয়ে রেন্ডার করার মাধ্যমে, ভিডিও ফ্রেম GPU পাথ এড়িয়ে যায়, যা প্ল্যাটফর্মের পাওয়ার খরচ ও লেটেন্সি কমাতে পারে।

  • COMPATIBLE মোড। এই মোডে, PreviewView একটি TextureView ব্যবহার করে, যা SurfaceView-এর মতো নয়, এটির কোনও ডেডিকেটেড ড্রয়িং সারফেস নেই। এর ফলে, ভিডিও ব্লেন্ডিংয়ের সাথে রেন্ডার হয় যাতে এটি দেখানো যায়। এই অতিরিক্ত ধাপের সময়, অ্যাপ্লিকেশনটি অতিরিক্ত প্রসেসিং করতে পারে, যেমন কোনও বিধিনিষেধ ছাড়াই ভিডিও স্কেল ও রোটেট করা।

আপনার অ্যাপ্লিকেশনের জন্য উপযুক্ত প্রয়োগ মোড বেছে নিতে PreviewView.setImplementationMode() ব্যবহার করুন। ডিফল্ট PERFORMANCE মোড আপনার অ্যাপ্লিকেশনের জন্য উপযুক্ত না হলে, নিম্নলিখিত কোড স্যাম্পেল থেকে COMPATIBLE মোড কীভাবে সেট করতে হয় তা দেখানো হয়েছে:

Kotlin

// 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 স্কেল টাইপ সেট করে:

Kotlin

// 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:

১৯২০x১০৮০ প্রিভিউয়ের সাথে তুলনা করে ৬৪০x৪৮০ ভিডিও দেখানো ছবি

নিচের ছবিতে FIT_START / FIT_CENTER / FIT_END স্কেলিং প্রসেস দেখানো হয়েছে:

ছবিতে FIT_START, FIT_CENTER এবং FIT_END স্কেলিং প্রসেস দেখানো হচ্ছে

প্রসেসটি এইভাবে কাজ করে:

  1. ১৪৪০x১০৮০-এর ইন্টারমিডিয়েট ভিডিও ফ্রেম পেতে min(1920/640, 1080/480) = 2.25-এর সাহায্যে ভিডিও ফ্রেম স্কেল করুন (আসল অ্যাস্পেক্ট রেশিও বজায় রেখে)।
  2. ১৪৪০x১০৮০ ভিডিও ফ্রেমটি ১৯২০x১০৮০ PreviewView-এর সাথে অ্যালাইন করুন।
    • FIT_CENTER-এর জন্য, PreviewView উইন্ডোর মাঝখানে ভিডিও ফ্রেমটি অ্যালাইন করুন। PreviewView-এর শুরু ও শেষের ২৪০ পিক্সেল কলাম ফাঁকা আছে।
    • FIT_START-এর জন্য, PreviewView উইন্ডোর শুরু (উপরে-বাঁদিকের কোণ) অংশের সাথে ভিডিও ফ্রেম অ্যালাইন করুন। PreviewView-এর শেষ ৪৮০ পিক্সেল কলাম ফাঁকা আছে।
    • FIT_END-এর জন্য, PreviewView উইন্ডোর শেষের (নিচে ডানদিকের কোণ) সাথে ভিডিও ফ্রেমটি অ্যালাইন করুন। PreviewView-এর প্রথম ৪৮০ পিক্সেল কলাম ফাঁকা আছে।

নিচের ছবিতে FILL_START / FILL_CENTER / FILL_END স্কেলিং প্রসেস দেখানো হয়েছে:

FILL_START, FILL_CENTER ও FILL_END স্কেলিং প্রসেস দেখানো ছবি

প্রসেসটি এইভাবে কাজ করে:

  1. max(1920/640, 1080/480) = 3-এর মাধ্যমে ভিডিও ফ্রেম স্কেল করে ১৯২০x১৪৪০ সাইজের ইন্টারমিডিয়েট ভিডিও ফ্রেম পান (যা PreviewView-এর সাইজের চেয়ে বড়)।
  2. ১৯২০x১০৮০ PreviewView উইন্ডোতে ফিট করার জন্য ১৯২০x১৪৪০ ভিডিও ফ্রেম ক্রপ করুন।
    • FILL_CENTER-এর জন্য, ১৯২০x১৪৪০ স্কেল করা ভিডিওর কেন্দ্র থেকে ১৯২০x১০৮০ ক্রপ করুন। ভিডিওর উপরে ও নিচে ১৮০টি লাইন দেখা যায় না।
    • FILL_START-এর জন্য, ১৯২০x১৪৪০ স্কেল করা ভিডিওর শুরু থেকে ১৯২০x১০৮০ ক্রপ করুন। ভিডিওর নিচের ৩৬০টি লাইন দেখা যাচ্ছে না।
    • FILL_END-এর জন্য, ১৯২০x১৪৪০ স্কেল করা ভিডিওর শেষ থেকে ১৯২০x১০৮০ ক্রপ করুন। ভিডিওর উপরের ৩৬০টি লাইন দেখা যাচ্ছে না।

অতিরিক্ত রিসোর্স

CameraX সম্পর্কে আরও জানতে, নিম্নলিখিত অতিরিক্ত রিসোর্স দেখুন।

কোডল্যাব

  • CameraX ব্যবহার শুরু করা
  • কোডের স্যাম্পেল

  • CameraX স্যাম্পেল অ্যাপ