শুরু করা

Transformer ব্যবহার শুরু করার জন্য নিম্নলিখিত ধাপগুলি অনুসরণ করতে হবে:

  1. আপনার প্রোজেক্টে ডিপেন্ডেন্সি হিসেবে Media3 Transformer যোগ করুন।
  2. প্রসেস করার জন্য মিডিয়া এবং এতে প্রয়োগ করার জন্য এডিট দেখাতে একটি EditedMediaItem তৈরি করুন।
  3. প্রয়োজনীয় আউটপুট এবং সম্পূর্ণ হওয়া ও সমস্যা সম্পর্কিত ইভেন্টের জন্য লিসনারের বিবরণ দিয়ে একটি Transformer তৈরি করুন।
  4. এক্সপোর্ট অপারেশন শুরু করুন, এডিট করার জন্য EditedMediaItem এবং একটি আউটপুট পাথ পাস করুন। এক্সপোর্ট করার সময়, আপনি বর্তমান প্রগ্রেস সম্পর্কে কোয়েরি করতে অথবা অপারেশন বাতিল করতে পারবেন।
  5. এক্সপোর্ট করা হয়ে গেলে, প্রয়োজন অনুযায়ী আউটপুট ম্যানেজ করুন। যেমন, আপনি আউটপুট অন্য অ্যাপে শেয়ার করতে বা কোনও সার্ভারে আপলোড করতে পারেন।

এইসব ধাপ সম্পর্কে আরও বিস্তারিত জানতে পড়ুন এবং সম্পূর্ণ উদাহরণের জন্য ট্রান্সফর্মার ডেমো অ্যাপে TransformerActivity দেখুন।

Add Media3 Transformer as a dependency

Transformer ব্যবহার করা শুরু করার সবচেয়ে সহজ উপায় হল আপনার অ্যাপ মডিউলের build.gradle ফাইলে লাইব্রেরিতে গ্রেডেল ডিপেন্ডেন্সি যোগ করা:

Kotlin

implementation("androidx.media3:media3-transformer:1.11.1")
implementation("androidx.media3:media3-effect:1.11.1")
implementation("androidx.media3:media3-common:1.11.1")

গ্ৰুভি

implementation "androidx.media3:media3-transformer:1.11.1"
implementation "androidx.media3:media3-effect:1.11.1"
implementation "androidx.media3:media3-common:1.11.1"

যেখানে 1.11.1 হল আপনার পছন্দের ভার্সন। রিলিজ নোট থেকে লেটেস্ট ভার্সন সম্পর্কে জানতে পারবেন।

উপলভ্য লাইব্রেরি মডিউল সম্পর্কে আরও তথ্য Google Maven AndroidX Media3 পৃষ্ঠায় পাওয়া যাবে।

Java 8 সাপোর্ট চালু করুন

আগে থেকে চালু করা না থাকলে, আপনাকে Transformer-এর উপর নির্ভর করে এমন সব build.gradle ফাইলে Java 8 সাপোর্ট চালু করতে হবে। এর জন্য android বিভাগে নিম্নলিখিত কোড যোগ করতে হবে:

compileOptions {
  targetCompatibility JavaVersion.VERSION_1_8
}

ট্রান্সফর্মেশন শুরু করুন

ইনপুট ফাইল থেকে অডিও সরানোর জন্য EditedMediaItem তৈরি করার এবং তারপরে H.265/HEVC ভিডিও এক্সপোর্ট করার জন্য Transformer ইনস্ট্যান্স তৈরি ও কনফিগার করার উদাহরণ এখানে দেওয়া হল, ফলাফল outputPath-এ আউটপুট করা হচ্ছে।

Kotlin

val inputMediaItem = MediaItem.fromUri("path_to_input_file")
val editedMediaItem = EditedMediaItem.Builder(inputMediaItem).setRemoveAudio(true).build()
val transformer =
  Transformer.Builder(context)
    .setVideoMimeType(MimeTypes.VIDEO_H265)
    .addListener(transformerListener)
    .build()
transformer.start(editedMediaItem, outputPath)

জাভা

MediaItem inputMediaItem = MediaItem.fromUri("path_to_input_file");
EditedMediaItem editedMediaItem =
    new EditedMediaItem.Builder(inputMediaItem).setRemoveAudio(true).build();
Transformer transformer =
    new Transformer.Builder(context)
        .setVideoMimeType(MimeTypes.VIDEO_H265)
        .addListener(transformerListener)
        .build();
transformer.start(editedMediaItem, outputPath);

মিডিয়া আইটেম সম্পর্কে আরও জানতে, ExoPlayer মিডিয়া আইটেম পৃষ্ঠা দেখুন। ইনপুট প্রোগ্রেসিভ বা অ্যাডাপ্টিভ স্ট্রিম হতে পারে, তবে আউটপুট সবসময় প্রোগ্রেসিভ স্ট্রিম হয়। অ্যাডাপ্টিভ ইনপুটের জন্য, সবচেয়ে বেশি রেজোলিউশনের ট্র্যাক সবসময় ট্রান্সফর্মেশনের জন্য বেছে নেওয়া হয়। ইনপুট ExoPlayer-এ কাজ করে এমন যেকোনও কন্টেনার ফর্ম্যাটের হতে পারে, তবে আউটপুট সবসময় MP4 ফাইল হয়।

