এনকোডেড নমুনা বের করুন

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

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

সাধারণ ব্যবহারের ক্ষেত্রে অন্তর্ভুক্ত:

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

সংক্ষিপ্ত বিবরণ

নিম্নলিখিত কোড নমুনাটি MediaExtractorCompat কীভাবে ব্যবহার করবেন তা দেখায়:

কোটলিন

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) {
        throw RuntimeException(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) {
        throw new RuntimeException(e);
    } finally {
        // 3. Release the extractor
        extractor.release();
    }
}