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

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

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