添加链接
link管理
链接快照平台
  • 输入网页链接,自动生成快照
  • 标签化管理网页链接

这篇博客只是一个Surface+MediaPlayer简单使用方法的说明。至于其中自定义界面,功能增加之类的可以查看之前的博客:

https://blog.csdn.net/lpCrazyBoy/article/details/79842906

MediaPlayer相关方法详解

1)获得MediaPlayer实例:

可以 直接new 或者调用 create 方法创建:

MediaPlayer mp = new MediaPlayer();
MediaPlayer mp = MediaPlayer.create(this, R.raw.test);  //无需再调用setDataSource

另外create还有这样的形式: create(Context context, Uri uri, SurfaceHolder holder) 通过Uri和指定 SurfaceHolder 【抽象类】 创建一个多媒体播放器

2)设置播放文件:

//①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文件夹平级的assets文件夹里,然后使用下述代码设置DataSource:

AssetFileDescriptor fileDescriptor = getAssets().openFd("rain.mp3");
m_mediaPlayer.setDataSource(fileDescriptor.getFileDescriptor(),fileDescriptor.getStartOffset(), fileDescriptor.getLength());

3)其他方法

  • getCurrentPosition ( ):得到当前的播放位置
  • getDuration () :得到文件的时间
  • getVideoHeight () :得到视频高度
  • getVideoWidth () :得到视频宽度
  • isLooping ():是否循环播放
  • isPlaying ():是否正在播放
  • pause ():暂停
  • prepare ():准备(同步)
  • prepareAsync ():准备(异步)
  • release() :释放MediaPlayer对象
  • reset ():重置MediaPlayer对象
  • seekTo(int msec) :指定播放的位置(以毫秒为单位的时间)
  • setAudioStreamType(int streamtype) :指定流媒体的类型
  • setDisplay(SurfaceHolder sh) :设置用SurfaceHolder来显示多媒体
  • setLooping(boolean looping) :设置是否循环播放
  • setOnBufferingUpdateListener(MediaPlayer.OnBufferingUpdateListener listener) : 网络流媒体的缓冲监听
  • setOnCompletionListener(MediaPlayer.OnCompletionListener listener) : 网络流媒体播放结束监听
  • setOnErrorListener(MediaPlayer.OnErrorListener listener) : 设置错误信息监听
  • setOnVideoSizeChangedListener(MediaPlayer.OnVideoSizeChangedListener listener) : 视频尺寸监听
  • setScreenOnWhilePlaying(boolean screenOn) :设置是否使用SurfaceHolder显示
  • setVolume(float leftVolume, float rightVolume) :设置音量
  • start ():开始播放
  • stop ():停止播放

附加两个播放本地音乐和网络音乐的方法:

