अपने ऐप्लिकेशन में प्लेबैक कंट्रोल जोड़ना

मीडिया चलाने वाले ऐप्लिकेशन को मीडिया दिखाने और प्लेबैक को कंट्रोल करने के लिए, यूज़र इंटरफ़ेस कॉम्पोनेंट की ज़रूरत होती है. Media3 लाइब्रेरी में एक यूज़र इंटरफ़ेस (यूआई) मॉड्यूल होता है, जिसमें कई यूज़र इंटरफ़ेस (यूआई) कॉम्पोनेंट होते हैं. यूज़र इंटरफ़ेस (यूआई) मॉड्यूल पर निर्भर करने के लिए, यह डिपेंडेंसी जोड़ें:

Kotlin

implementation("androidx.media3:media3-ui:1.4.1")

Groovy

implementation "androidx.media3:media3-ui:1.4.1"

सबसे ज़रूरी कॉम्पोनेंट PlayerView है, जो मीडिया चलाने के लिए एक व्यू है. PlayerView, वीडियो चलने के दौरान वीडियो, इमेज, सबटाइटल, और एल्बम आर्ट के साथ-साथ, प्लेबैक कंट्रोल भी दिखाता है.

PlayerView में प्लेयर इंस्टेंस को अटैच और डिटैच करने के लिए, setPlayer तरीका है. इसके लिए, null को पास करना होगा.

PlayerView

PlayerView का इस्तेमाल वीडियो, इमेज, और ऑडियो चलाने के लिए किया जा सकता है. यह वीडियो चलाने पर वीडियो और सबटाइटल को रेंडर करता है. साथ ही, इमेज चलाने पर बिटमैप को रेंडर करता है. इसके अलावा, यह ऑडियो फ़ाइलों में मेटाडेटा के तौर पर शामिल आर्टवर्क को भी दिखा सकता है. इसे किसी भी अन्य यूज़र इंटरफ़ेस (यूआई) कॉम्पोनेंट की तरह ही, अपनी लेआउट फ़ाइलों में शामिल किया जा सकता है. उदाहरण के लिए, PlayerView को इस एक्सएमएल के साथ शामिल किया जा सकता है:

<androidx.media3.ui.PlayerView
    android:id="@+id/player_view"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    app:show_buffering="when_playing"
    app:show_shuffle_button="true"/>

ऊपर दिए गए स्निपेट से पता चलता है कि PlayerView कई एट्रिब्यूट उपलब्ध कराता है. इन एट्रिब्यूट का इस्तेमाल, व्यू के व्यवहार के साथ-साथ उसके लुक और स्टाइल को पसंद के मुताबिक बनाने के लिए किया जा सकता है. इनमें से ज़्यादातर एट्रिब्यूट के लिए, सेटर के तरीके होते हैं. इनका इस्तेमाल, रनटाइम के दौरान व्यू को पसंद के मुताबिक बनाने के लिए किया जा सकता है. PlayerView Javadoc में इन एट्रिब्यूट और सेटर के तरीकों के बारे में ज़्यादा जानकारी दी गई है.

लेआउट फ़ाइल में व्यू का एलान करने के बाद, उसे ऐक्टिविटी के onCreate तरीके में देखा जा सकता है:

Kotlin

override fun onCreate(savedInstanceState: Bundle?) {
  super.onCreate(savedInstanceState)
  // ...
  playerView = findViewById(R.id.player_view)
}

Java

@Override
protected void onCreate(Bundle savedInstanceState) {
  super.onCreate(savedInstanceState);
  // ...
  playerView = findViewById(R.id.player_view);
}

प्लेयर को शुरू करने के बाद, उसे व्यू से अटैच किया जा सकता है. इसके लिए, setPlayer को कॉल करें:

Kotlin

// Instantiate the player.
val player = ExoPlayer.Builder(context).build()
// Attach player to the view.
playerView.player = player
// Set the media item to be played.
player.setMediaItem(mediaItem)
// Prepare the player.
player.prepare()

Java

// Instantiate the player.
player = new ExoPlayer.Builder(context).build();
// Attach player to the view.
playerView.setPlayer(player);
// Set the media item to be played.
player.setMediaItem(mediaItem);
// Prepare the player.
player.prepare();

प्लैटफ़ॉर्म का टाइप चुनना

PlayerView के surface_type एट्रिब्यूट की मदद से, वीडियो चलाने के लिए इस्तेमाल किए जाने वाले प्लैटफ़ॉर्म का टाइप सेट किया जा सकता है. spherical_gl_surface_view (जो स्फ़ीरीय वीडियो चलाने के लिए एक खास वैल्यू है) और video_decoder_gl_surface_view (जो एक्सटेंशन रेंडरर का इस्तेमाल करके वीडियो रेंडर करने के लिए है) के अलावा, surface_view, texture_view, और none वैल्यू भी इस्तेमाल की जा सकती हैं. अगर व्यू सिर्फ़ ऑडियो चलाने के लिए है, तो none का इस्तेमाल किया जाना चाहिए, ताकि कोई प्लैटफ़ॉर्म न बनाना पड़े. ऐसा करने पर, ज़्यादा खर्च हो सकता है.

