Skip to content

KSYTextureView

xinbaicheng edited this page Feb 9, 2017 · 24 revisions

KSYTextureView简介

KSYTextureView封装了TextureView与KSYMediaPlayer,接口与KSYMediaPlayer保持一致,但将setSurface和setDisplay两个接口去除,其相关逻辑已移至KSYTextureView内部处理,用户无需再做处理。
KSYTextureView在软解或硬解的情况下均可使用,并支持在硬解情况下前后台切换不黑屏或花屏、切后台音频播放、旋转、缩放、截图等功能
KSYTextureView实现了TextureView.SurfaceTextureListener并在初始化时设置了对应的监听器,不建议用户再设置SurfaceTextureListener
需要注意的是在前后台切换时需调用相关接口,具体可见文档的 前后台切换 这一节内容

版本要求

v1.5.4及以上版本。

Android版本要求

Android 4.1(API Level 16)及以上

KSYVideoView vs KSYTextureView

KSYTextureView与KSYVideoView的功能点对比如下所示,在使用硬解时KSYTextureView有很大优势
如果用户对于Android系统版本并不敏感并且倾向于使用硬解,推荐使用KSYTextureView

功能 KSYVideoView KSYTextureView
系统版本要求 2.3 (API Level 9) 4.1 (API Level 16)
硬解旋转 NO YES
硬解缩放 NO YES
硬解截图 NO YES
硬解播放镜像 NO YES
硬解前后台切换是否黑屏 YES NO

注意事项

分享处理

版本要求: v1.6.1及以上

在播放界面将视频分享至微信、QQ时,在分享前需调用setComeBackFromShare(boolean comeBackFromShare)方法,参数comeBackFromShare为true表示要做视频分享。
如果没有调用此函数分享回来后会有一直黑屏问题,下面以QQ分享为例:

    btn_shareQQ.setOnClickListener(new View.OnClickListener() {
        @Override
        public void onClick(View view) {
            // 调用对应的接口
            if(mVideoView != null){
                mVideoView.setComeBackFromShare(true);
            }
            // 分享视频至QQ所需的设置
            tencent =  Tencent.createInstance("1105762334", getApplicationContext());
            final Bundle params = new Bundle();
            params.putInt(QQShare.SHARE_TO_QQ_KEY_TYPE, QQShare.SHARE_TO_QQ_TYPE_DEFAULT);
            params.putString(QQShare.SHARE_TO_QQ_TITLE, "要分享的标题");
            params.putString(QQShare.SHARE_TO_QQ_SUMMARY,  "要分享的摘要");
            params.putString(QQShare.SHARE_TO_QQ_TARGET_URL,  "http://www.qq.com/news/1.html");
            params.putString(QQShare.SHARE_TO_QQ_IMAGE_URL,"http://imgcache.qq.com/qzone/space_item/pre/0/66768.gif");
            params.putString(QQShare.SHARE_TO_QQ_APP_NAME,  "测试应用222222");
            params.putInt(QQShare.SHARE_TO_QQ_EXT_INT,  80);
            tencent.shareToQQ(TextureVideoActivity.this, params,mShareListener );
        }
   });

基本用法

首先需在你的布局中添加KSYTextureView

    <com.ksyun.media.player.KSYTextureView
        android:id="@+id/ksy_textureview"
        android:layout_width="match_parent"
        android:layout_height="match_parent"
        tools:targetApi="ice_cream_sandwich"/>

KSYTextureView的调用接口与KSYMediaPlayer的调用方式相同,具体可参考KSYMediaPlayer接口调用方式,下面我们对KSYTextureView的主要调用点进行说明:

初始化

    public class VideoPlayerActivity extends Activity{
        protected void onCreate(Bundle savedInstanceState) {
            super.onCreate(savedInstanceState);
            setContentView(R.layout.your_layout);

            //不需要再显示的创建mVideoView
            mVideoView = (KSYTextureView) findViewById(R.id.ksy_textureview);
            //设置监听器
            mVideoView.setOnBufferingUpdateListener(mOnBufferingUpdateListener);
            mVideoView.setOnCompletionListener(mOnCompletionListener);
            mVideoView.setOnPreparedListener(mOnPreparedListener);
            mVideoView.setOnInfoListener(mOnInfoListener);
            mVideoView.setOnVideoSizeChangedListener(mOnVideoSizeChangeListener);
            mVideoView.setOnErrorListener(mOnErrorListener);
            mVideoView.setOnSeekCompleteListener(mOnSeekCompletedListener);
            //设置播放参数
            mVideoView.setBufferTimeMax(2.0f);
            mVideoView.setTimeout(5, 30);
            //......
            //(其它参数设置)
            //......
            //设置播放地址并准备
            mVideoView.setDataSource("http://your_address.flv");
            mVideoView.prepareAsync();
        }
    }