* 播放本地音乐 * @param filePath private void playLocalSound(String filePath) { // initialize Uri here Uri myUri = Uri.fromFile(new File(filePath)); MediaPlayer mediaPlayer = new MediaPlayer(); mediaPlayer.setAudioStreamType(AudioManager.STREAM_MUSIC); try { mediaPlayer.setDataSource(getApplicationContext(), myUri); mediaPlayer.prepare(); mediaPlayer.start(); } catch (IOException e) { e.printStackTrace(); * 播放网络音乐(加载会比较慢,可以考虑使用异步任务) * @param url private void playUrlSound(String url) { MediaPlayer mediaPlayer = new MediaPlayer(); mediaPlayer.setAudioStreamType(AudioManager.STREAM_MUSIC); try { mediaPlayer.setDataSource(url); mediaPlayer.prepare(); // might take long! (for buffering, etc) mediaPlayer.start(); } catch (IOException e) { e.printStackTrace();

使用Surface+MediaPlayer播放视频的步骤:

1、初始化SurfaceHolder对象,SurfaceHolder是SurfaceView的控制器。

2、实现SurfaceHolder的Callback接口。

3、在接口方法SurfaceCreated()中创建MediaPlayer对象并赋值。

直接上代码:

package com.deepreality.mediaplayerdemo;
import android.content.Context;
import android.media.AudioManager;
import android.media.MediaPlayer;
import android.os.Bundle;
import android.support.annotation.Nullable;
import android.support.v7.app.AppCompatActivity;
import android.view.SurfaceHolder;
import android.view.SurfaceView;
import android.view.View;
import android.widget.Button;
public class SurfaceViewActivity extends AppCompatActivity implements View.OnClickListener, SurfaceHolder.Callback {
    private Context mContext;
    private SurfaceView mSurfaceView;
    private MediaPlayer mMediaPlayer;
    private SurfaceHolder mSurfaceHolder;
    private Button btnPlayVideo, btnPauseVideo, btnStopVideo;
    @Override
    protected void onCreate(@Nullable Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_surfaceview);
        mContext = this;
        bindViews();
        viewsAddListener();
        surfaceHolderInit();
    private void bindViews() {
        mSurfaceView = findViewById(R.id.Activity_SurfaceView_svVideo);
        btnPlayVideo = findViewById(R.id.Activity_SurfaceView_btnPlayVideo);
        btnPauseVideo = findViewById(R.id.Activity_SurfaceView_btnPauseVideo);
        btnStopVideo = findViewById(R.id.Activity_SurfaceView_btnStopVideo);
    private void viewsAddListener() {
        btnPlayVideo.setOnClickListener(this);
        btnPauseVideo.setOnClickListener(this);
        btnStopVideo.setOnClickListener(this);
     * 初始化SurfaceHolder类,SurfaceView的控制器
    private void surfaceHolderInit() {
        mSurfaceHolder = mSurfaceView.getHolder();
        mSurfaceHolder.addCallback(this);
        mSurfaceHolder.setFixedSize(320, 220);
    @Override
    protected void onDestroy() {
        super.onDestroy();
        if (mMediaPlayer.isPlaying()) {
            mMediaPlayer.stop();
        mMediaPlayer.release();
    @Override
    public void onClick(View v) {
        switch (v.getId()) {
            case R.id.Activity_SurfaceView_btnPlayVideo: {
                mMediaPlayer.start();
                break;
            case R.id.Activity_SurfaceView_btnPauseVideo: {
                mMediaPlayer.pause();
                break;
            case R.id.Activity_SurfaceView_btnStopVideo: {
                mMediaPlayer.stop();
                break;
            default:break;
    @Override
    public void surfaceCreated(SurfaceHolder holder) {
        mMediaPlayer = MediaPlayer.create(mContext, R.raw.lesson);
        mMediaPlayer.setAudioStreamType(AudioManager.STREAM_MUSIC);
        //设置显示视频显示在SurfaceView上
        mMediaPlayer.setDisplay(holder);
    @Override
    public void surfaceChanged(SurfaceHolder holder, int format, int width, int height) {
    @Override
    public void surfaceDestroyed(SurfaceHolder holder) {
                    这篇博客只是一个Surface+MediaPlayer简单使用方法的说明。至于其中自定义界面,功能增加之类的可以查看之前的博客:https://blog.csdn.net/lpCrazyBoy/article/details/79842906MediaPlayer相关方法详解1)获得MediaPlayer实例:可以直接new或者调用create方法创建:MediaPlayer...
				
在 Android 视频播放器 (一):使用VideoView播放视频 我们讲了一下如何使用VideoView播放视频,了解了基本的播放器的一些知识和内容。也知道VideoView内部封装的就是MediaPlayer,本文就介绍如何使用MediaPlayer播放视频MediaPlayerAndroid的一个多媒体播放类,其提供的API能满足简单的大部分音视频播放需求。 下面简单...
public class MyVideoView extends SurfaceView { private static final String TAG = "MiGuAdVideoView"; private boolean isReady = false; private int position = 0;//续播时间 private String url ...
应当随时学习,学习一切;应当集全力,以求知道更多,知道一切。 目录结构1. 前言2. MediaPlayer介绍3. MediaPlayer 实战3.1 简易音频播放器第一步:布局设置第二步:实现逻辑第三步:申请权限3.2 简易音频播放器第一步:设置布局第二步:简易音频播放器Demo 1. 前言 最近在学习 Android多媒体方面的知识,为此进行了整理,作为自己的学习输出。本篇主要分享AndroidMediaplayer API 方面的知识点,以及 demo——简易音频播放器。在demo会分享两.
自定义视频播放器自述xml部分Java对面部分需要使用到的Animation资源需要自定义的工具类 自己写的一个简易视频播放器,如果有需要的话欢迎参考和转载,但拒绝抄袭,谢谢理解与配合。 转载地址: xml部分 <?xml version="1.0" encoding="utf-8"?> <androidx.constraintlayout.widget.ConstraintLayout xmlns:android="http://schemas.android.com/apk/re
人工智能-项目实践-动作识别-TensorFlow android demo 车道线 车辆 人脸 动作 骨架 识别 检测 抽烟 打电话 闭眼 睁眼 目前本Demo模型能识别出 抽烟 打电话 闭眼 睁眼 TensorFlowObjectDetectionAPIModel 为检测规则画框 TensorFlowImageClassifier2 为车道检测之后不规则绘制(因时间仓促 还没有进行绘图优化) 识别道路的测试方法请自行百度寻找图片或者视频都可以 TensorFlowImageClassifier3 是用来识别人体骨架的 这个模型是有特定输入和特定输出的 需要经过3层转换 才能使用 接下来准备上线道路障碍物识别... 最新版骨架识别目前支持区分各个身体部位具体情况请看注释 Camera2BasicFragment4 这是一个用检测来识别车道和前车 里面增加了点逻辑来判断是否是车道偏离或者前车过近 具体做法是 如果检测出线则判断斜率k = (y2-y1)/(x2-x1)然后设定一个固定斜率来判断是否是车道偏离 如果是检测出前面的车辆心点在横屏8分之2到8分之6的范围内则判断
这是一个 Android 平台上的 MediaPlayer 类的本地方法,用于设置视频渲染表面。它是 MediaPlayer 类内部的私有方法,并不是公开的 API,因此我们无法直接调用它。通常情况下,我们可以通过调用 MediaPlayer 类的 setSurface() 方法,将一个 Surface 对象传递给 MediaPlayer 对象,以便让 MediaPlayer 在该 Surface 上渲染视频。具体来说,可以通过以下方式设置 Surface: ```java MediaPlayer mediaPlayer = new MediaPlayer(); SurfaceView surfaceView = findViewById(R.id.surface_view); SurfaceHolder surfaceHolder = surfaceView.getHolder(); surfaceHolder.addCallback(new SurfaceHolder.Callback() { @Override public void surfaceCreated(SurfaceHolder holder) { mediaPlayer.setDisplay(holder); @Override public void surfaceChanged(SurfaceHolder holder, int format, int width, int height) { // do nothing @Override public void surfaceDestroyed(SurfaceHolder holder) { mediaPlayer.setDisplay(null); 在上面的代码,我们创建了一个 MediaPlayer 对象和一个 SurfaceView 对象,然后通过 SurfaceView 的 getHolder() 方法获取其关联的 SurfaceHolder 对象。接下来,我们通过 SurfaceHolder 的 addCallback() 方法注册了一个回调函数,用于监听 Surface 的创建、改变和销毁事件。在回调函数,我们将 SurfaceHolder 对象传递给 MediaPlayer 对象的 setDisplay() 方法,以便让 MediaPlayer 在该 Surface 上渲染视频。当 Surface 销毁时,我们需要将 MediaPlayer 的显示表面设置为 null,以便 MediaPlayer 停止渲染视频