আপনার অ্যাপে প্রিভিউ যোগ করার সময়,
PreviewView ব্যবহার করুন, যা হল একটি
View এবং এটি সঠিকভাবে দেখানোর জন্য ক্রপ, স্কেল ও রোটেট করা যেতে পারে।
ক্যামেরা চালু হলে, PreviewView-এর মধ্যে সারফেসে ইমেজ প্রিভিউ স্ট্রিম হয়।
PreviewView ব্যবহার করুন
PreviewView ব্যবহার করে CameraX-এর জন্য প্রিভিউ প্রয়োগ করার মধ্যে নিম্নলিখিত
ধাপগুলি অন্তর্ভুক্ত, যা পরবর্তী বিভাগে কভার করা হয়েছে:
- ঐচ্ছিকভাবে একটি
CameraXConfig.Providerকনফিগার করুন। - আপনার লেআউটে
PreviewViewযোগ করুন। ProcessCameraProvider-এর অনুরোধ করুন।Viewতৈরি করার সময়,ProcessCameraProviderচেক করুন।- একটি ক্যামেরা বেছে নিন এবং লাইফসাইকেল ও ব্যবহারের কেস বাইন্ড করুন।
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 তৈরি ও কনফার্ম করার পরে, নিম্নলিখিত ধাপগুলি অনুসরণ করুন:
Previewতৈরি করুন।- পছন্দসই ক্যামেরা
LensFacingবিকল্প নির্দিষ্ট করুন। - বেছে নেওয়া ক্যামেরা এবং যেকোনও ব্যবহারের কেস লাইফসাইকেলে বাইন্ড করুন।
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
ভিডিও দেখানোর প্রসেসে নিম্নলিখিত ধাপগুলি রয়েছে:
- ভিডিও স্কেল করুন:
FIT_*স্কেল টাইপের জন্য,min(dst.width/src.width, dst.height/src.height)দিয়ে ভিডিও স্কেল করুন।FILL_*স্কেল টাইপের জন্য,max(dst.width/src.width, dst.height/src.height)দিয়ে ভিডিও স্কেল করুন।
- স্কেল করা ভিডিওটি গন্তব্য
PreviewView-এর সাথে অ্যালাইন করুন:FIT_CENTER/FILL_CENTER-এর জন্য, স্কেল করা ভিডিও এবং গন্তব্যPreviewViewকেন্দ্রে সারিবদ্ধ করুন।FIT_START/FILL_START-এর জন্য, স্কেল করা ভিডিও এবং গন্তব্যPreviewView-এর প্রতিটির উপরের-বাঁদিকের কোণ অনুযায়ী অ্যালাইন করুন।FIT_END/FILL_END-এর জন্য, স্কেল করা ভিডিও এবং গন্তব্যPreviewView-এর প্রতিটির নিচের-ডানদিকের কোণ অনুযায়ী অ্যালাইন করুন।
যেমন, এখানে একটি 640x480 সোর্স ভিডিও এবং একটি 1920x1080 ডেস্টিনেশন
PreviewView:

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

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

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