-
Notifications
You must be signed in to change notification settings - Fork 246
PlayRecord
wshichang edited this page Mar 16, 2017
·
6 revisions
从融合版v2.2.6开始,播放端开始支持播放录屏功能。由于录屏需要用到编码模块所以此功能只能在融合版环境中使用。支持输出的视频格式为MP4或者FLV。
录播主要是通过KSYMediaPlayer的setVideoRawDataListener和setOnAudioPCMAvailableListener两个接口获取解码后的视频数据和音频数据,然后将数据交给编码器进行编码、封装最后存储为我们所需的视频数据;
如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
即可在制定位置找到录制的视频文件。