假设我在activity_main.xml
中创建了两个按钮,例如:
...
<Button
android:id="@+id/button1"
...
android:onClick="playMusic1"
android:text="music1.mp3"
/>
<Button
android:id="@+id/button2"
...
android:onClick="playMusic2"
android:text="music2.mp3"
/>
...
分别使用以下方式播放music1.mp3
和music2.mp3
:
...
public void playMusic1(View view)throws IOException {
Button passed_btn = (Button)view;
AssetFileDescriptor afd = getAssets().openFd(passed_btn.getText().toString());
MediaPlayer player = new MediaPlayer();
player.setDataSource(afd.getFileDescriptor(), afd.getStartOffset(), afd.getLength());
player.prepare();
player.start();
}
...
...
public void playMusic2(View view)throws IOException {
Button passed_btn = (Button)view;
AssetFileDescriptor afd = getAssets().openFd(passed_btn.getText().toString());
MediaPlayer player = new MediaPlayer();
player.setDataSource(afd.getFileDescriptor(), afd.getStartOffset(), afd.getLength());
player.prepare();
player.start();
}
...
启动应用程序时,我可以同时播放两首歌曲,这是因为MediaPlayer
在与主线程分开的线程中运行,但是here和enter link description here都不行关于MediaPlayer
处于线程中的任何内容。它确实提到了异步触发某些状态,但仅此而已(尽管可能我会错过它)。如果它确实在线程中运行,那么我们可以同时播放的媒体数量是多少?
答案 0 :(得分:1)
它确实在Thread
中运行。但这不是我们曾经考虑过的事情。当您开始播放媒体文件时-在本机实现(由本机媒体库处理)中,使用来自声源的字节创建新的Thread
。后来,此源被本机MediaService
占用为单个音频输出,并导航到HAL。