এনকোড করা স্যাম্পেল এক্সট্র্যাক্ট করা

MediaExtractorCompat ক্লাস হল প্ল্যাটফর্মের MediaExtractor ক্লাসের একটি ড্রপ-ইন রিপ্লেসমেন্ট এবং এটি একই ধরনের API ও ফাংশনালিটি প্রদান করে। এটি ডেটা সোর্স থেকে ডিমাক্স করা, সাধারণত এনকোড করা, মিডিয়া ডেটা এক্সট্র্যাক্ট করতে সাহায্য করে।

এটি একটি কন্টেনার ফাইলকে (যেমন, MP4 বা MKV) এর স্বতন্ত্র ট্র্যাকে আলাদা করে, যেমন ভিডিও, অডিও এবং সাবটাইটেল। তারপরে এক্সট্র্যাক্টর এই ট্র্যাক থেকে কাঁচা, এনকোড করা ডেটাকে স্যাম্পেল (যেমন, একটি সিঙ্গেল কম্প্রেস করা ভিডিও ফ্রেম বা অডিও ব্লক) হিসেবে পড়ে নেয়, তারপরে সেগুলি একটি ডিকোডারকে পাঠানো হয়।

সাধারণ ব্যবহারের মধ্যে এগুলি অন্তর্ভুক্ত:

  • ট্রান্সকোডিং বা রিম্যাক্সিং: কোনও ট্র্যাক থেকে এনকোড করা স্যাম্পেল পড়ে কোডেক পরিবর্তন (ট্রান্সকোডিং) অথবা স্ট্রিমগুলিকে নতুন কন্টেনারে (রিম্যাক্সিং) আবার প্যাকেজ করা, যেমন MP4 ফাইলকে MKV-তে কনভার্ট করা।
  • বাছাই করা কন্টেন্ট এক্সট্র্যাক্ট করা: কোনও ভিডিও ফাইল থেকে অডিও স্ট্রিম এক্সট্র্যাক্ট করার মতো সিঙ্গেল ট্র্যাক আলাদা করে সেভ করা।
  • নিম্ন-স্তরের ডিবাগিং: ফাইল দুর্নীতি, টাইমস্ট্যাম্প সংক্রান্ত সমস্যা বা অন্যান্য সমস্যা ডিবাগ করার জন্য স্বতন্ত্র নমুনা পরিদর্শন করা।
  • কাস্টম প্লেয়ার তৈরি করা: বিশেষ বিশেষ ব্যবহারের ক্ষেত্রে, মিডিয়া পাইপলাইনের উপর সম্পূর্ণ নিয়ন্ত্রণ সহ কাস্টম প্লেয়ার তৈরি করা।

এক নজরে

MediaExtractorCompat কীভাবে ব্যবহার করতে হয় তা নিম্নলিখিত কোড স্যাম্পেল থেকে জানতে পারবেন:

Kotlin

fun extractSamples(context: Context, mediaPath: String) {
  val extractor = MediaExtractorCompat(context)
  try {
    // 1. Setup the extractor
    extractor.setDataSource(mediaPath)

    // Find and select available tracks
    for (i in 0 until extractor.trackCount) {
      val format = extractor.getTrackFormat(i)
      extractor.selectTrack(i)
    }

    // 2. Process samples
    val buffer = ByteBuffer.allocate(10 * 1024 * 1024)
    while (true) {
      // Read an encoded sample into the buffer.
      val bytesRead = extractor.readSampleData(buffer, 0)
      if (bytesRead < 0) break

      // Access sample metadata
      val trackIndex = extractor.sampleTrackIndex
      val presentationTimeUs = extractor.sampleTime
      val sampleSize = extractor.sampleSize

      extractor.advance()
    }
  } catch (e: IOException) {
    handleFailure(e)
  } finally {
    // 3. Release the extractor
    extractor.release()
  }
}

জাভা

public void extractSamples(Context context, String mediaPath) {
  MediaExtractorCompat extractor = new MediaExtractorCompat(context);
  try {
    // 1. Setup the extractor
    extractor.setDataSource(mediaPath);

    // Find and select available tracks
    for (int i = 0; i < extractor.getTrackCount(); i++) {
      MediaFormat format = extractor.getTrackFormat(i);
      extractor.selectTrack(i);
    }

    // 2. Process samples
    ByteBuffer buffer = ByteBuffer.allocate(10 * 1024 * 1024);
    while (true) {
      // Read an encoded sample into the buffer.
      int bytesRead = extractor.readSampleData(buffer, 0);
      if (bytesRead < 0) {
        break;
      }

      // Access sample metadata
      int trackIndex = extractor.getSampleTrackIndex();
      long presentationTimeUs = extractor.getSampleTime();
      long sampleSize = extractor.getSampleSize();

      extractor.advance();
    }
  } catch (IOException e) {
    handleFailure(e);
  } finally {
    // 3. Release the extractor
    extractor.release();
  }
}