শুরু করা

Transformer-এর সাথে শুরু করার মধ্যে নিম্নলিখিত ধাপগুলি অন্তর্ভুক্ত:

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

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

ডিপেন্ডেন্সি হিসেবে Media3 Transformer যোগ করা

Transformer ব্যবহার শুরু করার সবচেয়ে সহজ উপায় হল আপনার অ্যাপ মডিউলের build.gradle ফাইলে লাইব্রেরিতে 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 সহায়তা চালু করুন

আগে থেকে চালু করা না থাকলে, আপনাকে সব 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 ব্যবহার করে এক্সপোর্ট অপারেশন বাতিল করুন । হার্ডওয়্যার ভিডিও কোডেকের মতো রিসোর্স সীমিত থাকে, বিশেষ করে কম দামের ডিভাইসে, তাই আউটপুট না লাগলে রিসোর্স ফ্রি করার জন্য এটি করা গুরুত্বপূর্ণ।