শুরু হচ্ছে

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

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

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

মিডিয়া৩ ট্রান্সফর্মারকে একটি নির্ভরতা হিসেবে যোগ করুন

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

কোটলিন

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

গ্রুভি

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

যেখানে ১.৯.৩ হলো আপনার পছন্দের সংস্করণ। রিলিজ নোট দেখে সর্বশেষ সংস্করণটি খুঁজে পাওয়া যাবে।

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

জাভা ৮ সমর্থন চালু করুন

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

compileOptions {
  targetCompatibility JavaVersion.VERSION_1_8
}

রূপান্তর শুরু করুন

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

কোটলিন

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 বিল্ডারে পাঠানো লিসেনারের মাধ্যমে অ্যাপটিকে বিভিন্ন ইভেন্টের বিষয়ে জানানো হয়।

কোটলিন

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 মেথডটি প্রয়োগ করা যেতে পারে।

কোটলিন

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