ক্যামেরাএক্স ভিডিও ক্যাপচারিং আর্কিটেকচার

একটি ক্যাপচারিং সিস্টেম সাধারণত ভিডিও এবং অডিও স্ট্রীম রেকর্ড করে, সেগুলিকে সংকুচিত করে, দুটি স্ট্রীমকে মিক্স করে, তারপর ফলস্বরূপ স্ট্রিমটিকে ডিস্কে লিখে।

একটি ভিডিও এবং অডিও ক্যাপচারিং সিস্টেমের জন্য ধারণাগত চিত্র
চিত্র 1. একটি ভিডিও এবং অডিও ক্যাপচারিং সিস্টেমের জন্য ধারণাগত চিত্র।

ক্যামেরাএক্সে, ভিডিও ক্যাপচারের সমাধান হল VideoCapture ব্যবহারের ক্ষেত্রে:

ধারণাগত চিত্র যা দেখায় কিভাবে ক্যামেরা x ভিডিও ক্যাপচার ব্যবহারের ক্ষেত্রে পরিচালনা করে
চিত্র 2. ধারণাগত ডায়াগ্রাম যা দেখায় কিভাবে CameraX VideoCapture ব্যবহারের ক্ষেত্রে পরিচালনা করে।

চিত্র 2-এ দেখানো হয়েছে, ক্যামেরাএক্স ভিডিও ক্যাপচারে কয়েকটি উচ্চ-স্তরের স্থাপত্য উপাদান রয়েছে:

  • ভিডিও উৎসের জন্য SurfaceProvider .
  • অডিও উৎসের জন্য AudioSource
  • ভিডিও/অডিও এনকোড এবং সংকুচিত করার জন্য দুটি এনকোডার।
  • দুটি স্ট্রিম মিক্স করার জন্য একটি মিডিয়া মুক্সার।
  • ফলাফল লিখতে একটি ফাইল সেভার।

ভিডিওক্যাপচার এপিআই জটিল ক্যাপচারিং ইঞ্জিনকে বিমূর্ত করে এবং অনেক সহজ এবং সরল এপিআই সহ অ্যাপ্লিকেশন সরবরাহ করে।

VideoCapture API ওভারভিউ

VideoCapture হল একটি CameraX ব্যবহারের ক্ষেত্রে যা নিজে থেকে বা অন্যান্য ব্যবহারের ক্ষেত্রে একত্রিত হলে ভাল কাজ করে। নির্দিষ্ট সমর্থিত সংমিশ্রণগুলি ক্যামেরার হার্ডওয়্যার ক্ষমতার উপর নির্ভর করে, তবে Preview এবং VideoCapture সমস্ত ডিভাইসে একটি বৈধ ব্যবহারের ক্ষেত্রে সমন্বয়।

ভিডিওক্যাপচার এপিআই নিম্নলিখিত বস্তুগুলি নিয়ে গঠিত যা অ্যাপ্লিকেশনগুলির সাথে যোগাযোগ করে:

  • VideoCapture হল টপ-লেভেল ইউজ কেস ক্লাস। VideoCapture একটি CameraSelector এবং অন্যান্য CameraX UseCases সহ একজন LifecycleOwner এর সাথে আবদ্ধ হয়। এই ধারণা এবং ব্যবহার সম্পর্কে আরও তথ্যের জন্য, CameraX আর্কিটেকচার দেখুন।
  • একটি Recorder হল ভিডিওআউটপুটের একটি বাস্তবায়ন যা VideoCapture সাথে শক্তভাবে মিলিত হয়। ভিডিও এবং অডিও ক্যাপচার করার জন্য Recorder ব্যবহার করা হয়। একটি অ্যাপ্লিকেশন একটি Recorder থেকে রেকর্ডিং তৈরি করে
  • একটি PendingRecording একটি রেকর্ডিং কনফিগার করে, অডিও সক্ষম করা এবং একটি ইভেন্ট লিসেনার সেট করার মতো বিকল্পগুলি প্রদান করে। একটি PendingRecording তৈরি করতে আপনাকে অবশ্যই একটি Recorder ব্যবহার করতে হবে। একটি PendingRecording কিছু রেকর্ড করে না।
  • একটি Recording প্রকৃত রেকর্ডিং সম্পাদন করে। একটি Recording তৈরি করতে আপনাকে অবশ্যই একটি PendingRecording ব্যবহার করতে হবে৷

চিত্র 3 এই বস্তুর মধ্যে সম্পর্ক দেখায়:

