【问题标题】:How to attach MediaPlayer with SurfaceView in android?如何在 Android 中将 MediaPlayer 与 SurfaceView 连接?
【发布时间】:2013-05-22 20:00:42
【问题描述】:

我正在使用 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 及以上。如何解决它请帮助我..

【问题讨论】:

    标签: android media-player surfaceview surfaceholder


    【解决方案1】:

    最后我自己修好了。刚刚在 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();
        }
    }
    

    【讨论】:

    • 它不适合我在 mp.setDisplay(holder) 行的 SurfaceCreated() 方法中抛出错误非法状态异常;
    【解决方案2】:

    这对我不起作用,在mp.setDisplay(holder); 行的surfaceCreated() 方法中抛出错误非法状态异常@

    声明mp.setDisplay(holder),如下所示:

    @Override
    public void surfaceCreated(SurfaceHolder holder) 
    {  
        mediaPlayer.setDataSource(this,uri);
        mediaPlayer.setAudioStreamType(AudioManager.STREAM_MUSIC);
        mediaPlayer.prepare(); 
        mp.setDisplay(holder);
        mp.start;
    }
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2012-09-09
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2011-10-18
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多