havlenapetr-FFMpeg OnVideoSizeChangedListener接口的实现

moruite在他的文章http://blog.csdn.net/moruite/article/details/6305944里说到了用havlenapetr-FFMpeg播放视频花屏的问题,需要自己实现OnVideoSizeChangedListener接口。网上没有找到相关的资料,自己研究了下。秉着OpenSource的观念,取之于havlenapetr-FFMpeg,还给世界。

 

FFMpegPlayer中添加如下接口和变量:

[java]  view plain copy
  1. // Add by yarpee start  
  2. /** 
  3.  * Interface definition of a callback to be invoked when the 
  4.  * video size is first known or updated 
  5.  */  
  6. public interface OnVideoSizeChangedListener  
  7. {  
  8.     /** 
  9.      * Called to indicate the video size 
  10.      * 
  11.      * @param mp        the MediaPlayer associated with this callback 
  12.      * @param width     the width of the video 
  13.      * @param height    the height of the video 
  14.      */  
  15.     public void onVideoSizeChanged(FFMpegPlayer mp, int width, int height);  
  16. }  
  17.   
  18. /** 
  19.  * Register a callback to be invoked when the video size is 
  20.  * known or updated. 
  21.  * 
  22.  * @param listener the callback that will be run 
  23.  */  
  24. public void setOnVideoSizeChangedListener(OnVideoSizeChangedListener listener)  
  25. {  
  26.     Log.d(TAG, "setOnVideoSizeChangedListener");  
  27.     mOnVideoSizeChangedListener = listener;  
  28. }  
  29.   
  30. private static OnVideoSizeChangedListener mOnVideoSizeChangedListener;  
  31. // Add by yarpee end  


FFMpegPlayer中修改如下函数:

[java]  view plain copy
  1. private static void postEventFromNative(Object mediaplayer_ref,  
  2.                                         int what, int arg1, int arg2, Object obj)  
  3. {  
  4.     switch(what) {  
  5.     case MEDIA_INFO_FRAMERATE_VIDEO:  
  6.         Log.d(TAG, "Video fps:" + arg1);  
  7.         break;  
  8.     case MEDIA_INFO_FRAMERATE_AUDIO:  
  9.         Log.d(TAG, "Audio fps:" + arg1);  
  10.         break;  
  11.     case MEDIA_SET_VIDEO_SIZE:  
  12.         Log.d(TAG, "Video width:" + arg1 + " height:" + arg2);  
  13.         if(mOnVideoSizeChangedListener != null)  
  14.         {  
  15.             Log.d(TAG, "mOnVideoSizeChangedListener != null");  
  16.             mOnVideoSizeChangedListener.onVideoSizeChanged(null, arg1, arg2);  
  17.         }  
  18.         else  
  19.         {  
  20.             Log.d(TAG, "mOnVideoSizeChangedListener == null");  
  21.         }  
  22.     }  
  23. }  


FFMpegMovieViewAndroid中修改如下函数:

[java]  view plain copy
  1.   private void openVideo(SurfaceHolder surfHolder) {  
  2.     try {  
  3.         mPlayer.setDisplay(surfHolder);  
  4.           
  5.     // Add by yarpee  
  6.         // 必须在prepare前设置listener  
  7.     mPlayer.setOnVideoSizeChangedListener(new FFMpegPlayer.OnVideoSizeChangedListener()  
  8.     {  
  9.         public void onVideoSizeChanged(FFMpegPlayer mp, int width, int height)  
  10.         {  
  11.             // 注意此处不能用mp,mp为null  
  12.             int videoWidth = mPlayer.getVideoWidth();  
  13.             int videoHeight = mPlayer.getVideoHeight();  
  14.             if(videoHeight != 0 && videoWidth != 0)  
  15.             {  
  16.                 Log.d(TAG, "setFixedSize width:" + videoWidth + " height:" + videoHeight);  
  17.                 getHolder().setFixedSize(videoWidth, videoHeight);  
  18.             }  
  19.         }  
  20.     });  
  21.       
  22.         mPlayer.prepare();  
  23. catch (IllegalStateException e) {  
  24.     Log.e(TAG, "Couldn't prepare player: " + e.getMessage());  
  25. catch (IOException e) {  
  26.     Log.e(TAG, "Couldn't prepare player: " + e.getMessage());  
  27. }  
  28.   }  


C代码修改Mediaplayer.cpp中的如下函数:

[cpp]  view plain copy
  1. status_t MediaPlayer::prepare()  
  2. {  
  3.     status_t ret;  
  4.     mCurrentState = MEDIA_PLAYER_PREPARING;  
  5.     av_log_set_callback(ffmpegNotify);  
  6.     if ((ret = prepareVideo()) != NO_ERROR) {  
  7.         mCurrentState = MEDIA_PLAYER_STATE_ERROR;  
  8.         return ret;  
  9.     }  
  10.     if ((ret = prepareAudio()) != NO_ERROR) {  
  11.         mCurrentState = MEDIA_PLAYER_STATE_ERROR;  
  12.         return ret;  
  13.     }  
  14.     mCurrentState = MEDIA_PLAYER_PREPARED;  
  15.   
  16.     // Add by yarpee  
  17.     notify(5, mVideoWidth, mVideoHeight);  
  18.       
  19.     return NO_ERROR;  
  20. }  



转自 https://github.com/tewilove/faplayer

你可能感兴趣的:(havlenapetr-FFMpeg OnVideoSizeChangedListener接口的实现)