8.使用MediaProjection+MediaCodec+AudioRecord+MediaMuxer将屏幕内容录制成视频文件

使用MediaProjection+MediaCodec+AudioRecord+MediaMuxer将屏幕内容录制成视频文件(完成度很差)

参考链接: 其中第三个最好

Andriod 录屏:AudioRecord、MediaProjection、MediaCodec、MediaMuxer_mediaprojection , mediacodec和mediamuxer-CSDN博客

GitHub - ChinaZeng/SurfaceRecodeDemo

MediaCodec录制音视频,并将合成为一个文件 - 简书 (jianshu.com)

安卓录屏的解决方案:

adb shell命令screenrecord
MediaRecorder+MediaProjection
MediaProjection+MediaCodec+AudioRecord+MediaMuxer

此外:Android 为开发者提供了MediaRecorder的类,可以帮助录屏。但是重要的缺陷:

  1. MediaRecorder控制粒度很粗,无法完成更多的自定义功能,如对音频数据处理
  2. MediaRecorder录制的效果很差,特别是音频效果。

模块介绍

MediaProjection:Android提供的截图、录屏的模块,可以提供一个surface;

MediaProjection | Android Developers (google.cn)

28以后,不能在活动申请录屏对象,必须有前台服务,实现弹窗方法提示用户,还得有通知才能用。

Android 10 Media projections require a foreground service of type ServiceInfo.FOREGROUND_SERVICE_TY-CSDN博客

使用startForeground()创建前台Service_startforeground();-CSDN博客

AudioRecord : Android音频录制的重要的模块,可以读取到PCM裸流数据;

MediaCodec:音视频硬编解码的重要模块,这里负责两项工作:

将PCM音频硬编码压缩AAC格式
将提供的surface的视频数据硬编码成H264格式

MeidaMuxer:音视频混合器,负责将AAC、H264合成mp4格式;

BUG

  1. 像素奇数
    在这里插入图片描述

android.media.MediaCodec$CodecException: Error 0xfffffc0e-CSDN博客

录屏的长宽中存在奇数。

  1. 录的视频无法播放
    是因为编码原因:

    在MediaCodec的onOutputFormatChanged回调中调用这个
    mVideoTrack = mMediaMuxer.addTrack(mediaFormat);
    mMediaMuxer.start();

    在onOutputBufferAvailable回调中调用
    mMediaMuxer.writeSampleData(mVideoTrack, byteBuffer, bufferInfo);

Code

代码基本参考GitHub - ChinaZeng/SurfaceRecodeDemo

所以没必要展示了

学习

1.

Android 屏幕直播分享之MediaProjection和MediaCodec分析 - 简书 (jianshu.com)

对于录屏,需要通过用户获取录屏权限,以及一个前台通知。

surface的创建:

在创建VirtualDisplay时,注意如下:

a.width、height分别代表录制display对应的宽和高像素大小;

b.surface传值不能为null,为null时,没有屏幕数据产出;

c.当surface为surfaceView.getHolder().getSurface()时,录屏会直接在surfaceView上显示,在加载surfaceview时,需要执行surfaceView.getHolder().setFixedSize(VIDEO_WIDTH, VIDEO_HEIGHT),VIDEO_WIDTH和VIDEO_HEIGHT需要跟createVirtualDisplay时传入的width和height保持一致,否则的话,surfaceview内的视频会有拉伸或位移

d.当surface = vencoder.createInputSurface()时,获取MediaCodec的surface,这个surface其实就是一个入口,屏幕作为输入源就会进入这个入口,然后交给MediaCodec编码,可以将数据通过网络传输给其他设备显示。

2.

Camera2+MediaCodec+AudioRecord+MediaMuxer实现录制功能(带源码)_camera2 录制-CSDN博客

3.

Andriod 录屏:AudioRecord、MediaProjection、MediaCodec、MediaMuxer_mediaprojection , mediacodec和mediamuxer-CSDN博客

这篇博客给了一个较好的模型设计,分析了不同模块间的关联

在这里插入图片描述

4.

MediaCodec录制音视频,并将合成为一个文件 - 简书 (jianshu.com)

MediaCodec硬编码pcm2aac - 简书 (jianshu.com)

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值