0Pricing
Android Academy · Ders

Ses ve Video Oynatma

Android'de basit ortam oynatma.

Ses ve Video Oynatma, CoddyKit'te ücretsiz bir Android Academy dersidir. Bu, 4 dersinin 4. dersidir. Aşağıdan dersin tamamını ücretsiz okuyabilir, sonra tarayıcıda yerleşik kod editörü ve 7/24 yapay zeka koçu ile uygulamalı olarak pratik yapabilirsin. Bu, Android Academy öğrenme yolunun bir parçasıdır ve ilerlemeniz web ve CoddyKit uygulaması arasında senkronize olur. Android Academy kursu toplamda 4 dersten oluşur.

Görsellerin Ötesi: Medya Oynatma

Coil görselleri güzel bir şekilde gösterir, ancak uygulamalar ses ve video da oynatır: bir bildirim sesi, podcast, arka plan klibi veya video akışı. Android, medya için özel API'ler sunar.

Günümüzde önerilen kitaplık Media3 (ExoPlayer)'dır. Akış, biçimler, arabelleğe alma ve oynatma denetimleri konusunda eski MediaPlayer'dan çok daha iyi çalışır. Bu derste bir Compose uygulamasında basit ses ve video oynatacaksınız.

Media3 Bağımlılıklarını Ekleme

Media3 modüllere ayrılmıştır. Çoğu uygulama için media3-exoplayer (oynatıcı motoru) ve media3-ui (kullanıma hazır oynatıcı görünümleri) gerekir. Compose videosu için PlayerView'ı AndroidView aracılığıyla da kullanabilirsiniz.

// build.gradle.kts (module level)
dependencies {
    implementation("androidx.media3:media3-exoplayer:1.5.0")
    implementation("androidx.media3:media3-ui:1.5.0")
}

ExoPlayer Oluşturma

Bir ExoPlayer, Context'ten oluşturulur. Ona bir MediaItem (URL veya yerel dosya) verir, prepare() işlevini çağırır ve oynatmayı başlatırsınız. Kendi iş parçacıklarında çalıştığı için kullanıcı arayüzünü engellemez.

Önemli bir nokta: oynatıcı sistem kaynaklarını tutar ve serbest bırakılmalıdır; bunu birazdan daha ayrıntılı göreceğiz.

import android.content.Context
import androidx.media3.common.MediaItem
import androidx.media3.exoplayer.ExoPlayer

fun createPlayer(context: Context, url: String): ExoPlayer {
    val player = ExoPlayer.Builder(context).build()
    player.setMediaItem(MediaItem.fromUri(url))
    player.prepare()
    player.playWhenReady = true
    return player
}

Ses Oynatma

Yalnızca ses oynatma kurulumu aynıdır; yalnızca MediaItem'ı bir ses URL'sine (mp3, aac vb.) yönlendirirsiniz. Gösterilecek bir görünüm olmadığından denetimi oynatıcı nesnesi üzerinden sağlarsınız: play(), pause(), seekTo().

Bu, bir podcast veya müzik oynatıcı oluşturmak için yeterlidir.

import androidx.media3.common.MediaItem
import androidx.media3.exoplayer.ExoPlayer

fun playPodcast(player: ExoPlayer, audioUrl: String) {
    player.setMediaItem(MediaItem.fromUri(audioUrl))
    player.prepare()
    player.play()
}

fun togglePause(player: ExoPlayer) {
    if (player.isPlaying) player.pause() else player.play()
}

Oynatıcıyı Compose'ta Hatırlama

Compose'ta oynatıcıyı bir kez oluşturmalı ve yeniden birleştirmeler arasında korumalısınız. Her yeniden birleştirmede yeni bir oynatıcı oluşturulmaması için remember kullanın.

Bunu uygun temizleme işlemiyle (sonraki sahne) birlikte kullanarak kaynak sızıntısını önleyin.

import androidx.compose.runtime.Composable
import androidx.compose.runtime.remember
import androidx.compose.ui.platform.LocalContext
import androidx.media3.common.MediaItem
import androidx.media3.exoplayer.ExoPlayer

@Composable
fun rememberPlayer(url: String): ExoPlayer {
    val context = LocalContext.current
    return remember {
        ExoPlayer.Builder(context).build().apply {
            setMediaItem(MediaItem.fromUri(url))
            prepare()
        }
    }
}

Oynatıcıyı Serbest Bırakma

Bir oynatıcı, kodekleri, arabellekleri ve ses odağını etkin tutar. Serbest bırakmayı unutursanız bellek sızıntısı oluşur ve ekran kapandıktan sonra oynatma devam edebilir. Compose'ta DisposableEffect, birleştirilebilir bileşen composition'dan ayrıldığında temizleme işlemini yürütür.

