शुरू करना

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.5.0")
implementation("androidx.media3:media3-effect:1.5.0")
implementation("androidx.media3:media3-common:1.5.0")

Groovy

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

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

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

Java 8 की सुविधा चालू करना

अगर यह सुविधा पहले से चालू नहीं है, तो आपको build.gradle Transformer पर निर्भर सभी android सेक्शन में जावा 8 की सुविधा चालू करनी होगी. इसके लिए, इन चीज़ों को जोड़ें:

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 इंस्टेंस पर, एक से ज़्यादा एक्सपोर्ट ऑपरेशन को क्रम से चलाया जा सकता है. हालांकि, एक ही इंस्टेंस के साथ एक साथ कई एक्सपोर्ट नहीं किए जा सकते.

थ्रेड के बारे में जानकारी

ट्रांसफ़ॉर्मर इंस्टेंस को किसी एक ऐप्लिकेशन थ्रेड से ऐक्सेस किया जाना चाहिए. साथ ही, Listener मेथड को उसी थ्रेड पर कॉल किया जाना चाहिए. ज़्यादातर मामलों में, ऐप्लिकेशन थ्रेड, ऐप्लिकेशन की मुख्य थ्रेड हो सकती है. Transformer, बैकग्राउंड में काम करता है. साथ ही, ऐप्लिकेशन थ्रेड पर, listener के तरीकों को कॉल पोस्ट करता है.

इवेंट सुनना

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