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