Burada her zaman player.release() çağırın.

import androidx.compose.runtime.Composable
import androidx.compose.runtime.DisposableEffect
import androidx.media3.exoplayer.ExoPlayer

@Composable
fun ManagedPlayer(player: ExoPlayer) {
    DisposableEffect(player) {
        onDispose {
            player.release()
        }
    }
    // ... use player here
}

PlayerView ile Video Gösterme

Media3, denetimlere sahip kullanıma hazır bir PlayerView sağlar. Compose'ta yerel bir video birleştirilebilir bileşeni bulunmadığından görünümü AndroidView kullanarak gömer ve oynatıcıyı bağlarsınız.

Böylece oynat/duraklat, ilerleme çubuğu ve tam ekran özelliklerini hazır olarak elde edersiniz.

import androidx.compose.runtime.Composable
import androidx.compose.ui.Modifier
import androidx.compose.ui.viewinterop.AndroidView
import androidx.media3.exoplayer.ExoPlayer
import androidx.media3.ui.PlayerView

@Composable
fun VideoPlayer(player: ExoPlayer, modifier: Modifier = Modifier) {
    AndroidView(
        factory = { context ->
            PlayerView(context).apply {
                this.player = player
            }
        },
        modifier = modifier
    )
}

Eksiksiz Bir Video Ekranı

Şimdi her şeyi bir araya getirelim: oynatıcıyı oluşturun, hatırlayın, bir PlayerView'a bağlayın ve kullanım sona erdiğinde serbest bırakın. Bu, yeniden kullanabileceğiniz bağımsız bir video ekranıdır.

import androidx.compose.foundation.layout.fillMaxWidth
import androidx.compose.foundation.layout.height
import androidx.compose.runtime.*
import androidx.compose.ui.Modifier
import androidx.compose.ui.platform.LocalContext
import androidx.compose.ui.unit.dp
import androidx.compose.ui.viewinterop.AndroidView
import androidx.media3.common.MediaItem
import androidx.media3.exoplayer.ExoPlayer
import androidx.media3.ui.PlayerView

@Composable
fun VideoScreen(videoUrl: String) {
    val context = LocalContext.current
    val player = remember {
        ExoPlayer.Builder(context).build().apply {
            setMediaItem(MediaItem.fromUri(videoUrl))
            prepare()
            playWhenReady = true
        }
    }
    DisposableEffect(Unit) { onDispose { player.release() } }

    AndroidView(
        factory = { PlayerView(it).apply { this.player = player } },
        modifier = Modifier.fillMaxWidth().height(220.dp)
    )
}

Oynatma Durumunu İzleme

Kullanıcı arayüzünüzü (oynat/duraklat simgesi veya ilerleme çubuğu gibi) güncellemek için oynatıcıyı bir Player.Listener ile dinlersiniz. Bu dinleyici arabelleğe alma, hazır olma ve sona erme gibi durum değişikliklerini ve oynatmanın etkin olup olmadığını bildirir.

Ekran göründüğünde dinleyiciyi ekleyin ve kullanım sona erdiğinde kaldırın.

import androidx.media3.common.Player
import androidx.media3.exoplayer.ExoPlayer

fun observe(player: ExoPlayer, onPlaying: (Boolean) -> Unit): Player.Listener {
    val listener = object : Player.Listener {
        override fun onIsPlayingChanged(isPlaying: Boolean) {
            onPlaying(isPlaying)
        }
        override fun onPlaybackStateChanged(state: Int) {
            when (state) {
                Player.STATE_BUFFERING -> { /* show spinner */ }
                Player.STATE_READY -> { /* ready */ }
                Player.STATE_ENDED -> { /* finished */ }
            }
        }
    }
    player.addListener(listener)
    return listener
}

Uygulama Arka Plana Geçtiğinde Duraklatma

Satır içi video için (müzik uygulaması olmayan durumlarda) genellikle kullanıcı ekrandan ayrıldığında duraklatmak, geri döndüğünde ise devam ettirmek istersiniz. Lifecycle'ı gözlemleyip ON_PAUSE durumunda duraklatarak oynatmayı Compose yaşam döngüsüne bağlayabilirsiniz.

Bu, kullanıcının göremediği bir videonun oynatılmasını önler ve pil tasarrufu sağlar.

import androidx.compose.runtime.*
import androidx.compose.ui.platform.LocalLifecycleOwner
import androidx.lifecycle.Lifecycle
import androidx.lifecycle.LifecycleEventObserver
import androidx.media3.exoplayer.ExoPlayer

