android - 如何在 android 中将 MediaPlayer 附加到 SurfaceView?

标签 android media-player surfaceview surfaceholder

我正在使用 android 媒体播放器对象构建视频播放器。我能听到音频,但视频没有出现在 SurfaceView 上。这是我的代码

public class PlayerActivity extends Activity implements SurfaceHolder.Callback {
    String path;
    private MediaPlayer mp;
    private SurfaceView mPreview;
    private SurfaceHolder holder;
    boolean pausing = false;
    public static String filepath;

    @Override
    public void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_player);

        getWindow().setFormat(PixelFormat.UNKNOWN);
        mPreview = (SurfaceView)findViewById(R.id.surfaceView);
        holder = mPreview.getHolder();
        holder.setFixedSize(176, 144);
        holder.addCallback(this);
        holder.setType(SurfaceHolder.SURFACE_TYPE_PUSH_BUFFERS);
        mp = new MediaPlayer();

        mp.setDisplay(holder);
        try {
            Intent intent = getIntent();
            Uri fileuri = intent.getData();
            filepath=fileuri.getPath();
        } catch(Exception e) {}

        try {
            mp.setDataSource(filepath);
            mp.prepare();
        } catch (IllegalArgumentException e) {
            e.printStackTrace();
        } catch (IllegalStateException e) {
            e.printStackTrace();
        } catch (IOException e) {
            e.printStackTrace();
        }
        mp.start();
    }
}

目标是android 2.3及以上。如何修复它请帮助我..

最佳答案

最后我自己修好了。刚刚在 surfaceCreated() 函数中调用了 mp.setDisplay(holder);。最终的代码是

public class PlayerActivity extends Activity implements SurfaceHolder.Callback {
    String path;
    private MediaPlayer mp;
    private SurfaceView mPreview;
    private SurfaceHolder holder;
    boolean pausing = false;
    public static String filepath;

    @Override
    public void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_player);

        getWindow().setFormat(PixelFormat.UNKNOWN);
        mPreview = (SurfaceView)findViewById(R.id.surfaceView);
        holder = mPreview.getHolder();
        holder.setFixedSize(800, 480);
        holder.addCallback(this);
        holder.setType(SurfaceHolder.SURFACE_TYPE_PUSH_BUFFERS);
        mp = new MediaPlayer();


        try{
            Intent intent = getIntent();

            Uri fileuri = intent.getData();
            filepath=fileuri.getPath();
        }catch(Exception e){}


    }
    protected void onPause(){
        super.onPause();
        mp.release();
    }

    @Override
    public void surfaceChanged(SurfaceHolder holder, int format, int width,
            int height) {
        // TODO Auto-generated method stub

    }

    @Override
    public void surfaceCreated(SurfaceHolder holder) {
        // TODO Auto-generated method stub
        mp.setDisplay(holder);
        play();
    }

    @Override
    public void surfaceDestroyed(SurfaceHolder holder) {
        // TODO Auto-generated method stub

    }
    void play(){
        try {
            mp.setDataSource(filepath);

            mp.prepare(); 

        } catch (IllegalArgumentException e) {
            e.printStackTrace();
        } catch (IllegalStateException e) {
            e.printStackTrace();
        } catch (IOException e) {
            e.printStackTrace();
        }
        mp.start();
    }
}

关于android - 如何在 android 中将 MediaPlayer 附加到 SurfaceView?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/16700587/

相关文章:

android - 如何为 Py4A 构建 numpy?

android - 在 Root 设备 Android 上更改动态壁纸

java - android循环出现问题-无法将值放入hashmap

android - android:如何使用Media Player设置播放列表的速度和音调?播放列表正在循环播放

android - 在状态 0 下调用媒体播放器,错误 (-38,0) 错误

方形屏幕上的 Android Camera Preview 已拉伸(stretch)

java - 如何将 ListView 项目 ID 传递给 ActionMode.Callback?

java - 如何正确使用JavaFX MediaPlayer?

android - 在透明 SurfaceView 之上添加 View ?

android - Arc on canvas 没有抗锯齿