शुरू करना

Transformer का इस्तेमाल शुरू करने के लिए, यह तरीका अपनाएं:

  1. अपने प्रोजेक्ट में, Media3 Transformer को डिपेंडेंसी के तौर पर जोड़ें.
  2. प्रोसेस किए जाने वाले मीडिया और उसमें किए जाने वाले बदलावों को दिखाने के लिए, EditedMediaItem बनाएं.
  3. ज़रूरी आउटपुट और पूरा होने और गड़बड़ी वाले इवेंट के लिए लिसनर के बारे में बताने वाला Transformer बनाएं.
  4. एक्सपोर्ट की प्रोसेस शुरू करें. इसके लिए, बदलाव करने के लिए EditedMediaItem और आउटपुट पाथ पास करें. एक्सपोर्ट के दौरान, मौजूदा प्रोग्रेस के बारे में क्वेरी की जा सकती है या प्रोसेस को रद्द किया जा सकता है.
  5. एक्सपोर्ट पूरा होने के बाद, ज़रूरत के हिसाब से आउटपुट को मैनेज करें. उदाहरण के लिए, आउटपुट को किसी दूसरे ऐप्लिकेशन के साथ शेयर किया जा सकता है या उसे किसी सर्वर पर अपलोड किया जा सकता है.

इन चरणों के बारे में ज़्यादा जानने के लिए, आगे पढ़ें. साथ ही, पूरा उदाहरण देखने के लिए, TransformerActivity में transformer demo app देखें.

Media3 Transformer को डिपेंडेंसी के तौर पर जोड़ना

Transformer का इस्तेमाल शुरू करने का सबसे आसान तरीका है कि अपने ऐप्लिकेशन मॉड्यूल की build.gradle फ़ाइल में, लाइब्रेरी में Gradle डिपेंडेंसी जोड़ें:

Kotlin

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

Groovy

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

यहां 1.9.3, आपका पसंदीदा वर्शन है. रिलीज़ नोट देखकर, सबसे नए वर्शन के बारे में जाना जा सकता है.

उपलब्ध लाइब्रेरी मॉड्यूल के बारे में ज़्यादा जानकारी के लिए, Google Maven AndroidX Media3 पेज देखें.

Java 8 के लिए सहायता चालू करना

अगर 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)

Java

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)
    }
  }

Java

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)
      }
    }
  }
)

Java

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 का इस्तेमाल करके, एक्सपोर्ट की प्रोसेस रद्द करें. हार्डवेयर वीडियो कोडेक जैसे संसाधन सीमित होते हैं. खास तौर पर, कम कीमत वाले डिवाइसों पर. इसलिए, अगर आउटपुट की ज़रूरत नहीं है, तो संसाधनों को खाली करने के लिए, एक्सपोर्ट की प्रोसेस रद्द करना ज़रूरी है.