একটি ভিডিও ক্যাপচার ব্যবহারের ক্ষেত্রে ঘটতে থাকা মিথস্ক্রিয়াগুলি দেখানো চিত্র
চিত্র 3. একটি ভিডিওক্যাপচার ব্যবহারের ক্ষেত্রে যে মিথস্ক্রিয়াগুলি ঘটে তা দেখানো চিত্র।

কিংবদন্তি:

  1. QualitySelector দিয়ে একটি Recorder তৈরি করুন।
  2. OutputOptions একটি দিয়ে Recorder কনফিগার করুন।
  3. যদি প্রয়োজন হয় তাহলে withAudioEnabled() দিয়ে অডিও সক্ষম করুন।
  4. রেকর্ডিং শুরু করতে একটি VideoRecordEvent শ্রোতার সাথে start() কল করুন।
  5. রেকর্ডিং নিয়ন্ত্রণ করতে Recording -এ pause() / resume() / stop() ব্যবহার করুন।
  6. আপনার ইভেন্ট শ্রোতার ভিতরে VideoRecordEvents এ সাড়া দিন।

বিস্তারিত API তালিকা উৎস কোডের ভিতরে current.txt- এ রয়েছে।

VideoCapture API ব্যবহার করে

আপনার অ্যাপে CameraX VideoCapture ব্যবহার কেস সংহত করতে, নিম্নলিখিতগুলি করুন:

  1. VideoCapture বাঁধুন।
  2. রেকর্ডিং প্রস্তুত করুন এবং কনফিগার করুন।
  3. রানটাইম রেকর্ডিং শুরু করুন এবং নিয়ন্ত্রণ করুন।

নিম্নলিখিত বিভাগগুলি একটি এন্ড-টু-এন্ড রেকর্ডিং সেশন পেতে প্রতিটি ধাপে আপনি কী করতে পারেন তার রূপরেখা দেয়।

ভিডিও ক্যাপচার বাঁধুন

VideoCapure ব্যবহারের ক্ষেত্রে আবদ্ধ করতে, নিম্নলিখিতগুলি করুন:

  1. একটি Recorder অবজেক্ট তৈরি করুন।
  2. VideoCapture অবজেক্ট তৈরি করুন।
  3. একটি Lifecycle আবদ্ধ হন।

CameraX VideoCapture API বিল্ডার ডিজাইন প্যাটার্ন অনুসরণ করে। অ্যাপ্লিকেশন একটি Recorder তৈরি করতে Recorder.Builder ব্যবহার করে। আপনি একটি QualitySelector অবজেক্টের মাধ্যমে Recorder জন্য ভিডিও রেজোলিউশন কনফিগার করতে পারেন।

ক্যামেরাএক্স Recorder ভিডিও রেজোলিউশনের জন্য নিম্নলিখিত পূর্ব-নির্ধারিত Qualities সমর্থন করে:

  • Quality.UHD 4K আল্ট্রা এইচডি ভিডিও আকারের জন্য UHD (2160p)
  • পূর্ণ HD ভিডিও আকারের জন্য Quality.FHD (1080p)
  • HD ভিডিও আকারের জন্য Quality.HD (720p)
  • Quality.SD এসডি ভিডিও সাইজের জন্য এসডি (480p)

মনে রাখবেন যে অ্যাপ দ্বারা অনুমোদিত হলে CameraX অন্যান্য রেজোলিউশনও বেছে নিতে পারে।

প্রতিটি নির্বাচনের সঠিক ভিডিও আকার ক্যামেরা এবং এনকোডারের ক্ষমতার উপর নির্ভর করে। আরও তথ্যের জন্য, CamcorderProfile এর জন্য ডকুমেন্টেশন দেখুন।

