शुरू करना

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

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

इन चरणों के बारे में ज़्यादा जानने के लिए आगे पढ़ें. साथ ही, पूरा उदाहरण देखने के लिए, ट्रांसफ़ॉर्मर डेमो ऐप्लिकेशन में TransformerActivity देखें.

Media3 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")

Groovy

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)

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, बैकग्राउंड में अपना काम करता है और ऐप्लिकेशन थ्रेड पर लिसनर के तरीकों को कॉल करता है.

इवेंट सुनना

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