अगर व्यू, सामान्य वीडियो चलाने के लिए है, तो surface_view या texture_view का इस्तेमाल किया जाना चाहिए. वीडियो चलाने के लिए, SurfaceView के मुकाबले TextureView के कई फ़ायदे हैं:

  • कई डिवाइसों पर बैटरी की खपत काफ़ी कम हो जाती है.
  • फ़्रेम की टाइमिंग ज़्यादा सटीक होती है, जिससे वीडियो प्लेबैक बेहतर होता है.
  • जिन डिवाइसों पर यह सुविधा काम करती है उन पर अच्छी क्वालिटी में एचडीआर वीडियो आउटपुट की सुविधा.
  • डीआरएम (डिजिटल राइट्स मैनेजमेंट) से सुरक्षित कॉन्टेंट चलाते समय, सुरक्षित आउटपुट के लिए सहायता.
  • Android TV डिवाइसों पर, डिसप्ले के पूरे रिज़ॉल्यूशन में वीडियो कॉन्टेंट को रेंडर करने की सुविधा. ये डिवाइस, यूज़र इंटरफ़ेस (यूआई) लेयर को अपस्केल करते हैं.

इसलिए, जहां भी हो सके वहां SurfaceView को TextureView के बजाय प्राथमिकता दी जानी चाहिए. TextureView का इस्तेमाल सिर्फ़ तब किया जाना चाहिए, जब SurfaceView आपकी ज़रूरतों को पूरा न करता हो. एक उदाहरण के लिए, Android 7.0 (एपीआई लेवल 24) से पहले, वीडियो के प्लैटफ़ॉर्म पर ऐनिमेशन या स्क्रोल करने की सुविधा को आसानी से इस्तेमाल किया जा सकता है. इस बारे में यहां दिए गए नोट में बताया गया है. इस मामले में, TextureView का इस्तेमाल सिर्फ़ तब करना चाहिए, जब SDK_INT 24 (Android 7.0) से कम हो. इसके अलावा, SurfaceView का इस्तेमाल करें.

Android TV पर डी-पैड नेविगेशन

Android TV के रिमोट कंट्रोल में डी-पैड कंट्रोल होता है. इससे निर्देश भेजे जाते हैं, जो आपकी Activity के dispatchKeyEvent(KeyEvent) पर मुख्य इवेंट के तौर पर पहुंचते हैं. इन्हें प्लेयर व्यू को सौंपना होगा:

Kotlin

override fun dispatchKeyEvent(event: KeyEvent?): Boolean{
  return playerView.dispatchKeyEvent(event!!) || super.dispatchKeyEvent(event)
}

Java

@Override
public boolean dispatchKeyEvent(KeyEvent event) {
  return playerView.dispatchKeyEvent(event) || super.dispatchKeyEvent(event);
}

प्लेयर व्यू पर फ़ोकस करने का अनुरोध करना ज़रूरी है, ताकि वीडियो चलाने के कंट्रोल पर नेविगेट किया जा सके और विज्ञापनों को स्किप किया जा सके. Activity के onCreate में फ़ोकस करने का अनुरोध करें:

Kotlin

override fun onCreate(savedInstanceState: Bundle?) {
  super.onCreate(savedInstanceState)
  // ...
  playerView.requestFocus()
  // ...
}

Java

@Override
public void onCreate(@Nullable Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    // ...
    playerView.requestFocus();
    // ...
}

अगर Android TV पर Compose का इस्तेमाल किया जा रहा है, तो आपको AndroidView पर फ़ोकस करने की सुविधा चालू करनी होगी. साथ ही, AndroidView में बदलाव करने वाले पैरामीटर को पास करके, इवेंट को डिलीगेट करना होगा. इसके लिए, यह तरीका अपनाएं:

AndroidView(
  modifier = modifier
    .focusable()
    .onKeyEvent { playerView.dispatchKeyEvent(it.nativeKeyEvent) },
  factory = { playerView }
)

ड्रॉबल बदलना

PlayerView, प्लेबैक कंट्रोल और प्रोग्रेस बार दिखाने के लिए PlayerControlView का इस्तेमाल करता है. PlayerControlView के ज़रिए इस्तेमाल किए गए ड्रॉबल को, आपके ऐप्लिकेशन में दिए गए नाम वाले ड्रॉबल से बदला जा सकता है. बदले जा सकने वाले कंट्रोल ड्रॉअबल की सूची के लिए, PlayerControlView Javadoc देखें.

कस्टमाइज़ेशन के अन्य विकल्प

अगर ऊपर बताए गए तरीके से ज़्यादा कस्टमाइज़ेशन की ज़रूरत है, तो हमारा सुझाव है कि ऐप्लिकेशन डेवलपर, Media3 के यूज़र इंटरफ़ेस (यूआई) मॉड्यूल से मिलने वाले यूआई कॉम्पोनेंट के बजाय, अपने यूआई कॉम्पोनेंट लागू करें.