• havlenapetrFFMpeg OnVideoSizeChangedListener接口的实现


    转载自:http://blog.csdn.net/yarpee/article/details/6910877

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

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

        // 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中修改如下函数:

        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 " + arg1 + " height:" + arg2);
                if(mOnVideoSizeChangedListener != null)
                {
                    Log.d(TAG, "mOnVideoSizeChangedListener != null");
                    mOnVideoSizeChangedListener.onVideoSizeChanged(null, arg1, arg2);
                }
                else
                {
                    Log.d(TAG, "mOnVideoSizeChangedListener == null");
                }
            }
        }

    FFMpegMovieViewAndroid中修改如下函数:

        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 " + 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中的如下函数:

    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;
    }
  • 相关阅读:
    安装VS 2015完成后,VS2012 打开报错
    ASP.NET MVC 项目中 一般处理程序ashx 获取Session
    windows平台 查看 dll 程序集 PublicKeyToken
    MySQL 表与字段编码格式报错
    Linux系统下安装MongoDB 指南
    ASP.NET 访问路径 错误提示 HTTP 错误 404.8 原来路径中包含bin目录被拒绝
    ASP.NET 大文件上传
    将类型(int,string,…)转换为 T 类型
    直接插入排序
    MySQL 优化之索引合并(index_merge)
  • 原文地址:https://www.cnblogs.com/oasis2008/p/2542871.html
Copyright © 2020-2023  润新知