logo头像
Snippet 博客主题

AnyChat

Android play

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

支付宝打赏 微信打赏

打赏