Android 多媒体编程 视频播放

来源:互联网 发布:视频图片合成软件 编辑:程序博客网 时间:2024/05/16 05:15

1、MediaPlayer 可以作为视频播放器,要将视频显示在界面上需要用到
SufaceView组件:
SurfaceView
* 双缓冲技术
* 重量级组件
* 只要不可见,就不会创建,可见时,才会创建(也就是SurfaceView看不到视频无法播放)
* 只要不可见,就会销毁(当进入后台是surfaceview就会被销毁,下一次启动就会被从建)

package com.zh.videoplayer;import java.io.IOException;import android.app.Activity;import android.media.MediaPlayer;import android.os.Bundle;import android.os.Environment;import android.view.Menu;import android.view.MenuItem;import android.view.SurfaceHolder;import android.view.SurfaceView;public class MainActivity extends Activity {    private SurfaceHolder sh;    @Override    protected void onCreate(Bundle savedInstanceState) {        super.onCreate(savedInstanceState);        setContentView(R.layout.activity_main);        SurfaceView sv = (SurfaceView) findViewById(R.id.sv);        sh = sv.getHolder();        Thread t = new Thread() {            @Override            public void run() {                // TODO Auto-generated method stub                super.run();                try {                    sleep(200);                } catch (Exception e) {                    // TODO Auto-generated catch block                    e.printStackTrace();                }                runOnUiThread(new Runnable() {                    @Override                    public void run() {                        // TODO Auto-generated method stub                        MediaPlayer player = new MediaPlayer();                        player.reset();                        try {                            player.setDataSource(Environment.getExternalStorageDirectory().toString() + "/DCIM/zp.3gp");                            player.setDisplay(sh);                            player.prepare();                            player.start();                        } catch (Exception e) {                            // TODO Auto-generated catch block                            e.printStackTrace();                        }                    }                });            }        };        t.start();    }}

SurfaceView不可见就会被销毁,但MeidaPlayer不会被销毁,所以当下次使SurfaceView可见时就会出现乱音。
因此需要保证SurfaceView销毁时MeidaPlayer也被停止掉。
这里需要用到 Surface创建时的侦听。
SurfaceHolder.addCallback();
2、怎样使视频播放退出时能从退出的位置记录住播放的位置呢?
MediaPlayer退出销毁之前记住当前时间:
player.getCurrentPosition();
将这个时间传给seekTo

    player.start();    //这样就能保证每次能记录住退出的位置。    player.seekTo(currentPosition);

完整的代码:

package com.zh.videoplayer;import java.io.IOException;import android.app.Activity;import android.media.MediaPlayer;import android.os.Bundle;import android.os.Environment;import android.view.Menu;import android.view.MenuItem;import android.view.SurfaceHolder;import android.view.SurfaceHolder.Callback;import android.view.SurfaceView;public class MainActivity extends Activity {    private SurfaceHolder sh;    private int currentPosition;    @Override    protected void onCreate(Bundle savedInstanceState) {        super.onCreate(savedInstanceState);        setContentView(R.layout.activity_main);        SurfaceView sv = (SurfaceView) findViewById(R.id.sv);        sh = sv.getHolder();        sh.addCallback(new Callback() {  //SurfaceHolder对SurfaceView创建销毁改变的监控 。            private MediaPlayer player;            @Override // suface销毁时调用。            public void surfaceDestroyed(SurfaceHolder holder) {                // TODO Auto-generated method stub                if (player != null) {                currentPosition = player.getCurrentPosition();                    player.stop();                    player.release();                    player = null;                }            }            @Override // suface创建的时候调用            public void surfaceCreated(SurfaceHolder holder) {                if (player==null) {                    player = new MediaPlayer();                    player.reset();                    try {                        player.setDataSource(Environment.getExternalStorageDirectory().toString() + "/DCIM/zp.3gp");                        player.setDisplay(sh);                        player.prepare();                        player.start();                        //这样就能保证每次能记录住退出的位置。                        player.seekTo(currentPosition);                    } catch (Exception e) {                        // TODO Auto-generated catch block                        e.printStackTrace();                    }                }            }            @Override            public void surfaceChanged(SurfaceHolder holder, int format, int width, int height) {                // TODO Auto-generated method stub            }        });    }}

FFMPEG
* 开源免费的音视频编解码器
Vitamio(将其放到工作空间内然后导入 androidtool修复问题自动)
* 封装了FFMPEG的视频播放框架
* 对外提供的api全部都是javaApi
*vitamio是一个供别人关联的类库,就不在是一个可执行程序了。islibrary.
使用vitamio时需要在properties中android添加关联。
vitamio 的api 和Videoview 源生的api用的时间只需要将layout中的Videoview改成包名类名 的就可以。
FFMPEPG c语言写的,android上面用需要检测“”
//检测是否支持vitamio
if (!LibsChecker.checkVitamioLibs(this)) {return;}
最后需要在清单文件中关联初始化的Vitamio的activity。

  <activity android:name="io.vov.vitamio.activity.InitActivity"></activity>

添加一个Meidacontroller就添加了一个进度条。

package com.zh.videoview;import android.app.Activity;import android.os.Bundle;import android.os.Environment;import android.provider.MediaStore.Video;import android.view.Menu;import android.view.MenuItem;import io.vov.vitamio.LibsChecker;import io.vov.vitamio.widget.MediaController;import io.vov.vitamio.widget.VideoView;public class MainActivity extends Activity {    @Override    protected void onCreate(Bundle savedInstanceState) {        super.onCreate(savedInstanceState);        setContentView(R.layout.activity_main);        //检测是否支持vitamio    if (!LibsChecker.checkVitamioLibs(this)) {return;}        VideoView  vv =(VideoView) findViewById(R.id.vv);        vv.setVideoPath(Environment.getExternalStorageDirectory().toString()+"/video/xml.avi");        vv.start();        vv.setMediaController(new MediaController(this));    }}
0 0
原创粉丝点击