@Composable
fun PauseWithLifecycle(player: ExoPlayer) {
    val lifecycleOwner = LocalLifecycleOwner.current
    DisposableEffect(lifecycleOwner) {
        val observer = LifecycleEventObserver { _, event ->
            when (event) {
                Lifecycle.Event.ON_PAUSE -> player.pause()
                Lifecycle.Event.ON_RESUME -> player.play()
                else -> {}
            }
        }
        lifecycleOwner.lifecycle.addObserver(observer)
        onDispose { lifecycleOwner.lifecycle.removeObserver(observer) }
    }
}

MediaSession ile Arka Planda Ses

Uygulama arka plana alındığında da oynatılmaya devam etmesi gereken sesler için (müzik, podcast'ler) oynatmayı bir MediaSessionService içine alın. Bu, sistem denetimleri, kilit ekranı ve Bluetooth düğmeleriyle bütünleşir.

Daha kapsamlıdır, ancak temel fikir oynatıcınızı bir MediaSession üzerinden sunmaktır.

import androidx.media3.exoplayer.ExoPlayer
import androidx.media3.session.MediaSession
import androidx.media3.session.MediaSessionService

class PlaybackService : MediaSessionService() {
    private var session: MediaSession? = null

    override fun onCreate() {
        super.onCreate()
        val player = ExoPlayer.Builder(this).build()
        session = MediaSession.Builder(this, player).build()
    }

    override fun onGetSession(controllerInfo: MediaSession.ControllerInfo) = session

    override fun onDestroy() {
        session?.run { player.release(); release() }
        session = null
        super.onDestroy()
    }
}

Hızlı Kontrol

Bir ExoPlayer tutan Compose ekranında, ekran composition'dan ayrıldığında oynatıcıyı serbest bırakmak için hangi Compose API'sini kullanmalısınız?

Özet

Ses ve video oynatmayı eklediniz:

  • Media3 ExoPlayer kullanın; bu, MediaPlayer'ın modern alternatifidir.
  • Bir oynatıcı oluşturun, bir MediaItem ayarlayın, ardından prepare() ve play() işlevlerini çağırın.
  • Compose'ta oynatıcıyı remember ile hatırlayın ve DisposableEffect'in onDispose bölümünde serbest bırakın.
  • PlayerView'ı AndroidView ile gömerek video gösterin.
  • Durumu bir Player.Listener ile izleyin; arka plan sesi için MediaSessionService kullanın.

Böylece Coil ile Görsel ve Medya Yükleme kursu tamamlandı. Artık görselleri akıcı biçimde yükleyebilir ve medyayı modern Android yöntemiyle oynatabilirsiniz.

Sıkça Sorulan Sorular

“Ses ve Video Oynatma” dersi ücretsiz mi?

Evet — “Ses ve Video Oynatma” dersin tüm metni burada web'de ücretsiz olarak okunabilir. Etkileşimli olarak pratik yapmak (yerleşik kod editörü ve 7/24 yapay zeka koçu) ve Android Academy kursunun geri kalanını açmak için CoddyKit PRO'ya yükselt. Android Academy kursu toplamda 4 dersten oluşur.

“Ses ve Video Oynatma” dersinde ne öğreneceğim?

Android'de basit ortam oynatma. Android Academy ile uygulamalı kodu tarayıcıda doğrudan çalıştırarak pratik yaparsın ve 7/24 yapay zeka koçu dersi çalışırken sorularını yanıtlar.

Android Academy öğrenmeye başlamak için deneyim gerekli mi?

Önceden deneyim gerekmez. CoddyKit'te Android Academy, başlangıçtan ileri seviyeye kadar yapılandırıldığı için buradan başlayabilir veya başından başlayıp kendi hızında ilerleme yapabilirsin. Bu, 4 dersinin 4. dersidir.

“Ses ve Video Oynatma” dersi ne kadar sürer?

Çoğu CoddyKit dersi yaklaşık 5–10 dakika sürer. Her biri kısa ve etkileşimli olduğu için sabit ilerleme yaparsın ve web ile uygulama arasında tam olarak bıraktığın yerden devam edebilirsin.

Bu Android Academy dersinde kod yazıp çalıştırabilir miyim?

Evet. Her Android Academy dersi yerleşik bir kod editörü içerir, bu sayede tarayıcıda gerçek kod yazıp çalıştırabilir ve anlık yapay zeka geri bildirimi alırsın — yerel kurulum gerekli değildir.

Bu kursun tüm dersleri

  1. Coil ile Görüntü Yükleme
  2. Yer Tutucular ve Hata Durumları
  3. Önbelleğe Alma ve Performans
  4. Ses ve Video Oynatma
← Android Academy Sayfasına Dön