Skip to content

PlayRecord

wshichang edited this page Mar 16, 2017 · 6 revisions

边播边录

从融合版v2.2.6开始,播放端开始支持播放录屏功能。由于录屏需要用到编码模块所以此功能只能在融合版环境中使用。支持输出的视频格式为MP4或者FLV

录播原理

录播主要是通过KSYMediaPlayer的setVideoRawDataListenersetOnAudioPCMAvailableListener两个接口获取解码后的视频数据和音频数据,然后将数据交给编码器进行编码、封装最后存储为我们所需的视频数据;

录播逻辑

播放端调用

TextureVideoActivity.java所示在创建好播放器后,创建playerRecord对象

 //创建playerRecord对象用于进行具体的录制工作
 playerRecord = new KSYPlayerRecord(this);
 //采用软编方式
 playerRecord.setEncodeMethod(StreamerConstants.ENCODE_METHOD_SOFTWARE);
 //设置帧率等参数
 playerRecord.setTargetFps(15);
 //......

 //播放设置为软件,注意必须设置成软解,否则没有解码数据输出
 mVideoView.setDecodeMode(KSYMediaPlayer.KSYDecodeMode.KSY_DECODE_MODE_SOFTWARE);
 //设置视频数据输出格式为YV12
 mVideoView.setOption(KSYMediaPlayer.OPT_CATEGORY_PLAYER, "overlay-format", KSYMediaPlayer.SDL_FCC_YV12);

 //注册数据回调以便将解码后的音视频数据传给playerRecord进行录制
 mVideoView.setVideoRawDataListener(playerRecord.getPlayerCapture());
 mVideoView.setOnAudioPCMAvailableListener(playerRecord.getPlayerCapture());
 //.......

 //完成前面的初始化工作后启动播放
 mVideoView.prepareAsync();

由于我们使用了setVideoRawDataListener来获得解码后的视频数据,所以需要在onPrepared中设置缓存buffer,如下所示:

 private IMediaPlayer.OnPreparedListener mOnPreparedListener = new IMediaPlayer.OnPreparedListener() {
        @Override
        public void onPrepared(IMediaPlayer mp) {
            mVideoWidth = mVideoView.getVideoWidth();
            mVideoHeight = mVideoView.getVideoHeight();

            //将宽高信息设置给playerRecord
            playerRecord.setTargetResolution(mVideoWidth, mVideoHeight);
            
            //创建图像缓存buffer并设置给player,由于输出的图像格式为YV12所以buffer的分配如下所示:
            ByteBuffer rawBuffer[] = new ByteBuffer[5]; //5 buffers is just an example    
            for (int index = 0; index < rawBuffer.length; index++) {
                int yStride = (mVideoWidth + 15) / 16 * 16;
                int cStride = ((yStride / 2) + 15) / 16 * 16;
                rawBuffer[index] = ByteBuffer.allocate(yStride * mVideoHeight + cStride * mVideoHeight);
                mVideoView.addVideoRawBuffer(rawBuffer[index].array());
            }

            // Set Video Scaling Mode
            mVideoView.setVideoScalingMode(KSYMediaPlayer.VIDEO_SCALING_MODE_SCALE_TO_FIT_WITH_CROPPING);

            //start player
            mVideoView.start();

            //其它播放相关逻辑,此处省略
            //......   
      }        
};

至此播放端的初始化工作基本完成,在视频开播后调用playerRecord的startRecord(String savepath) 函数设置存储文件路径名称启动录制。调用playerRecord的stopRecord即可在制定位置找到录制的视频文件。

录制逻辑

Clone this wiki locally