Android视频播放之MediaPlayer

来源:互联网 发布:c语言绝对值 编辑:程序博客网 时间:2024/05/16 04:07
现在项目要做音视频这块功能,这正是我相对比较薄弱的地方,项目中要用到,赶紧抓紧时间学习。看到了一编介绍不错的文章http://blog.csdn.net/shulianghan/article/details/38487967,值得学习。
    /** * Android API MediaPlayer示例 *  * @description: * @author ldm * @date 2016-4-20 上午10:42:06 */public class MediaPlayerActivity extends Activity implements OnClickListener {    private Button mlocalvideo;    private Button mstreamvideo;    private Button mlocalaudio;    private Button mresourcesaudio;    private static final String MEDIA = "media";    private static final int LOCAL_AUDIO = 1;    private static final int RESOURCES_AUDIO = 3;    private static final int STREAM_VIDEO = 5;    @Override    protected void onCreate(Bundle icicle) {        super.onCreate(icicle);        setContentView(R.layout.activity_mediaplayer);        initViewsAndEvents();    }    private void initViewsAndEvents() {        mlocalaudio = (Button) findViewById(R.id.localaudio);        mresourcesaudio = (Button) findViewById(R.id.resourcesaudio);        mlocalvideo = (Button) findViewById(R.id.localvideo);        mstreamvideo = (Button) findViewById(R.id.streamvideo);        mlocalaudio.setOnClickListener(this);        mresourcesaudio.setOnClickListener(this);        mlocalvideo.setOnClickListener(this);        mstreamvideo.setOnClickListener(this);    }    @Override    public void onClick(View v) {        switch (v.getId()) {        case R.id.localaudio:        case R.id.localvideo:            Intent intent = new Intent(MediaPlayerActivity.this.getApplication(),                    MediaPlayerDemo_Audio.class);            intent.putExtra(MEDIA, LOCAL_AUDIO);            startActivity(intent);            break;        case R.id.resourcesaudio:            Intent resIn = new Intent(MediaPlayerActivity.this.getApplication(),                    MediaPlayerDemo_Audio.class);            resIn.putExtra(MEDIA, RESOURCES_AUDIO);            startActivity(resIn);            break;        case R.id.streamvideo:            Intent streamIn = new Intent(MediaPlayerActivity.this,                    MediaPlayerDemo_Video.class);            streamIn.putExtra(MEDIA, STREAM_VIDEO);            startActivity(streamIn);            break;        }    }}