আপনি একই Transformer ইনস্ট্যান্সে পরপর একাধিক এক্সপোর্ট অপারেশন চালাতে পারেন, তবে একই ইনস্ট্যান্সে একসাথে একাধিক এক্সপোর্ট করার সুবিধা নেই।

একাধিক ইনপুট একসাথে কম্পোজ করে মিডিয়া তৈরি করার ব্যাপারে আরও জানতে, মাল্টি-অ্যাসেট এডিটিং দেখুন।

থ্রেডিং সম্পর্কে একটি নোট

Transformer ইনস্ট্যান্স অবশ্যই একটি অ্যাপ্লিকেশন থ্রেড থেকে অ্যাক্সেস করতে হবে এবং লিসেনার মেথড একই থ্রেডে কল করা হয়। বেশিরভাগ ক্ষেত্রে, অ্যাপ্লিকেশন থ্রেডটি অ্যাপ্লিকেশনের প্রধান থ্রেড হতে পারে। অভ্যন্তরীণভাবে, Transformer ব্যাকগ্রাউন্ডে কাজ করে এবং অ্যাপ্লিকেশন থ্রেডে লিসেনার মেথডে কল পোস্ট করে।

ইভেন্ট শুনুন

start পদ্ধতিটি অ্যাসিঙ্ক্রোনাস। এটি অবিলম্বে ফিরে আসে এবং Transformer বিল্ডারে পাস করা লিসনারের মাধ্যমে অ্যাপকে ইভেন্ট সম্পর্কে জানানো হয়।

Kotlin

val transformerListener: Transformer.Listener =
  object : Transformer.Listener {
    override fun onCompleted(composition: Composition, result: ExportResult) {
      playOutput()
    }

    override fun onError(
      composition: Composition,
      result: ExportResult,
      exception: ExportException,
    ) {
      displayError(exception)
    }
  }

জাভা

Transformer.Listener transformerListener =
    new Transformer.Listener() {
      @Override
      public void onCompleted(Composition composition, ExportResult result) {
        playOutput();
      }

      @Override
      public void onError(
          Composition composition, ExportResult result, ExportException exception) {
        displayError(exception);
      }
    };

ExportResult-এ আউটপুট ফাইল সংক্রান্ত তথ্য থাকে, যার মধ্যে প্রযোজ্য হলে ফাইলের সাইজ এবং অডিও ও ভিডিওর জন্য গড় বিটরেট অন্তর্ভুক্ত।

প্রোগ্রেস আপডেট পান

ট্রান্সফর্মেশনের বর্তমান অগ্রগতি সম্পর্কে জানতে Transformer.getProgress কল করুন। প্রত্যাবর্তিত মান প্রগতির অবস্থা নির্দেশ করে। প্রগ্রেস স্টেট PROGRESS_STATE_AVAILABLE হলে, বর্তমান প্রগ্রেসের শতাংশ দিয়ে প্রদান করা ProgressHolder আপডেট করা হয়। নিম্নলিখিত উদাহরণ থেকে জানা যায় যে কীভাবে ট্রান্সফর্মেশনের প্রগ্রেস সম্পর্কে পর্যায়ক্রমিকভাবে কোয়েরি করা যায়, যেখানে updateProgressInUi পদ্ধতি প্রয়োগ করে প্রগ্রেস বার আপডেট করা যায়।

Kotlin

transformer.start(inputMediaItem, outputPath)
val progressHolder = ProgressHolder()
mainHandler.post(
  object : Runnable {
    override fun run() {
      val progressState: @ProgressState Int = transformer.getProgress(progressHolder)
      updateProgressInUi(progressState, progressHolder)
      if (progressState != Transformer.PROGRESS_STATE_NOT_STARTED) {
        mainHandler.postDelayed(/* r= */ this, /* delayMillis= */ 500)
      }
    }
  }
)

জাভা

transformer.start(inputMediaItem, outputPath);
ProgressHolder progressHolder = new ProgressHolder();
mainHandler.post(
    new Runnable() {
      @Override
      public void run() {
        @Transformer.ProgressState int progressState = transformer.getProgress(progressHolder);
        updateProgressInUi(progressState, progressHolder);
        if (progressState != PROGRESS_STATE_NOT_STARTED) {
          mainHandler.postDelayed(/* r= */ this, /* delayMillis= */ 500);
        }
      }
    });

ট্রান্সফর্মেশন বাতিল করা

ব্যবহারকারী এক্সপোর্ট ফ্লো থেকে বেরিয়ে আসতে চাইলে, Transformer.cancel-এর মাধ্যমে এক্সপোর্ট অপারেশন বাতিল করুন। হার্ডওয়্যার ভিডিও কোডেক্সের মতো রিসোর্স সীমিত, বিশেষ করে কম-এন্ড ডিভাইসে, তাই আউটপুট প্রয়োজন না হলে রিসোর্স খালি করার জন্য এটি করা গুরুত্বপূর্ণ।