
本节介绍了Android Multimedia-MediaPlayer,我们可以通过此API播放音频和视频. 此类是Androd多媒体框架中的重要组件. 通过本课程,我们可以使用最少的步骤来获取,解码和播放音频和视频. 它支持三种不同的媒体来源:
有关Android支持的媒体格式的列表,请参阅: 支持的媒体格式文档
在本节中,我们将使用MediaPlayer编写一个播放音频和视频的简单示例!
官方API文档: MediaPlayer
您可以直接创建新的或调用create方法来创建:
MediaPlayer mp = new MediaPlayer();
MediaPlayer mp = MediaPlayer.create(this, R.raw.test); //无需再调用setDataSource
此外,create也具有以下形式: 通过Uri和指定的SurfaceHolder创建(上下文上下文,Uri urijava本地视频播放器,SurfaceHolder持有人)[Abstract class]创建一个多媒体播放器

//①raw下的资源:
MediaPlayer.create(this, R.raw.test);
//②本地文件路径:
mp.setDataSource("/sdcard/test.mp3");
//③网络URL文件:
mp.setDataSource("http://www.xxx.com/music/test.mp3");
此外,有多个setDataSource()方法,它们具有这种类型的参数: FileDescriptor. 使用此API时,您需要将文件放入res文件夹的级别资产文件夹中,然后使用以下代码来设置数据源:
AssetFileDescriptor fileDescriptor = getAssets().openFd("rain.mp3");
m_mediaPlayer.setDataSource(fileDescriptor.getFileDescriptor(),fileDescriptor.getStartOffset(), fileDescriptor.getLength());
渲染效果:

关键代码:
public class MainActivity extends AppCompatActivity implements View.OnClickListener{
private Button btn_play;
private Button btn_pause;
private Button btn_stop;
private MediaPlayer mPlayer = null;
private boolean isRelease = true; //判断是否MediaPlayer是否释放的标志
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
bindViews();
}
private void bindViews() {
btn_play = (Button) findViewById(R.id.btn_play);
btn_pause = (Button) findViewById(R.id.btn_pause);
btn_stop = (Button) findViewById(R.id.btn_stop);
btn_play.setOnClickListener(this);
btn_pause.setOnClickListener(this);
btn_stop.setOnClickListener(this);
}
@Override
public void onClick(View v) {
switch (v.getId()){
case R.id.btn_play:
if(isRelease){
mPlayer = MediaPlayer.create(this,R.raw.fly);
isRelease = false;
}
mPlayer.start(); //开始播放
btn_play.setEnabled(false);
btn_pause.setEnabled(true);
btn_stop.setEnabled(true);
break;
case R.id.btn_pause:
mPlayer.pause(); //停止播放
btn_play.setEnabled(true);
btn_pause.setEnabled(false);
btn_stop.setEnabled(false);
break;
case R.id.btn_stop:
mPlayer.reset(); //重置MediaPlayer
mPlayer.release(); //释放MediaPlayer
isRelease = true;
btn_play.setEnabled(true);
btn_pause.setEnabled(false);
btn_stop.setEnabled(false);
break;
}
}
}

注意:
在res / raw目录中播放音频文件,创建MediaPlayer会调用create方法,您不需要在第一次开始播放之前调用prepare(),如果您使用构建方法,则需要调用prepare ()方法!还在官方文档中发布了通过其他两种方式播放音频的示例代码:
本地Uri:
Uri myUri = ....; // initialize Uri here
MediaPlayer mediaPlayer = new MediaPlayer();
mediaPlayer.setAudioStreamType(AudioManager.STREAM_MUSIC);
mediaPlayer.setDataSource(getApplicationContext(), myUri);
mediaPlayer.prepare();
mediaPlayer.start();
外部网址:
String url = "http://........"; // your URL here
MediaPlayer mediaPlayer = new MediaPlayer();
mediaPlayer.setAudioStreamType(AudioManager.STREAM_MUSIC);
mediaPlayer.setDataSource(url);
mediaPlayer.prepare(); // might take long! (for buffering, etc)
mediaPlayer.start();
注意: 如果您通过URL以流形式播放音频文件,则该文件必须可以逐步下载

MediaPlayer主要用于播放音频,没有图像输出接口,因此我们需要使用其他组件来显示MediaPlayer回放的图像输出,我们可以使用SurfaceView进行显示,下面我们使用SurfaceView编写一个示例视频播放:
渲染效果:

实施代码:
布局文件: activity_main.xml
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:orientation="vertical"
android:padding="5dp">
<SurfaceView
android:id="@+id/sfv_show"
android:layout_width="match_parent"
android:layout_height="300dp" />
<Button
android:id="@+id/btn_start"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="开始" />
<Button
android:id="@+id/btn_pause"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="暂停 " />
<Button
android:id="@+id/btn_stop"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="终止" />
</LinearLayout>
MainActivity.java:

public class MainActivity extends AppCompatActivity implements View.OnClickListener, SurfaceHolder.Callback {
private MediaPlayer mPlayer = null;
private SurfaceView sfv_show;
private SurfaceHolder surfaceHolder;
private Button btn_start;
private Button btn_pause;
private Button btn_stop;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
bindViews();
}
private void bindViews() {
sfv_show = (SurfaceView) findViewById(R.id.sfv_show);
btn_start = (Button) findViewById(R.id.btn_start);
btn_pause = (Button) findViewById(R.id.btn_pause);
btn_stop = (Button) findViewById(R.id.btn_stop);
btn_start.setOnClickListener(this);
btn_pause.setOnClickListener(this);
btn_stop.setOnClickListener(this);
//初始化SurfaceHolder类,SurfaceView的控制器
surfaceHolder = sfv_show.getHolder();
surfaceHolder.addCallback(this);
surfaceHolder.setFixedSize(320, 220); //显示的分辨率,不设置为视频默认
}
@Override
public void onClick(View v) {
switch (v.getId()) {
case R.id.btn_start:
mPlayer.start();
break;
case R.id.btn_pause:
mPlayer.pause();
break;
case R.id.btn_stop:
mPlayer.stop();
break;
}
}
@Override
public void surfaceCreated(SurfaceHolder holder) {
mPlayer = MediaPlayer.create(MainActivity.this, R.raw.lesson);
mPlayer.setAudioStreamType(AudioManager.STREAM_MUSIC);
mPlayer.setDisplay(surfaceHolder); //设置显示视频显示在SurfaceView上
}
@Override
public void surfaceChanged(SurfaceHolder holder, int format, int width, int height) {}
@Override
public void surfaceDestroyed(SurfaceHolder holder) {}
@Override
protected void onDestroy() {
super.onDestroy();
if (mPlayer.isPlaying()) {
mPlayer.stop();
}
mPlayer.release();
}
}
本文来自电脑杂谈,转载请注明本文网址:
https://www.pc-fly.com/a/bofangqi/article-270679-1.html
小米的任何产品都是垃圾
IBM的笔记本业务不盈利了
让消费者方心