您的位置:首页 > 其它

havlenapetr-FFMpeg实现OnVideoSizeChangedListener

2012-06-01 02:19 423 查看
这篇文章,我是转载于http://blog.csdn.net/yarpee/article/details/6910877。按照里面的步骤,我搞了一遍,最后播放出的视频画面就正常了。不过声音依然还是原来的,断断续续。该文章如下。

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

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

[java] view
plaincopy

// Add by yarpee start

/**

* Interface definition of a callback to be invoked when the

* video size is first known or updated

*/

public interface OnVideoSizeChangedListener

{

/**

* Called to indicate the video size

*

* @param mp the MediaPlayer associated with this callback

* @param width the width of the video

* @param height the height of the video

*/

public void onVideoSizeChanged(FFMpegPlayer mp, int width, int height);

}

/**

* Register a callback to be invoked when the video size is

* known or updated.

*

* @param listener the callback that will be run

*/

public void setOnVideoSizeChangedListener(OnVideoSizeChangedListener listener)

{

Log.d(TAG, "setOnVideoSizeChangedListener");

mOnVideoSizeChangedListener = listener;

}

private static OnVideoSizeChangedListener mOnVideoSizeChangedListener;

// Add by yarpee end

FFMpegPlayer中修改如下函数:

[java] view
plaincopy

private static void postEventFromNative(Object mediaplayer_ref,

int what, int arg1, int arg2, Object obj)

{

switch(what) {

case MEDIA_INFO_FRAMERATE_VIDEO:

Log.d(TAG, "Video fps:" + arg1);

break;

case MEDIA_INFO_FRAMERATE_AUDIO:

Log.d(TAG, "Audio fps:" + arg1);

break;

case MEDIA_SET_VIDEO_SIZE:

Log.d(TAG, "Video width:" + arg1 + " height:" + arg2);

if(mOnVideoSizeChangedListener != null)

{

Log.d(TAG, "mOnVideoSizeChangedListener != null");

mOnVideoSizeChangedListener.onVideoSizeChanged(null, arg1, arg2);

}

else

{

Log.d(TAG, "mOnVideoSizeChangedListener == null");

}

}

}

FFMpegMovieViewAndroid中修改如下函数:

[java] view
plaincopy

private void openVideo(SurfaceHolder surfHolder) {

try {

mPlayer.setDisplay(surfHolder);

// Add by yarpee

// 必须在prepare前设置listener

mPlayer.setOnVideoSizeChangedListener(new FFMpegPlayer.OnVideoSizeChangedListener()

{

public void onVideoSizeChanged(FFMpegPlayer mp, int width, int height)

{

// 注意此处不能用mp,mp为null

int videoWidth = mPlayer.getVideoWidth();

int videoHeight = mPlayer.getVideoHeight();

if(videoHeight != 0 && videoWidth != 0)

{

Log.d(TAG, "setFixedSize width:" + videoWidth + " height:" + videoHeight);

getHolder().setFixedSize(videoWidth, videoHeight);

}

}

});

mPlayer.prepare();

} catch (IllegalStateException e) {

Log.e(TAG, "Couldn't prepare player: " + e.getMessage());

} catch (IOException e) {

Log.e(TAG, "Couldn't prepare player: " + e.getMessage());

}

}

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

[cpp] view
plaincopy

status_t MediaPlayer::prepare()

{

status_t ret;

mCurrentState = MEDIA_PLAYER_PREPARING;

av_log_set_callback(ffmpegNotify);

if ((ret = prepareVideo()) != NO_ERROR) {

mCurrentState = MEDIA_PLAYER_STATE_ERROR;

return ret;

}

if ((ret = prepareAudio()) != NO_ERROR) {

mCurrentState = MEDIA_PLAYER_STATE_ERROR;

return ret;

}

mCurrentState = MEDIA_PLAYER_PREPARED;

// Add by yarpee

notify(5, mVideoWidth, mVideoHeight);

return NO_ERROR;

}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: 
相关文章推荐