با Media Player شروع کنید

این سند مفاهیم اولیه ای را که باید قبل از کار با Media Player با آنها آشنا باشید معرفی می کند.

کلاس های صدا و تصویر

کلاس های زیر صدا و تصویر را در فریم ورک اندروید پخش می کنند:

  • MediaPlayer : این کلاس API اصلی برای پخش صدا و ویدئو است.
  • AudioManager : این کلاس منابع صوتی و خروجی صدا را روی یک دستگاه مدیریت می کند.

اعلامیه های آشکار

قبل از شروع توسعه برنامه خود با استفاده از MediaPlayer، مطمئن شوید که مانیفست شما دارای اعلان های مناسب برای اجازه استفاده از ویژگی های مرتبط است.

  • مجوز اینترنت: اگر از MediaPlayer برای استریم محتوای مبتنی بر شبکه استفاده می کنید، برنامه شما باید دسترسی به شبکه را درخواست کند.

    <uses-permission android:name="android.permission.INTERNET" />
    
  • مجوز Wake Lock: اگر برنامه پخش‌کننده شما نیاز دارد که صفحه نمایش کم نور نشود یا پردازنده در حالت خواب نباشد، یا از روش‌های MediaPlayer.setScreenOnWhilePlaying(boolean) یا MediaPlayer.setWakeMode(android.content.Context, int) استفاده می‌کند، باید این مجوز را درخواست کنید. .

    <uses-permission android:name="android.permission.WAKE_LOCK" />
    

از کلاس MediaPlayer استفاده کنید

کلاس MediaPlayer n جزء ضروری چارچوب رسانه است. یک شی از این کلاس می تواند با حداقل تنظیمات، صدا و تصویر را واکشی، رمزگشایی و پخش کند. MediaPlayer از چندین منبع رسانه ای پشتیبانی می کند، از جمله:

  • منابع محلی
  • URI های داخلی، مانند نمونه ای که ممکن است از یک Content Resolver دریافت کنید
  • URL های خارجی (جریان سازی)

برای فهرستی از فرمت‌های رسانه‌ای که Android پشتیبانی می‌کند، به صفحه فرمت‌های رسانه پشتیبانی شده مراجعه کنید.

نمونه هایی از کار با منابع صوتی

در اینجا مثالی از نحوه پخش صدایی که به عنوان یک منبع خام محلی در دسترس است (ذخیره شده در دایرکتوری res/raw/ برنامه شما) آورده شده است:

کاتلین

var mediaPlayer = MediaPlayer.create(context, R.raw.sound_file_1)
mediaPlayer.start() // no need to call prepare(); create() does that for you

جاوا

MediaPlayer mediaPlayer = MediaPlayer.create(context, R.raw.sound_file_1);
mediaPlayer.start(); // no need to call prepare(); create() does that for you

در این مورد، یک منبع "خام" فایلی است که سیستم سعی نمی کند به روش خاصی آن را تجزیه کند. با این حال، محتوای این منبع نباید صوتی خام باشد. باید یک فایل رسانه ای با کدگذاری و فرمت مناسب در یکی از فرمت های پشتیبانی شده باشد.

و در اینجا نحوه بازی از یک URI موجود در سیستم به صورت محلی (که به عنوان مثال از طریق یک Content Resolver به دست آورده اید):

کاتلین

val myUri: Uri = .... // initialize Uri here
val mediaPlayer = MediaPlayer().apply {
    setAudioAttributes(
        AudioAttributes.Builder()
            .setContentType(AudioAttributes.CONTENT_TYPE_MUSIC)
            .setUsage(AudioAttributes.USAGE_MEDIA)
            .build()
    )
    setDataSource(applicationContext, myUri)
    prepare()
    start()
}

جاوا

Uri myUri = ....; // initialize Uri here
MediaPlayer mediaPlayer = new MediaPlayer();
mediaPlayer.setAudioAttributes(
    new AudioAttributes.Builder()
        .setContentType(AudioAttributes.CONTENT_TYPE_MUSIC)
        .setUsage(AudioAttributes.USAGE_MEDIA)
        .build()
);
mediaPlayer.setDataSource(getApplicationContext(), myUri);
mediaPlayer.prepare();
mediaPlayer.start();

پخش از یک URL راه دور با استفاده از جریان HTTP به این صورت است:

کاتلین

val url = "http://........" // your URL here
val mediaPlayer = MediaPlayer().apply {
    setAudioAttributes(
        AudioAttributes.Builder()
            .setContentType(AudioAttributes.CONTENT_TYPE_MUSIC)
            .setUsage(AudioAttributes.USAGE_MEDIA)
            .build()
    )
    setDataSource(url)
    prepare() // might take long! (for buffering, etc)
    start()
}

جاوا

String url = "http://........"; // your URL here
MediaPlayer mediaPlayer = new MediaPlayer();
mediaPlayer.setAudioAttributes(
    new AudioAttributes.Builder()
        .setContentType(AudioAttributes.CONTENT_TYPE_MUSIC)
        .setUsage(AudioAttributes.USAGE_MEDIA)
        .build()
);
mediaPlayer.setDataSource(url);
mediaPlayer.prepare(); // might take long! (for buffering, etc)
mediaPlayer.start();

از آماده سازی ناهمزمان برای بهبود عملکرد استفاده کنید

هنگام استفاده از MediaPlayer عملکرد را در نظر داشته باشید. برای مثال، اجرای فراخوانی prepare() می‌تواند زمان زیادی طول بکشد، زیرا ممکن است شامل واکشی و رمزگشایی داده‌های رسانه باشد. بنابراین، مانند هر روشی که ممکن است اجرای آن زمان زیادی طول بکشد، هرگز آن را از رشته رابط کاربری برنامه خود فراخوانی نکنید . انجام این کار باعث می‌شود تا زمانی که روش برگردد، UI پاسخ نمی‌دهد، که تجربه کاربری بدی است و می‌تواند باعث خطای ANR (Application Not Responding) شود.

برای جلوگیری از آویزان شدن رشته رابط کاربری خود، یک رشته دیگر ایجاد کنید تا MediaPlayer آماده شود و پس از اتمام به موضوع اصلی اطلاع دهید. چارچوب یک راه راحت برای انجام متد prepareAsync() برای انجام این کار فراهم می کند. این روش شروع به آماده سازی رسانه در پس زمینه می کند و بلافاصله برمی گردد. هنگامی که رسانه در حال donpreparing است، متد onPrepared() MediaPlayer.OnPreparedListener که از طریق setOnPreparedListener() پیکربندی شده است فراخوانی می شود.

بیشتر بدانید

Jetpack Media3 راه حل پیشنهادی برای پخش رسانه در برنامه شما است. در مورد آن بیشتر بخوانید .

این صفحات موضوعات مربوط به ضبط، ذخیره و پخش صدا و تصویر را پوشش می دهند: