শুরু হচ্ছে

Transformer দিয়ে শুরু করার জন্য নিম্নলিখিত ধাপগুলি অন্তর্ভুক্ত:

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

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

নির্ভরতা হিসেবে Media3 ট্রান্সফরমার যোগ করুন

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

কোটলিন

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

খাঁজকাটা

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

যেখানে 1.8.0 আপনার পছন্দের সংস্করণ। সর্বশেষ সংস্করণটি রিলিজ নোটগুলি দেখে পাওয়া যাবে।

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

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

যদি ইতিমধ্যেই সক্ষম না করা থাকে, তাহলে আপনাকে android বিভাগে নিম্নলিখিতটি যোগ করে Transformer-নির্ভর সকল build.gradle ফাইলে 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 ইনস্ট্যান্সে ধারাবাহিকভাবে একাধিক এক্সপোর্ট অপারেশন সম্পাদন করতে পারেন, কিন্তু একই ইনস্ট্যান্সের সাথে একযোগে এক্সপোর্ট সমর্থিত নয়।

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

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

ঘটনাগুলো শুনুন

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