Android使用SurfaceView播放视频 简单介绍
来源:互联网 发布:人工智能编程入门 编辑:程序博客网 时间:2024/06/04 19:48
Android中播放视频,简单就直接用VideoView,这是系统集成的一个视频播放组件,使用起来还是比较方便的。
这里要写的是使用SurfaceView播放视频,SurfaceView的方便之处我不再多说,具体使用方法如下。
直接上代码:
布局文件长这样:<?xml version="1.0" encoding="utf-8"?><RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"android:layout_width="match_parent"android:layout_height="match_parent"android:background="@color/color_black"> <RelativeLayout android:layout_width="match_parent" android:layout_height="match_parent" android:layout_centerInParent="true"> <SurfaceView android:layout_width="wrap_content" android:layout_height="wrap_content" android:id="@+id/video_surfaceview" android:layout_centerInParent="true"> </SurfaceView> <LinearLayout android:orientation="vertical" android:layout_width="wrap_content" android:layout_height="wrap_content" android:id="@+id/layout_loading" android:gravity="center" android:visibility="visible" android:layout_centerInParent="true"> <ProgressBar style="?android:attr/progressBarStyleSmall" android:layout_width="wrap_content" android:layout_height="wrap_content" android:id="@+id/progressBar3" /> <TextView android:layout_width="wrap_content" android:layout_height="wrap_content" android:text="正在加载..." android:id="@+id/tv_loading" android:textColor="@color/color_white" android:layout_marginLeft="5dp" /> </LinearLayout> </RelativeLayout> <LinearLayout android:orientation="horizontal" android:layout_width="match_parent" android:layout_height="wrap_content" android:layout_alignParentBottom="true" android:background="#88000000" android:padding="5dp" android:gravity="center_vertical"> <ImageView android:layout_width="wrap_content" android:layout_height="wrap_content" android:id="@+id/btn_play" android:src="@mipmap/media_pause_ic" /> <RelativeLayout android:layout_width="match_parent" android:layout_height="wrap_content" android:paddingLeft="10dp" android:paddingRight="5dp" android:layout_marginLeft="10dp"> <TextView android:layout_width="wrap_content" android:layout_height="wrap_content" android:text="00:00" android:id="@+id/tv_end_time" android:textColor="@color/color_white" android:layout_marginLeft="5dp" android:layout_alignParentRight="true" android:layout_centerVertical="true" /> <SeekBar android:id="@+id/seekBar" android:layout_width="match_parent" android:layout_height="wrap_content" style="@style/Widget.SeekBar.Normal" android:layout_toLeftOf="@+id/tv_end_time" android:layout_centerVertical="true" /> </RelativeLayout> </LinearLayout></RelativeLayout>
然后在Activity中使用,用SurfaceHolder.Callback,不多说,直接上代码:
大致内容是这样的:public class MediaPlayActivity extends Activity implements SurfaceHolder.Callback{public static final String NATIVE_MEDIA_URLS = "native_media";private MediaPlayer mMediaPlayer;private SurfaceView mPreview;private SurfaceHolder mHolder;private boolean isShow = false;private ImageView btnPlay;private SeekBar mSeekBar;private TextView tvEndTime;private Timer mTimer;private int surfaceWidth,surfaceHeight;private View loadingView;private TextView tvLoading;private String mediaUrl;@Overrideprotected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); this.setContentView(R.layout.screen_media_player); isShow = true; mediaUrl = getIntent().getStringExtra("mediaUrl"); registerComponent();}private void registerComponent(){ mPreview = (SurfaceView)findViewById(R.id.video_surfaceview); mPreview.setFocusable(true); mHolder = mPreview.getHolder(); mHolder.addCallback(this); btnPlay = (ImageView)this.findViewById(R.id.btn_play); btnPlay.setImageResource(R.mipmap.media_pause_ic); btnPlay.setOnClickListener(new View.OnClickListener() { @Override public void onClick(View v) { if (isPlaying()) { pauseMedia(); } else { replayMedia(); } setMediaPlayerStatus(isPlaying()); } }); mSeekBar = (SeekBar)this.findViewById(R.id.seekBar); mSeekBar.setOnSeekBarChangeListener(new SeekBar.OnSeekBarChangeListener() { @Override public void onProgressChanged(SeekBar seekBar, int progress, boolean fromUser) { } @Override public void onStartTrackingTouch(SeekBar seekBar) { } @Override public void onStopTrackingTouch(SeekBar seekBar) { if (mMediaPlayer != null) { mMediaPlayer.seekTo(seekBar.getProgress() * 1000); } setMediaPlayerStatus(isPlaying()); } }); tvEndTime = (TextView)this.findViewById(R.id.tv_end_time); loadingView = this.findViewById(R.id.layout_loading); loadingView.setVisibility(View.GONE); tvLoading = (TextView)this.findViewById(R.id.tv_loading);}private void setMediaPlayerStatus(boolean playing){ if(playing){ btnPlay.setImageResource(R.mipmap.media_pause_ic); }else{ btnPlay.setImageResource(R.mipmap.media_play_ic); }}private void setProgress(int duration,int max){ int time = (max-duration)/1000; mSeekBar.setMax(max / 1000); if(duration<50) mSeekBar.setProgress(0); else mSeekBar.setProgress((duration / 1000)+1); tvEndTime.setText(String.format("%02d", time / 60) + ":" + String.format("%02d", time));}private void startTimer(){ if(mTimer == null){ mTimer = new Timer(); } setProgress(-1, mMediaPlayer.getDuration()); mTimer.schedule(new TimerTask() { @Override public void run() { if (isPlaying()) { mHandler.sendEmptyMessage(0); } } }, 0, 1000);}private Handler mHandler = new Handler(){ public void handleMessage(Message msg){ setProgress(mMediaPlayer.getCurrentPosition(),mMediaPlayer.getDuration()); }};private void initMedia(Uri uri){ mMediaPlayer = new MediaPlayer(); mMediaPlayer.setOnCompletionListener(new MediaPlayer.OnCompletionListener() { @Override public void onCompletion(MediaPlayer mediaPlayer) { setMediaPlayerStatus(false); setProgress(-1, mMediaPlayer.getDuration()); //mMediaPlayer.seekTo(500); } }); mMediaPlayer.setOnErrorListener(new MediaPlayer.OnErrorListener() { @Override public boolean onError(MediaPlayer mediaPlayer, int whatError, int extra) { Toast("播放失败"); releaseMedia(); return true; } }); mMediaPlayer.setOnPreparedListener(new MediaPlayer.OnPreparedListener() { @Override public void onPrepared(MediaPlayer mediaPlayer) { resetDisplay(mWidth, mHeight); //setProgress(mMediaPlayer.getCurrentPosition()+1, mMediaPlayer.getDuration()); loadingView.setVisibility(View.GONE); setMediaPlayerStatus(true); } }); mMediaPlayer.setDisplay(mHolder);}private void resetDisplay(int width,int height){ int vWidth = mMediaPlayer.getVideoWidth(); int vHeight = mMediaPlayer.getVideoHeight(); float scale = 1.0f * width / vWidth; if (vWidth < vHeight) { scale = 1.0f * height / vHeight; } RelativeLayout.LayoutParams params = new RelativeLayout.LayoutParams((int) (vWidth * scale), (int) (vHeight * scale)); params.addRule(RelativeLayout.CENTER_HORIZONTAL); params.addRule(RelativeLayout.CENTER_VERTICAL); mPreview.setLayoutParams(params); mMediaPlayer.setDisplay(mHolder);}private void playMedia(Uri uri){ if(mMediaPlayer == null){ initMedia(uri); } mMediaPlayer.reset(); try { mMediaPlayer.setDataSource(this, uri); mMediaPlayer.setAudioStreamType(AudioManager.STREAM_MUSIC); mMediaPlayer.prepare(); startTimer(); mMediaPlayer.start(); }catch(Exception e){ e.printStackTrace(); Toast("播放失败"); }}private void pauseMedia(){ if (mMediaPlayer != null) { mMediaPlayer.pause(); }}private void replayMedia(){ if(mMediaPlayer != null){ mMediaPlayer.start(); }}private boolean isPlaying(){ if(mMediaPlayer != null){ return mMediaPlayer.isPlaying(); } return false;}private void releaseMedia(){ if(mTimer != null){ mTimer.cancel(); mTimer = null; } if (mMediaPlayer != null) { mMediaPlayer.release(); mMediaPlayer = null; }}public void surfaceCreated(SurfaceHolder holder) { // TODO Auto-generated method stub //播放本地视频 playMedia(Uri.fromFile(new File(mediaUrl))); //若是网络视频,可先下载,然后播放}public void surfaceChanged(SurfaceHolder arg0, int format, int width, int height) { // TODO Auto-generated method stub this.surfaceWidth = width; this.surfaceHeight = height;}public void surfaceDestroyed(SurfaceHolder holder) { // TODO Auto-generated method stub releaseMedia();}public void onPause(){ isShow = false; super.onPause(); pauseMedia(); setMediaPlayerStatus(isPlaying());}public void onDestroy(){ super.onDestroy(); releaseMedia();}}
如此便可以使用surfaceview来播放视频了。其中细节不到位之处,只能自行补全。
1 0
- Android使用SurfaceView播放视频 简单介绍
- android使用SurfaceView播放视频
- 【Android SurfaceView】视频播放器 简单例子
- Android使用SurfaceView实现视频播放
- Android中使用SurfaceView视频播放器
- Android中使用SurfaceView视频播放器
- Android使用SurfaceView实现播放视频
- Android中使用SurfaceView视频播放器
- android中使用surfaceview进行视频播放
- Android:使用MediaPlayer和SurfaceView播放视频
- Android 使用 MediaPlayer + SurfaceView 播放视频
- android surfaceview 播放视频
- Android SurfaceView 播放视频
- Android--SurfaceView播放视频
- 使用SurfaceView 播放视频
- 使用SurfaceView播放视频
- 使用Surfaceview播放视频
- 简单的视频播放surfaceView
- Android Handler泄露问题
- 理解A*寻路算法
- iOS开发之利用MVVM框架来优化项目结构。对Controller瘦身以及MVC向MVVM框架的迁移。
- docker iptables配置
- NetFx40_IIS_schema_update.xml 配置文件的XML格式不正确
- Android使用SurfaceView播放视频 简单介绍
- prototype
- 字典转模型的几中方法
- java判断文件是否是utf8编码
- TCP协议1
- Attention And Memory in Deep Learning And NLP
- Delphi中的THashedStringList对象
- ProcessImageFileNameWin32
- Redis+Keepalived高可用方案详细分析