/** * OnBufferingUpdateListener可以获取视频音频流的缓冲状态; * OnCompletionListener播放完毕监听器 * OnPreparedListener准备播放相关接口 * OnVideoSizeChangedListener注册视频大小改变监听器 * SurfaceHolder.Callback:SurfaceView监听callback * @description: * @author ldm * @date 2016-4-20 上午9:46:16 */public class MediaPlayer_Video extends Activity implements        OnBufferingUpdateListener, OnCompletionListener,        OnPreparedListener, OnVideoSizeChangedListener, SurfaceHolder.Callback {    private static final String TAG = "MediaPlayerDemo";    //Video宽度    private int mVideoWidth;    //Video高度    private int mVideoHeight;    //播放器MediaPlayer    private MediaPlayer mMediaPlayer;    //播放界面SurfaceView    private SurfaceView mPreview;    //媒体播放器的载体 SurfaceHolder    private SurfaceHolder holder;    //文件路径    private String path;    //Bundle数据对象    private Bundle extras;    private static final String MEDIA = "media";    private static final int LOCAL_VIDEO = 1;    private static final int RESOURCES_AUDIO = 3;    private static final int STREAM_VIDEO = 5;    private boolean mIsVideoSizeKnown = false;    private boolean mIsVideoReadyToBePlayed = false;    @SuppressWarnings("deprecation")    @Override    public void onCreate(Bundle icicle) {        super.onCreate(icicle);        setContentView(R.layout.mediaplayer_2);        mPreview = (SurfaceView) findViewById(R.id.surface);        holder = mPreview.getHolder();        holder.addCallback(this);        //高版本上已经不推荐使用了 ,如果要兼容低版本(如Android 2.3或以下版本)要加上这段代码,不然播放时 只会有声音 没有图像。        holder.setType(SurfaceHolder.SURFACE_TYPE_PUSH_BUFFERS);        extras = getIntent().getExtras();    }    private void playVideo(Integer Media) {        doCleanUp();        try {            switch (Media) {                case LOCAL_VIDEO://本地文件(如SD卡)                    /*                     * TODO:将路径变量设置为本地媒体文件路径。                     */                    path = "";//这里要填写你所播放音视频的文件路径                    if (path == "") {                        Toast                                .makeText(                                        MediaPlayer_Video.this,                                        "Please edit MediaPlayerDemo_Video Activity, "                                                + "and set the path variable to your media file path."                                                + " Your media file must be stored on sdcard.",                                        Toast.LENGTH_LONG).show();                    }                    break;                case STREAM_VIDEO://流文件                    /**                     * 路径变量设置为mp4或3gpp格式的URL。应该使用Http协议。                     * 媒体播放器只能通过流的形式获取数据,所以需要:                     * 1。必须是媒体流数据。                     * 2。必须合理剪辑。                     */                    path = "";                    if (path == "") {                        // Tell the user to provide a media file URL.                        Toast                                .makeText(                                        MediaPlayer_Video.this,                                        "Please edit MediaPlayerDemo_Video Activity,"                                                + " and set the path variable to your media file URL.",                                        Toast.LENGTH_LONG).show();                    }                    break;                case RESOURCES_AUDIO:                    //播放放在诸如res/raw文件夹下的资源文件                    //直接通过mMediaPlayer = MediaPlayer.create(this, R.raw.test_cbr);                    //可以参考API Demos中AudioFxDemo类文件                    break;            }            // 创建MediaPlayer对象,传入文件数据并设备监听             mMediaPlayer = new MediaPlayer();            mMediaPlayer.setDataSource(path);            mMediaPlayer.setDisplay(holder);            //使用 create() 方法创建的 MediaPlayer, 直接指定了 媒体资源, 不需要再进行 调用 prepare() 方法;            mMediaPlayer.prepare();            mMediaPlayer.setOnBufferingUpdateListener(this);            mMediaPlayer.setOnCompletionListener(this);            mMediaPlayer.setOnPreparedListener(this);            mMediaPlayer.setOnVideoSizeChangedListener(this);            //指定音频流类型            mMediaPlayer.setAudioStreamType(AudioManager.STREAM_MUSIC);        } catch (Exception e) {            Log.e(TAG, "error: " + e.getMessage(), e);        }    }    public void onBufferingUpdate(MediaPlayer arg0, int percent) {        Log.d(TAG, "onBufferingUpdate percent:" + percent);    }    public void onCompletion(MediaPlayer arg0) {        Log.d(TAG, "onCompletion called");    }    public void onVideoSizeChanged(MediaPlayer mp, int width, int height) {        Log.v(TAG, "onVideoSizeChanged called");        if (width == 0 || height == 0) {            Log.e(TAG, "invalid video width(" + width + ") or height(" + height + ")");            return;        }        mIsVideoSizeKnown = true;        mVideoWidth = width;        mVideoHeight = height;        if (mIsVideoReadyToBePlayed && mIsVideoSizeKnown) {            startVideoPlayback();        }    }    public void onPrepared(MediaPlayer mediaplayer) {        Log.d(TAG, "onPrepared called");        mIsVideoReadyToBePlayed = true;        if (mIsVideoReadyToBePlayed && mIsVideoSizeKnown) {            startVideoPlayback();        }    }    public void surfaceChanged(SurfaceHolder surfaceholder, int i, int j, int k) {        Log.d(TAG, "surfaceChanged called");    }    public void surfaceDestroyed(SurfaceHolder surfaceholder) {        Log.d(TAG, "surfaceDestroyed called");    }    public void surfaceCreated(SurfaceHolder holder) {        Log.d(TAG, "surfaceCreated called");        playVideo(extras.getInt(MEDIA));    }    @Override    protected void onPause() {        super.onPause();        releaseMediaPlayer();        doCleanUp();    }    @Override    protected void onDestroy() {        super.onDestroy();        releaseMediaPlayer();        doCleanUp();    }    private void releaseMediaPlayer() {        if (mMediaPlayer != null) {            mMediaPlayer.release();            mMediaPlayer = null;        }    }    private void doCleanUp() {        mVideoWidth = 0;        mVideoHeight = 0;        mIsVideoReadyToBePlayed = false;        mIsVideoSizeKnown = false;    }    private void startVideoPlayback() {        Log.v(TAG, "startVideoPlayback");        holder.setFixedSize(mVideoWidth, mVideoHeight);        mMediaPlayer.start();    }}

布局文件activity_mediaplayer

<?xml version="1.0" encoding="utf-8"?><LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"    android:orientation="vertical"    android:layout_width="match_parent"    android:layout_height="match_parent"    >    <Button android:id="@+id/localvideo"        android:layout_height="wrap_content"        android:layout_width="match_parent"         android:text="@string/local_video"     />    <Button android:id="@+id/streamvideo"        android:layout_height="wrap_content"        android:layout_width="match_parent"         android:text="@string/stream_video"     />    <Button android:id="@+id/localaudio"        android:layout_height="wrap_content"        android:layout_width="match_parent"         android:text="@string/local_audio"     />    <Button android:id="@+id/resourcesaudio"        android:layout_height="wrap_content"        android:layout_width="match_parent"         android:text="@string/res_audio"     /></LinearLayout>

布局文件activity_mediaplayer_video

<?xml version="1.0" encoding="utf-8"?><LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"    android:orientation="vertical"    android:layout_width="match_parent"    android:layout_height="match_parent">    <SurfaceView android:id="@+id/surface"        android:layout_width="wrap_content"        android:layout_height="wrap_content"        android:layout_gravity="center">    </SurfaceView></LinearLayout>
0 0