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)); }}
- Android 多媒体编程 视频播放
- android 多媒体 视频播放
- android 多媒体编程(二) MediaPlayer 播放视频
- android 多媒体编程(三) VideoView播放视频
- android 多媒体编程(四) Vitamio播放视频
- Android 多媒体开发 视频播放
- Android多媒体--音视频播放
- android 多媒体编程(五) 调用系统播放器播放音乐/视频
- Android多媒体应用:视频存储和播放
- Android 多媒体应用:视频播放之Vitamio
- Android多媒体---VideoView(播放视频)
- Android中的多媒体音频和视频播放
- Android-多媒体之VideoView视频播放器
- Android多媒体(视频播放器-拍照-录像)
- Android------多媒体(视频播放器-拍照-录像)
- Android—多媒体(视频播放、拍照)
- Android MediaPlayer 多媒体(视频播放器)
- 多媒体开发---视频播放器开发(android)
- 从0开始,搭建SSM服务器框架
- Java for Web学习笔记(二七):JSTL(3)Core Tag(中)
- VS2010/MFC编程入门之前言
- SQLite 大数据量 新增 / 修改 提升效率的办法
- Java并发编程:深入剖析ThreadLocal
- Android 多媒体编程 视频播放
- Android颜色透明度比例对应16进度值
- solr_4.5.0_06:Solr 管理界面使用
- HDOJ 1047 Integer Inquiry
- 派生类的构造函数与析构函数
- Codeforces Round #367 (Div. 2) B Interesting drink【二分】
- 初学c/c++——new和delete
- Redis Sentinel下的数据一致性
- showdoc mac 安装流程