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