शुरू करना

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.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 पेज पर मिल सकती है.

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

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