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;
}
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;
}
相关文章推荐
- havlenapetr-FFMpeg OnVideoSizeChangedListener接口的实现
- havlenapetr-FFMpeg OnVideoSizeChangedListener接口的实现
- havlenapetr-FFMpeg OnVideoSizeChangedListener接口的实现
- CheckBox多选按钮实现CompoundButton.OnCheckedChangeListener
- addTextChangedListener(文本监听)参数解释及实现EditText字数监听
- with ffmpeg to encode video for live streaming and for recording to files for on-demand playback
- 自定义组件-onFinishInflate&onSizeChanged
- Android onInterceptTouchEvent setOnChangedListener onTouchEvent
- android,view的执行过程 onDraw、onSizeChanged,onFinishInflate
- RadioGroup调用check(id)方法时,OnCheckedChangedListener被多次回调问题
- Android RecyclerView单击、长按事件标准实现:基于OnItemTouchListener + GestureDetector
- developer.Android.com:PhoneStateListener :onServiceStateChanged(ServiceState serviceState)
- 使用EditText的addTextChangedListener(TextWatcher watcher)方法对EditText实现监听
- Android RecyclerView单击、长按事件标准实现:基于OnItemTouchListener + GestureDetector
- android,view的执行过程onDraw、onSizeChanged,onFinishInflate
- 如何实现让ExpandableListView的父子item同时具备OnClickListener,onLongClickListener,onTouchEve
- AppBarLayout.OnOffsetChangedListener的使用
- Android程序:简单的SimpleAdapter实现(OnItemClickListener,OnScrollListener)
- onTouchEvent与实现setOnTouchListener
- EasyDemo*事件监听之EditText~addTextChangedListener(on Github)