标签:
1. mediaplay+ surfaceView 2. VideoView 3. Jni play 4. 第三方 vitamio 5. 视频解码VLC ffmpeg MediaPlayer SurfaceView 1 SurfaceView 用于显示 SurfaceView 1采用双缓冲机制 ——-显示区 与缓冲区 这决定了它是播放器的最好选择 2 SurfaceView 的独特支持 可以由子线程直接控制 但是必须由mainThread 创建 view 基本都是在mainThread控制 包括创建 与控制 SurfaceView 的绘制可以在子线程完成 Code TestSurfaceView.Java SurfaceHolder可以把它当成surface的控制器,用来操纵surface mSurfaceView = (SurfaceView)this.findViewById(R.id.surfaceView_id); mSurfaceView.setZOrderOnTop(true); mSurHolder = mSurfaceView.getHolder(); mSurHolder.setType(SurfaceHolder.SURFACE_TYPE_PUSH_BUFFERS); mSurHolder.addCallback(Callback); public interface Callback { /** 创建时被调用 */ public void surfaceCreated(SurfaceHolder holder); /**surface 改变的时候 */ public void surfaceChanged(SurfaceHolder holder, int format, int width, int height); /* 销毁 */ public void surfaceDestroyed(SurfaceHolder holder); } MediaPlayer Android的MediaPlayer包含了Audio和video的播放功能,在Android的界面上,Music和Video两个应用程序都是调用MediaPlayer实现的。
MediaPlayer在底层是基于OpenCore(PacketVideo)的库实现的 private void playVideo() { try{ if(!isBusyPlay||count>2){ Log.d(TAG, "---------->playVideo"); count = 0; isBusyPlay = true; if(player != null){ player.reset(); }else{ player = new MediaPlayer();
//MediaPlayer mp = MediaPlayer.create(this, R.raw.test);//这时就不用调用setDataSource了 } //8 Listener player.setOnPreparedListener(this); player.setOnCompletionListener(this); player.setOnBufferingUpdateListener(this); player.setOnErrorListener(this); player.setDataSource(path); player.setDisplay(mSurHolder); player.setAudioStreamType(AudioManager.STREAM_MUSIC); player.setScreenOnWhilePlaying(true); player.prepareAsync(); }else{ count++; Log.d(TAG, "---------->busy playing"); } //设置监听事件 }catch(Exception e){ Log.d(TAG, "mediaplayer error: "+e.getMessage()); } } OnInfoListener ——视频加载中的控制 需要地处协调701 702 player.setOnInfoListener(new OnInfoListener() { @Override public booleanonInfo(MediaPlayer mp, int what, int extra) { // TODO Auto-generated method stub return false; } }); VideoView VideoView extends SurfaceView implements MediaPlayerControl 其实就是google 将surfaceView mediaplay 封装一层给开发者方便调用 使用android的VideoView任然存在有些不足,比如说系统带的控制条太难看,全屏播放时无法全屏。 MediaController mController = new MediaController(this); mVideoView.setMediaController(mController); // Play Video public void onStart() {
mVideoView.setVideoURI(mUri);
mVideoView.start(); super.onStart();
} Jni play 在java成直接调用,C的播放 底层直接控制播放器 与显示 底层控制其实更方便 java成的Mediaplay 都是调用底层方法 private native final intnative_setMetadataFilter(Parcel request); private static native final void native_init(); private native final void native_setup(Object mediaplayer_this); private native final void native_finalize(); SurfaceView的核心其实SurfaceFlinger 应用层对SurfaceView 很熟悉 framework 层SurfaceFlinger很熟悉 对于SurfaceFlinger其实我也不太明白 是知道由这么一回事 开机启动时候init 创建MediaServer SurfaceFinger 而其他的Systrm server 是zygote vitamio 感觉没什么多说的 https://www.vitamio.org/en/ 农民伯伯: http://www.cnblogs.com/over140/ 最新版 把播放器设置为新的进程 使用的时候要注意 视频解码 VLC http://www.videolan.org/vlc/ Github code http://git.oschina.net/cuiran/vlc-android http://xhc66.iteye.com/blog/797291 http://www.dotblogs.com.tw/jaelys/archive/2012/06/20/72934.aspx ffmpeg http://www.ffmpeg.org/ https://github.com/havlenapetr/FFMpeg https://github.com/appunite/AndroidFFmpeg http://3xin2yi.info/wwwroot/tech/doku.php/tech:multimedia:ffmpeg http://blog.csdn.net/conowen/article/details/7255776 http://blog.csdn.net/gobitan/article/details/22750719
标签:
原文地址:http://my.oschina.net/kylinhuang/blog/472794