অ্যাপ্লিকেশনগুলি একটি QualitySelector তৈরি করে রেজোলিউশন কনফিগার করতে পারে৷ আপনি নিম্নলিখিত পদ্ধতিগুলির মধ্যে একটি ব্যবহার করে একটি QualitySelector তৈরি করতে পারেন:

  • fromOrderedList() ব্যবহার করে কয়েকটি পছন্দের রেজোলিউশন প্রদান করুন এবং পছন্দের কোনো রেজোলিউশন সমর্থিত না হলে ব্যবহার করার জন্য একটি ফলব্যাক কৌশল অন্তর্ভুক্ত করুন।

    CameraX নির্বাচিত ক্যামেরার ক্ষমতার উপর ভিত্তি করে সেরা ফলব্যাক ম্যাচ নির্ধারণ করতে পারে, আরও বিশদ বিবরণের জন্য QualitySelector এর FallbackStrategy specification পড়ুন। উদাহরণস্বরূপ, নিম্নলিখিত কোডটি রেকর্ডিংয়ের জন্য সর্বোচ্চ সমর্থিত রেজোলিউশনের অনুরোধ করে, এবং যদি অনুরোধের কোনো রেজোলিউশন সমর্থিত না হয়, তাহলে CameraX-কে কোয়ালিটি.এসডি রেজোলিউশনের সবচেয়ে কাছের একটি বেছে নেওয়ার অনুমতি দিন:

    val qualitySelector = QualitySelector.fromOrderedList(
             listOf(Quality.UHD, Quality.FHD, Quality.HD, Quality.SD),
             FallbackStrategy.lowerQualityOrHigherThan(Quality.SD))
    
  • প্রথমে ক্যামেরার ক্ষমতা সম্পর্কে প্রশ্ন করুন এবং QualitySelector::from() ব্যবহার করে সমর্থিত রেজোলিউশন থেকে বেছে নিন :

    val cameraInfo = cameraProvider.availableCameraInfos.filter {
        Camera2CameraInfo
        .from(it)
        .getCameraCharacteristic(CameraCharacteristics.LENS\_FACING) == CameraMetadata.LENS_FACING_BACK
    }
    
    val supportedQualities = QualitySelector.getSupportedQualities(cameraInfo[0])
    val filteredQualities = arrayListOf (Quality.UHD, Quality.FHD, Quality.HD, Quality.SD)
                           .filter { supportedQualities.contains(it) }
    
    // Use a simple ListView with the id of simple_quality_list_view
    viewBinding.simpleQualityListView.apply {
        adapter = ArrayAdapter(context,
                               android.R.layout.simple_list_item_1,
                               filteredQualities.map { it.qualityToString() })
    
        // Set up the user interaction to manually show or hide the system UI.
        setOnItemClickListener { _, _, position, _ ->
            // Inside View.OnClickListener,
            // convert Quality.* constant to QualitySelector
            val qualitySelector = QualitySelector.from(filteredQualities[position])
    
            // Create a new Recorder/VideoCapture for the new quality
            // and bind to lifecycle
            val recorder = Recorder.Builder()
                .setQualitySelector(qualitySelector).build()
    
             // ...
        }
    }
    
    // A helper function to translate Quality to a string
    fun Quality.qualityToString() : String {
        return when (this) {
            Quality.UHD -> "UHD"
            Quality.FHD -> "FHD"
            Quality.HD -> "HD"
            Quality.SD -> "SD"
            else -> throw IllegalArgumentException()
        }
    }
    
    

    উল্লেখ্য যে QualitySelector.getSupportedQualities() থেকে প্রত্যাবর্তিত ক্ষমতাটি VideoCapture ব্যবহারের ক্ষেত্রে বা VideoCapture এবং Preview ব্যবহারের ক্ষেত্রেগুলির সংমিশ্রণের জন্য কাজ করার গ্যারান্টিযুক্ত৷ ImageCapture বা ImageAnalysis ব্যবহারের ক্ষেত্রে একসাথে বাঁধাই করার সময়, প্রয়োজনীয় সংমিশ্রণ অনুরোধ করা ক্যামেরায় সমর্থিত না হলে CameraX এখনও বাঁধাই ব্যর্থ করতে পারে।

একবার আপনার একটি QualitySelector থাকলে, অ্যাপ্লিকেশনটি একটি VideoCapture অবজেক্ট তৈরি করতে পারে এবং বাইন্ডিং করতে পারে। মনে রাখবেন যে এই বাঁধাই অন্যান্য ব্যবহারের ক্ষেত্রে একই রকম:

val recorder = Recorder.Builder()
    .setExecutor(cameraExecutor).setQualitySelector(qualitySelector)
    .build()
val videoCapture = VideoCapture.withOutput(recorder)

try {
    // Bind use cases to camera
    cameraProvider.bindToLifecycle(
            this, CameraSelector.DEFAULT_BACK_CAMERA, preview, videoCapture)
} catch(exc: Exception) {
    Log.e(TAG, "Use case binding failed", exc)
}

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

Recorder সিস্টেমের জন্য সবচেয়ে উপযুক্ত বিন্যাস নির্বাচন করে। সবচেয়ে সাধারণ ভিডিও কোডেক হল H.264 AVC ) কনটেইনার ফরম্যাট MPEG-4 সহ।

কনফিগার করুন এবং রেকর্ডিং তৈরি করুন

