首页 > 编程知识 正文

android 录屏代码,android录屏实现

时间:2023-05-05 10:25:15 阅读:265489 作者:1591

Android录屏分析

目录 Android录屏分析prepare方法(准备录制)MediaProjection、MediaRecorder、VirtualDisplay的介绍 开始与结束缩略图
在Android12 源码中设计了ScreenMediaRecorder 类来用于屏幕录制。

prepare方法(准备录制)

在ScreenMediaRecorder中有prepare()方法,进行了拉起后台服务,创建VirtualDisplay用于屏幕参数设定、设置录屏问文件路径等操作;

private void prepare() throws IOException, RemoteException, RuntimeException { //Setup media projection IBinder b = ServiceManager.getService(MEDIA_PROJECTION_SERVICE); IMediaProjectionManager mediaService = IMediaProjectionManager.Stub.asInterface(b); IMediaProjection proj = null; proj = mediaService.createProjection(mUser, mContext.getPackageName(), MediaProjectionManager.TYPE_SCREEN_CAPTURE, false); IBinder projection = proj.asBinder(); mMediaProjection = new MediaProjection(mContext, IMediaProjection.Stub.asInterface(projection)); File cacheDir = mContext.getCacheDir(); cacheDir.mkdirs(); mTempVideoFile = File.createTempFile("temp", ".mp4", cacheDir); // Set up media recorder mMediaRecorder = new MediaRecorder(); // Set up audio source if (mAudioSource == MIC) { mMediaRecorder.setAudioSource(MediaRecorder.AudioSource.DEFAULT); } mMediaRecorder.setVideoSource(MediaRecorder.VideoSource.SURFACE); mMediaRecorder.setOutputFormat(MediaRecorder.OutputFormat.MPEG_4); // Set up video DisplayMetrics metrics = new DisplayMetrics(); WindowManager wm = (WindowManager) mContext.getSystemService(Context.WINDOW_SERVICE); wm.getDefaultDisplay().getRealMetrics(metrics); int refreshRate = (int) wm.getDefaultDisplay().getRefreshRate(); int[] dimens = getSupportedSize(metrics.widthPixels, metrics.heightPixels, refreshRate); int width = dimens[0]; int height = dimens[1]; refreshRate = dimens[2]; int vidBitRate = width * height * refreshRate / VIDEO_FRAME_RATE * VIDEO_FRAME_RATE_TO_RESOLUTION_RATIO; mMediaRecorder.setVideoEncoder(MediaRecorder.VideoEncoder.H264); mMediaRecorder.setVideoEncodingProfileLevel( MediaCodecInfo.CodecProfileLevel.AVCProfileHigh MediaCodecInfo.CodecProfileLevel.AVCLevel3); mMediaRecorder.setVideoSize(width, height); mMediaRecorder.setVideoFrameRate(refreshRate); mMediaRecorder.setVideoEncodingBitRate(vidBitRate); mMediaRecorder.setMaxDuration(MAX_DURATION_MS); mMediaRecorder.setMaxFileSize(MAX_FILESIZE_BYTES); // Set up audio if (mAudioSource == MIC) { mMediaRecorder.setAudioEncoder(MediaRecorder.AudioEncoder.HE_AAC); mMediaRecorder.setAudioChannels(TOTAL_NUM_TRACKS); mMediaRecorder.setAudioEncodingBitRate(AUDIO_BIT_RATE); mMediaRecorder.setAudioSamplingRate(AUDIO_SAMPLE_RATE); } mMediaRecorder.setOutputFile(mTempVideoFile); mMediaRecorder.prepare(); // Create surface mInputSurface = mMediaRecorder.getSurface(); mVirtualDisplay = mMediaProjection.createVirtualDisplay( "Recording Display", width, height, metrics.densityDpi, DisplayManager.VIRTUAL_DISPLAY_FLAG_AUTO_MIRROR, mInputSurface, null, null); mMediaRecorder.setOnInfoListener(mListener); if (mAudioSource == INTERNAL || mAudioSource == MIC_AND_INTERNAL) { mTempAudioFile = File.createTempFile("temp", ".aac", mContext.getCacheDir()); mAudio = new ScreenInternalAudioRecorder(mTempAudioFile.getAbsolutePath(), mMediaProjection, mAudioSource == MIC_AND_INTERNAL); } } MediaProjection、MediaRecorder、VirtualDisplay的介绍

MediaProjection是5.0之后给开发者提供的新的截屏或者录屏的,MediaProjection的createVirtualDisplay方法用来捕捉屏幕

mVirtualDisplay = mMediaProjection.createVirtualDisplay( "Recording Display", width, height, metrics.densityDpi, DisplayManager.VIRTUAL_DISPLAY_FLAG_AUTO_MIRROR, mInputSurface, null, null);

其中8个参数分别为:
参数1:实际的流媒体显示实体名字,不能为null;
参数2:实际的流媒体显示实体的宽度,单位为像素,必须大于0;
参数3:实际的流媒体显示实体的高度,单位为像素,必须大于0;
参数4:实际的流媒体显示实体的像素密度,单位为dp,必须大于0;
参数5:实际的流媒体显示实体标志的结合
参数6:播放流媒体的surface实例,可为null,
参数7:实际的流媒体显示实体状态改变时的回调方法,可能为null;
参数8:调用参数7回调方法的handler;
MediaRecorde主要提供了一些方法用来支持录屏录音
setAudioSource(MediaRecorder.AudioSource.);
设置声音来源,一般传入 MediaRecorder. AudioSource.MIC参数指定录制来自麦克风的声音。(这里如果只录屏可以不设置)
setVideoSource(MediaRecorder.VideoSource.SURFACE);
设置用于录制的视频来源。如屏幕等
setOutputFormat(MediaRecorder.OutputFormat.THREE_GPP);
设置所录制的音视频文件的格式。
setOutputFile(getsaveDirectory() + temp + “.mp4”);
设置录制的音频文件的保存位置。
setVideoSize(width, height);最高只能设置640x480
设置要拍摄的宽度和视频的高度。
setVideoEncoder(MediaRecorder.VideoEncoder.H264);
设置视频的编码格式
setAudioEncoder(MediaRecorder.AudioEncoder.DEFAULT);
设置音频编码格式
setVideoEncodingBitRate(1024 * 1024);
设置所录制视频的编码位率。
setVideoFrameRate(18);
设置录制视频的捕获帧速率。
setOrientationHint(90);
设置输出的视频播放的方向提示。
setMaxDuration(30*1000);
设置录制会话的最长持续时间(以ms为单位)。
prepare();
准备录制
VirtualDisplay类代表一个虚拟显示器,需要调用DisplayManager 类的 createVirtualDisplay()方法,将虚拟显示器的内容渲染在一个Surface控件上,当进程终止时虚拟显示器会被自动的释放,并且所有的Window都会被强制移除。当不再使用它时,你应该调用release() 方法来释放资源。

开始与结束

start()方法开始录屏,其中mMediaRecorder是MediaRecorder的实例,recordInternalAudio()方法用来开始音频录制。

void start() throws IOException, RemoteException, RuntimeException { Log.d(TAG, "start recording"); prepare(); mMediaRecorder.start(); recordInternalAudio(); }

end()方法结束录屏,调用了mMediaRecorder的stop与release方法,stopInternalAudioRecording()方法中通过 mAudio.end()方法来停止录音。

void end() { mMediaRecorder.stop(); mMediaRecorder.release(); mInputSurface.release(); mVirtualDisplay.release(); mMediaProjection.stop(); mMediaRecorder = null; mMediaProjection = null; stopInternalAudioRecording(); Log.d(TAG, "end recording"); } 缩略图

在谷歌原生设计中,录屏的缩略图并非是视频的第一帧,而是前20帧中的最大有效帧作为预览图。这种设计的好处是避免了第一帧是黑色或者不清楚,从而使得用户看起来比较清晰,更好辨别出所录的视频内容;

版权声明:该文观点仅代表作者本人。处理文章:请发送邮件至 三1五14八八95#扣扣.com 举报,一经查实,本站将立刻删除。