เริ่มต้นใช้งาน Media Player

เอกสารนี้จะแนะนำแนวคิดพื้นฐานที่คุณควรทำความคุ้นเคยก่อนที่จะใช้มีเดียเพลเยอร์

คลาสเสียงและวิดีโอ

คลาสต่อไปนี้จะเล่นเสียงและวิดีโอในเฟรมเวิร์ก Android

  • MediaPlayer: คลาสนี้เป็น API หลักสำหรับการเล่นเสียงและวิดีโอ
  • AudioManager: คลาสนี้จัดการแหล่งที่มาของเสียงและเอาต์พุตเสียงในอุปกรณ์

การประกาศไฟล์ Manifest

ก่อนเริ่มพัฒนาแอปพลิเคชันโดยใช้ MediaPlayer ให้ตรวจสอบว่าไฟล์ Manifest มีการประกาศที่เหมาะสมเพื่ออนุญาตให้ใช้ฟีเจอร์ที่เกี่ยวข้อง

  • สิทธิ์เข้าถึงอินเทอร์เน็ต: หากคุณใช้ 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 เป็นคอมโพเนนต์ที่สำคัญของเฟรมเวิร์กสื่อ ออบเจ็กต์ของคลาสนี้สามารถดึงข้อมูล ถอดรหัส และเล่นทั้งเสียงและวิดีโอได้โดยมีการตั้งค่าเพียงเล็กน้อย MediaPlayer รองรับแหล่งที่มาของสื่อหลายรายการ ซึ่งรวมถึง

  • แหล่งข้อมูลในเครื่อง
  • URI ภายใน เช่น URI ที่คุณอาจได้รับจาก Content Resolver
  • URL ภายนอก (การสตรีม)

ดูรายการรูปแบบสื่อที่ Android รองรับได้ที่หน้า "รูปแบบสื่อ ที่รองรับ"

ตัวอย่างการทำงานกับแหล่งที่มาของเสียง

ต่อไปนี้เป็นตัวอย่างวิธีเล่นเสียงที่พร้อมใช้งานเป็นทรัพยากรดิบในเครื่อง (บันทึกไว้ในไดเรกทอรี res/raw/ ของแอปพลิเคชัน)

Kotlin

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

Java

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 เป็นต้น)

Kotlin

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()
}

Java

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 จะมีลักษณะดังนี้

Kotlin

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()
}

Java

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 ของแอปพลิเคชัน การทำเช่นนี้จะทำให้ UI หยุดตอบสนองจนกว่าเมธอดจะแสดงผล ซึ่งส่งผลให้ผู้ใช้ได้รับประสบการณ์ที่ไม่ดีและอาจทำให้เกิดข้อผิดพลาด ANR (แอปพลิเคชันไม่ตอบสนอง)

หากต้องการหลีกเลี่ยงไม่ให้เธรด UI ค้าง ให้สร้างเธรดอื่นเพื่อเตรียม MediaPlayer และแจ้งเธรดหลักเมื่อดำเนินการเสร็จแล้ว เฟรมเวิร์กมีวิธีที่สะดวกในการดำเนินการเมธอด prepareAsync() เพื่อทำงานนี้ เมธอดนี้จะเริ่มเตรียมสื่อในเบื้องหลังและแสดงผลทันที เมื่อเตรียมสื่อเสร็จแล้ว ระบบจะเรียกเมธอด onPrepared() ของ MediaPlayer.OnPreparedListener ที่กำหนดค่าผ่าน setOnPreparedListener()

ดูข้อมูลเพิ่มเติม

Jetpack Media3 เป็นโซลูชันที่แนะนำสำหรับการเล่นสื่อในแอป อ่านข้อมูลเพิ่มเติม

หน้าเว็บเหล่านี้ครอบคลุมหัวข้อที่เกี่ยวข้องกับการบันทึก จัดเก็บ และเล่นเสียงและวิดีโอ