একটি Recorder থেকে, অ্যাপ্লিকেশনটি ভিডিও এবং অডিও ক্যাপচার করার জন্য রেকর্ডিং বস্তু তৈরি করতে পারে। অ্যাপ্লিকেশনগুলি নিম্নলিখিতগুলি করে রেকর্ডিং তৈরি করে:

  1. prepareRecording() দিয়ে OutputOptions কনফিগার করুন।
  2. (ঐচ্ছিক) অডিও রেকর্ডিং সক্ষম করুন।
  3. একটি VideoRecordEvent শ্রোতা নিবন্ধন করতে start() ব্যবহার করুন এবং ভিডিও ক্যাপচারিং শুরু করুন।

আপনি start() ফাংশন কল করলে Recorder একটি Recording অবজেক্ট প্রদান করে। আপনার অ্যাপ্লিকেশন এই Recording অবজেক্টটি ক্যাপচার শেষ করতে বা অন্যান্য ক্রিয়া সম্পাদন করতে ব্যবহার করতে পারে, যেমন বিরতি দেওয়া বা পুনরায় শুরু করা।

একটি Recorder একটি সময়ে একটি Recording বস্তুকে সমর্থন করে। আগের Recording অবজেক্টে Recording.stop() বা Recording.close() কল করার পরে আপনি একটি নতুন রেকর্ডিং শুরু করতে পারেন।

আসুন আরও বিস্তারিতভাবে এই পদক্ষেপগুলি দেখুন। প্রথমত, অ্যাপ্লিকেশনটি Recorder.prepareRecording() দিয়ে রেকর্ডারের জন্য OutputOptions কনফিগার করে। একটি Recorder নিম্নলিখিত ধরনের OutputOptions সমর্থন করে:

  • FileDescriptorOutputOptions একটি FileDescriptor এ ক্যাপচার করার জন্য।
  • একটি File ক্যাপচার করার জন্য FileOutputOptions
  • MediaStore ক্যাপচার করার জন্য MediaStoreOutputOptions

সমস্ত OutputOptions ধরন আপনাকে setFileSizeLimit() দিয়ে সর্বাধিক ফাইলের আকার সেট করতে সক্ষম করে। অন্যান্য বিকল্পগুলি পৃথক আউটপুট প্রকারের জন্য নির্দিষ্ট, যেমন FileDescriptorOutputOptions এর জন্য ParcelFileDescriptor

prepareRecording() একটি PendingRecording অবজেক্ট প্রদান করে, যা একটি মধ্যবর্তী বস্তু যা সংশ্লিষ্ট Recording অবজেক্ট তৈরি করতে ব্যবহৃত হয়। PendingRecording হল একটি ক্ষণস্থায়ী ক্লাস যা বেশিরভাগ ক্ষেত্রে অদৃশ্য হওয়া উচিত এবং খুব কমই অ্যাপ দ্বারা ক্যাশে করা হয়।

অ্যাপ্লিকেশনগুলি আরও রেকর্ডিং কনফিগার করতে পারে, যেমন:

  • সঙ্গে অডিও সক্ষম করুন withAudioEnabled()
  • start(Executor, Consumer<VideoRecordEvent>)
  • PendingRecording.asPersistentRecording() সহ অন্য ক্যামেরায় রিবাউন্ড করার সময় একটি রেকর্ডিংকে ক্রমাগত রেকর্ড করার অনুমতি দিন।

রেকর্ডিং শুরু করতে, PendingRecording.start() কল করুন। CameraX PendingRecording একটি Recording এ পরিণত করে, রেকর্ডিং অনুরোধ সারিবদ্ধ করে এবং নতুন তৈরি Recording অবজেক্টকে অ্যাপ্লিকেশনে ফিরিয়ে দেয়। একবার সংশ্লিষ্ট ক্যামেরা ডিভাইসে রেকর্ডিং শুরু হলে, CameraX একটি VideoRecordEvent.EVENT_TYPE_START পাঠায়।EVENT_TYPE_START ইভেন্ট।

নিম্নলিখিত উদাহরণটি দেখায় কিভাবে একটি MediaStore ফাইলে ভিডিও এবং অডিও রেকর্ড করতে হয়:

// Create MediaStoreOutputOptions for our recorder
val name = "CameraX-recording-" +
        SimpleDateFormat(FILENAME_FORMAT, Locale.US)
                .format(System.currentTimeMillis()) + ".mp4"
val contentValues = ContentValues().apply {
   put(MediaStore.Video.Media.DISPLAY_NAME, name)
}
val mediaStoreOutput = MediaStoreOutputOptions.Builder(this.contentResolver,
                              MediaStore.Video.Media.EXTERNAL_CONTENT_URI)
                              .setContentValues(contentValues)
                              .build()

// 2. Configure Recorder and Start recording to the mediaStoreOutput.
val recording = videoCapture.output
                .prepareRecording(context, mediaStoreOutput)
                .withAudioEnabled()
                .start(ContextCompat.getMainExecutor(this), captureListener)

ক্যামেরা প্রিভিউ ডিফল্টরূপে সামনের ক্যামেরায় মিরর করা হলেও, VideoCapture দ্বারা রেকর্ড করা ভিডিওগুলি ডিফল্টরূপে মিরর করা হয় না। CameraX 1.3 এর সাথে, এখন ভিডিও রেকর্ডিং মিরর করা সম্ভব যাতে সামনের ক্যামেরা প্রিভিউ এবং রেকর্ড করা ভিডিও মিলে যায়।

তিনটি মিররমোড বিকল্প রয়েছে: MIRROR_MODE_OFF, MIRROR_MODE_ON, এবং MIRROR_MODE_ON_FRONT_ONLY৷ ক্যামেরা প্রিভিউতে সারিবদ্ধ করার জন্য, Google MIROR_MODE_ON_FRONT_ONLY ব্যবহার করার সুপারিশ করে, যার অর্থ হল পিছনের ক্যামেরার জন্য মিররিং সক্ষম করা হয়নি, কিন্তু সামনের ক্যামেরার জন্য সক্ষম করা হয়েছে৷ MirrorMode সম্পর্কে আরও তথ্যের জন্য, MirrorMode constants দেখুন।

এই কোড স্নিপেটটি দেখায় কিভাবে MIRROR_MODE_ON_FRONT_ONLY ব্যবহার করে VideoCapture.Builder.setMirrorMode() কে কল করতে হয়। আরও তথ্যের জন্য, setMirrorMode() দেখুন।

কোটলিন


val recorder = Recorder.Builder().build()

val videoCapture = VideoCapture.Builder(recorder)
    .setMirrorMode(MIRROR_MODE_ON_FRONT_ONLY)
    .build()

useCases.add(videoCapture);

জাভা


Recorder.Builder builder = new Recorder.Builder();
if (mVideoQuality != QUALITY_AUTO) {
    builder.setQualitySelector(
        QualitySelector.from(mVideoQuality));
}
  VideoCapture<Recorder> videoCapture = new VideoCapture.Builder<>(builder.build())
      .setMirrorMode(MIRROR_MODE_ON_FRONT_ONLY)
      .build();
    useCases.add(videoCapture);

একটি সক্রিয় রেকর্ডিং নিয়ন্ত্রণ

আপনি নিম্নলিখিত পদ্ধতিগুলি ব্যবহার করে একটি চলমান Recording থামাতে, পুনরায় শুরু করতে এবং বন্ধ করতে পারেন:

  • বর্তমান সক্রিয় রেকর্ডিং বিরাম দিতে pause .
  • resume() একটি বিরতিকৃত সক্রিয় রেকর্ডিং পুনরায় শুরু করতে।
  • stop() রেকর্ডিং শেষ করতে এবং সংশ্লিষ্ট কোনো রেকর্ডিং বস্তু ফ্লাশ করতে।
  • mute() বর্তমান রেকর্ডিং মিউট বা আন-মিউট করতে।

নোট করুন যে রেকর্ডিংটি বিরতি দেওয়া বা সক্রিয় রেকর্ডিং অবস্থায় থাকুক না কেন আপনি একটি Recording বন্ধ করতে stop() কল করতে পারেন।

আপনি যদি PendingRecording.start() এর সাথে একটি EventListener নিবন্ধন করে থাকেন, তাহলে Recording একটি VideoRecordEvent ব্যবহার করে যোগাযোগ করে।

  • VideoRecordEvent.EVENT_TYPE_STATUS বর্তমান ফাইলের আকার এবং রেকর্ড করা সময়কালের মতো পরিসংখ্যান রেকর্ড করার জন্য ব্যবহৃত হয়।
  • VideoRecordEvent.EVENT_TYPE_FINALIZE রেকর্ডিং ফলাফলের জন্য ব্যবহার করা হয় এবং যেকোন সম্পর্কিত ত্রুটি সহ চূড়ান্ত ফাইলের URI-এর মতো তথ্য অন্তর্ভুক্ত করে৷

একবার আপনার অ্যাপ্লিকেশানটি একটি EVENT_TYPE_FINALIZE পেয়ে গেলে যা একটি সফল রেকর্ডিং সেশন নির্দেশ করে, তারপর আপনি OutputOptions এ নির্দিষ্ট অবস্থান থেকে ক্যাপচার করা ভিডিও অ্যাক্সেস করতে পারবেন।

অতিরিক্ত সম্পদ

CameraX সম্পর্কে আরও জানতে, নিম্নলিখিত অতিরিক্ত সংস্থানগুলি দেখুন: