Vitamio player
最近闲着无聊,研究了一下视频播放vitamio
一. 支持主流的视音频格式:mp3/mp4/mkv/avi/3gp/rmvb/mov/flv/wmv/ts/m4v
二、主要代码
视频播放器的主要代码
/** * @desc 视频文件列表 */ public class VideoListActivity extends Activity { private ListView listView; private VideoAdapter adapter; //所有视频播放地址 ArrayList<String> listPath = new ArrayList<String>(); private LinearLayout Refreash;//刷新 @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.videolist); Refreash = (LinearLayout)findViewById(R.id.refreash); for (int i = 0; i < AndroidApplication.listVideo.size(); i++) { listPath.add(AndroidApplication.listVideo.get(i).getUrl()); } listView = (ListView) this.findViewById(R.id.listAllVideo); adapter = new VideoAdapter(this, AndroidApplication.listVideo); listView.setAdapter(adapter); listView.setOnItemClickListener(new OnItemClickListener() { @Override public void onItemClick(AdapterView<?> arg0, View arg1, int arg2, long arg3) { if (Common.checkApkExist(VideoListActivity.this, Common.getVitamionByCPU())) { Intent intent = new Intent(VideoListActivity.this, PlayerActivity.class); intent.putExtra("file", listPath.get(arg2)); intent.putExtra("filelist", listPath); intent.putExtra("position", arg2); startActivity(intent); } else { Common.installVitamio(VideoListActivity.this, Common.getInstallVitamionNameByPack(Common.getVitamionByCPU())); } } }); setRefreashList(); } //刷新sd卡中的视频列表 private ScanSdReceiver scanSdReceiver; public void setRefreashList(){ Refreash.setOnClickListener(new View.OnClickListener() { @Override public void onClick(View v) { IntentFilter intentfilter = new IntentFilter(Intent.ACTION_MEDIA_SCANNER_STARTED); intentfilter.addAction(Intent.ACTION_MEDIA_SCANNER_FINISHED); intentfilter.addDataScheme("file"); scanSdReceiver = new ScanSdReceiver(); registerReceiver(scanSdReceiver, intentfilter); sendBroadcast(new Intent(Intent.ACTION_MEDIA_MOUNTED, Uri.parse("file://" + Environment.getExternalStorageDirectory().getAbsolutePath()))); } }); } // 开始扫描sd卡及结束sd卡扫描-广播 public class ScanSdReceiver extends BroadcastReceiver { private ProgressDialog progress; @Override public void onReceive(Context context, Intent intent) { String action = intent.getAction(); if (Intent.ACTION_MEDIA_SCANNER_STARTED.equals(action)) {// 开始扫描 progress = ProgressDialog.show(context, "提示", "请稍候,加载中..."); progress.show(); } else if (Intent.ACTION_MEDIA_SCANNER_FINISHED.equals(action)) {// 结束扫描 adapter.notifyDataSetChanged(); if (progress != null) progress.dismiss(); } } } }
import io.vov.vitamio.MediaPlayer;
import io.vov.vitamio.MediaPlayer.OnCompletionListener;
import io.vov.vitamio.MediaPlayer.OnPreparedListener;
import io.vov.vitamio.MediaPlayer.OnVideoSizeChangedListener;
import java.util.ArrayList;
import android.app.Activity;
import android.content.Context;
import android.os.Bundle;
import android.os.Handler;
import android.os.Message;
import android.view.KeyEvent;
import android.view.MotionEvent;
import android.view.SurfaceHolder;
import android.view.SurfaceView;
import android.view.View;
import android.view.View.OnClickListener;
import android.view.View.OnTouchListener;
import android.widget.Button;
import android.widget.SeekBar;
import android.widget.SeekBar.OnSeekBarChangeListener;
import android.widget.TextView;
import com.lenovo.androidphone.R;
import com.lenovo.androidphone.util.FileUtils;
/** * @desc Vitamio播放视频 * * 暂时播放本地视频 * * 支持主流的视音频格式:mp3/mp4/mkv/avi/3gp/rmvb/mov/flv/wmv/ts/m4v等 */ public class PlayerActivity extends Activity implements OnCompletionListener, OnVideoSizeChangedListener, OnPreparedListener, SurfaceHolder.Callback { private MediaPlayer mediaPlay; private View popView; private SurfaceView surfaceView; private SurfaceHolder surfaceHoder; private int mVideoWidth; private int mVideoHeight; private boolean mIsVideoSizeKnown = false; private boolean mIsVideoReadyToBePlayed = false; private ArrayList<String> pathList = new ArrayList<String>(); private int position = 0; private boolean playing = true; private boolean isPlaying = true; private Button btnPlay, btnUp, btnNext; private TextView totalTime_tv, playTime_tv; private SeekBar seekBar; private Handler handlerProgress; public Context context; //接触时间,如果大于5s,下面的空间就隐藏 long touchTime = 0; // 入口 @Override public void onCreate(Bundle icicle) { super.onCreate(icicle); setContentView(R.layout.mediaplayer); context = PlayerActivity.this; Bundle b = getIntent().getExtras(); if (b != null) { pathList = b.getStringArrayList("filelist"); position = b.getInt("position"); } popView = findViewById(R.id.popView); surfaceView = (SurfaceView) findViewById(R.id.surfaceView); surfaceHoder = surfaceView.getHolder(); surfaceHoder.addCallback(this); touchTime = System.currentTimeMillis(); new Thread(new TimeThread()).start(); } class TimeThread implements Runnable { public void run() { while (isPlaying) { if (System.currentTimeMillis() - touchTime > 5000) { handlerTime.sendEmptyMessage(0); } else { handlerTime.sendEmptyMessage(1); } } } } Handler handlerTime = new Handler() { @Override public void handleMessage(Message msg) { super.handleMessage(msg); if (msg.what == 0) { dismissPop(); } else if (msg.what == 1) { showPop(); } } }; @Override public void surfaceCreated(SurfaceHolder holder) { playVideo(); } @Override public void surfaceChanged(SurfaceHolder surfaceholder, int i, int j, int k) { } @Override public void surfaceDestroyed(SurfaceHolder surfaceholder) { } // 播放 private void playVideo() { doCleanUp(); try { mediaPlay = new MediaPlayer(this); mediaPlay.setDataSource(pathList.get(position)); mediaPlay.setDisplay(surfaceHoder); mediaPlay.prepareAsync(); mediaPlay.setScreenOnWhilePlaying(true); mediaPlay.setOnCompletionListener(this); mediaPlay.setOnPreparedListener(this); mediaPlay.setOnVideoSizeChangedListener(this); surfaceView.setOnTouchListener(new TouchListener()); initBtn(); } catch (Exception e) { } } @Override public void onPrepared(MediaPlayer mediaplayer) { mIsVideoReadyToBePlayed = true; if (mIsVideoReadyToBePlayed && mIsVideoSizeKnown) { startVideoPlayback(); setMaxProgress(); handlerProgress.sendEmptyMessage(1); } } @Override public void onCompletion(MediaPlayer arg0) { next(); } @Override public void onVideoSizeChanged(MediaPlayer mp, int width, int height) { if (width == 0 || height == 0) { return; } mIsVideoSizeKnown = true; mVideoWidth = width; mVideoHeight = height; if (mIsVideoReadyToBePlayed && mIsVideoSizeKnown) { startVideoPlayback(); } } private void startVideoPlayback() { surfaceHoder.setFixedSize(mVideoWidth, mVideoHeight); mediaPlay.start(); } class TouchListener implements OnTouchListener { @Override public boolean onTouch(View v, MotionEvent event) { touchTime = System.currentTimeMillis(); return false; } } public void initBtn() { btnPlay = (Button) findViewById(R.id.btnPlay); btnUp = (Button) findViewById(R.id.btnUp); btnNext = (Button) findViewById(R.id.btnNext); playTime_tv = (TextView) findViewById(R.id.playTime); totalTime_tv = (TextView) findViewById(R.id.maxTime); seekBar = (SeekBar) findViewById(R.id.seekbar); btnPlay.setOnClickListener(new OnClickListener() { @Override public void onClick(View v) { if (playing) { pause(); } else { play(); } playing = !playing; } }); btnUp.setOnClickListener(new OnClickListener() { @Override public void onClick(View v) { last(); } }); btnNext.setOnClickListener(new OnClickListener() { @Override public void onClick(View v) { next(); } }); seekBar.setOnSeekBarChangeListener(new OnSeekBarChangeListener() { @Override public void onStopTrackingTouch(SeekBar seekBar) { } @Override public void onStartTrackingTouch(SeekBar seekBar) { } @Override public void onProgressChanged(SeekBar seekBar, int progress, boolean fromUser) { if (fromUser) { //制定位置播放 mediaPlay.seekTo(progress); } } }); } // 播放 public void play() { if (!mediaPlay.isPlaying()) { btnPlay.setBackgroundResource(R.drawable.pause_selecor); mediaPlay.start(); } } // 暂停 public void pause() { if (mediaPlay.isPlaying()) { btnPlay.setBackgroundResource(R.drawable.play_selecor); mediaPlay.pause(); } } // 上一首 public void last() { if (position == 0) { position = pathList.size() - 1; } else if (position > 0) { position--; } playVideo2(); } // 下一首 public void next() { if (position == pathList.size() - 1) { position = 0; } else { position++; } playVideo2(); } private void playVideo2() { doCleanUp(); try { if (mediaPlay != null) { mediaPlay.stop(); mediaPlay.reset(); mediaPlay.setDataSource(pathList.get(position)); mediaPlay.prepareAsync(); startVideoPlayback(); } } catch (Exception e) { e.printStackTrace(); } } public void setMaxProgress() { //获取视频时长 int max = (int) mediaPlay.getDuration(); totalTime_tv.setText(FileUtils.toTime(max)); seekBar.setMax((int) max); seekBar.setProgress(0); setProgress(); } public void setProgress() { if (handlerProgress == null) { handlerProgress = new Handler() { @Override public void handleMessage(Message msg) { super.handleMessage(msg); if (msg.what == 1) { if (mIsVideoSizeKnown) { //获取已经播放的时长 int nowDur = (int) mediaPlay.getCurrentPosition(); playTime_tv.setText(FileUtils.toTime(nowDur)); seekBar.setProgress((int) nowDur); //下面一句话,循环刷新播放时间 handlerProgress.sendEmptyMessageDelayed(1, 600); } } } }; } } /** 显示view */ public void showPop() { popView.setVisibility(View.VISIBLE); } /** 隐藏view */ public void dismissPop() { popView.setVisibility(View.GONE); } @Override protected void onPause() { super.onPause(); releaseMediaPlayer(); doCleanUp(); } /** 当用户不可见的时候调用该方法 */ @Override protected void onStop() { super.onStop(); releaseMediaPlayer(); // 关闭该页面 if (!isFinishing()) { this.finish(); } } @Override protected void onDestroy() { super.onDestroy(); releaseMediaPlayer(); doCleanUp(); isPlaying = false; } private void releaseMediaPlayer() { if (mediaPlay != null) { mediaPlay.stop(); mediaPlay.release(); mediaPlay = null; } // 关闭该页面 if (!isFinishing()) { this.finish(); } } private void doCleanUp() { mVideoWidth = 0; mVideoHeight = 0; mIsVideoReadyToBePlayed = false; mIsVideoSizeKnown = false; } // 返回事件 public boolean onKeyDown(int keyCode, KeyEvent event) { if (keyCode == KeyEvent.KEYCODE_BACK && event.getRepeatCount() == 0) { finish(); return true; } return false; } }
浙公网安备 33010602011771号