开始播放

播放器内部完成初始化后会调用OnPreparedListener的onPrepared。所以需要在开始播放之前设置所需的缩放模式,然后调用start开始播放。经过此步之后应该可以在设备上看到你所播放的视频。

    private IMediaPlayer.OnPreparedListener mOnPreparedListener = new IMediaPlayer.OnPreparedListener() {
        @Override
        public void onPrepared(IMediaPlayer mp) {
            if(mVideoView != null) {
                // 设置视频伸缩模式,此模式为裁剪模式
                mVideoView.setVideoScalingMode(KSYMediaPlayer.VIDEO_SCALING_MODE_SCALE_TO_FIT_WITH_CROPPING);
                // 开始播放视频
                mVideoView.start();
            }
        }
    }

停止播放

当不想再继续播放时,需要调用stop来停止播放

    private View.OnClickListener mStopButton = new View.OnClickListener() {
        @Override
        public void onClick(View v) {
            if(mVideoView != null){
                mVideoView.stop();
            }
        }
    }

播放新视频

在开始新的播放之前需要调用reset对播放器进行重置,然后再开始新的播放。需要注意的是reset后之前设置的播放参数都会被重置,所以reset后需要重新设置播放参数。对于播放新的视频建议使用这种方式,如果通过reload方式切换新的视频由于分辨率与原视频不同在切换过程中会出现短暂拉伸情况。

    if (mVideoView != null){
        //当前有视频正在播放,需先停止当前播放
        mVideoView.stop();
        //重置播放
        mVideoView.reset();
        //重新设置播放参数
        mVideoView.setBufferTimeMax(2.0f);
        mVideoView.setTimeout(5, 30);
        mVideoView.setRotateDegree(90);
        //......
        //(其它参数设置)
        //......
        //设置新的播放地址
        mVideoView.setDataSource("http://your_new_address.mp4");
        mVideoView.prepareAsync();
    }

前后台切换

在播放过程中进行前后台切换时需要调用相应的接口:切后台调runInBackground,切回前台调runInForeground。在v1.6.1之后runInForeground的行为由原来的切回前台直接播放调整为若调用runInBackground时设置为音频后台播放(即参数设为true),则切回前台调用runInForeground后自动恢复播放状态。若调用runInBackground时设置参数为false,则切回前台调用runInForeground后播放仍处于暂停状态,需要用户手动调用播放start启动播放。

    @Override
    protected void onPause() {
        super.onPause();
        if (mVideoView != null) {
            //mAudioBackgroundPlay为true表示切换到后台后仍然播放音频
            mVideoView.runInBackground(mAudioBackgroundPlay);
        }
    }

    @Override
    protected void onResume() {
        super.onResume();
        if (mVideoView != null) {
            mVideoView.runInForeground();
        }
    }

在其它非前后的操作中,如果也出现了硬解黑屏声音正常的问题,也可以通过在适当的位置调用这两个接口来解决;

播放释放

当不再进行播放且要离开所在Activity时,需要调用release将播放释放。注意此调用只有在不再进行播放且离开Activity时才能调用。如果只是停止此次播放以便播放新的视频请参看上面的"再次播放"说明。

    private void videoPlayEnd() {
        if (mVideoView != null) {
            //释放播放器
            mVideoView.release();
        }
    }

以上就是KSYTextureView的主要调用处理,具体的用法请参考demo的TextureVideoActivity.java文件中的调用。

###KSYTextureView与KSYMediaPlayer接口对比 相比于KSYMediaPlayer的接口KSYTextureView有如下改动: ####去掉接口:

    void setSurface(Surface surface);
    void setDisplay(SurfaceHolder sh)
    void setSurfaceTexture(SurfaceTexture surfTexture);

####新增接口:

    void runInBackground(boolean audioPlay);//audioPlay:true后台音频继续播放 audioPlay:false停止所有播放
    void runInForeground();
Clone this wiki locally