aosp 录屏

官方文档:

Capture video and audio playback  |  Android media  |  Android Developers

录制类型:设备音频,mic录制等:

public enum ScreenRecordingAudioSource {
    NONE,
    INTERNAL,
    MIC,
    MIC_AND_INTERNAL;
}

代码目录:

 /frameworks/base/packages/SystemUI/src/com/android/systemui/screenrecord/ScreenInternalAudioRecorder.java

private void setupSimple() throws IOException {
   int size = AudioRecord.getMinBufferSize(
           mConfig.sampleRate, mConfig.channelInMask,
           mConfig.encoding) * 2;
   Log.d(TAG, "audio buffer size: " + size);
   AudioFormat format = new AudioFormat.Builder()
           .setEncoding(mConfig.encoding)
           .setSampleRate(mConfig.sampleRate)
   

原理在不同系统下有所不同。 ### Android系统原理及相关代码 自安卓4.4开始,系统提供了内置功能,可在adb下执行`screenrecord`命令录制幕,但普通用户使用不便。从安卓5.1开始,系统提供了`MediaProjection API`,可结合`MediaRecorder`或者`MediaCodec API`实现免root的全系统 [^3]。 基于`MediaProjection`实现有两种方案: - 结合`MediaRecorder`:以`MediaProjection`为输入,`MediaRecorder`为输出,原理清晰,实现简单,代码量少 [^4]。 - 结合`MediaCodec`:`MediaCodec`只是一个编码器,需考虑编码输入数据以及编码后数据输出方式等,原理复杂,实现困难,代码量多,但自由度高 [^4]。 以下是一个通过`MediaProjectionManager`发起授权的示例代码: ```java import android.app.Activity; import android.content.Intent; import android.media.projection.MediaProjection; import android.media.projection.MediaProjectionManager; import android.os.Bundle; import androidx.activity.result.ActivityResult; import androidx.activity.result.ActivityResultCallback; import androidx.activity.result.ActivityResultLauncher; import androidx.activity.result.contract.ActivityResultContracts; import androidx.appcompat.app.AppCompatActivity; public class MainActivity extends AppCompatActivity { private MediaProjectionManager mediaProjectionManager; private ActivityResultLauncher<Intent> activityResultLauncher; @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_main); mediaProjectionManager = (MediaProjectionManager) getSystemService(Activity.MEDIA_PROJECTION_SERVICE); activityResultLauncher = registerForActivityResult( new ActivityResultContracts.StartActivityForResult(), new ActivityResultCallback<ActivityResult>() { @Override public void onActivityResult(ActivityResult result) { if (result.getResultCode() == Activity.RESULT_OK) { Intent data = result.getData(); MediaProjection mediaProjection = mediaProjectionManager.getMediaProjection(result.getResultCode(), data); // 这里可以开始逻辑 } } }); Intent captureIntent = mediaProjectionManager.createScreenCaptureIntent(); activityResultLauncher.launch(captureIntent); } } ``` ### iOS系统原理 由于iOS系统的封闭性,苹果没有公开供开发者调用的录制幕内容的API。ShareREC应运而生,不过文档未详细提及ShareREC在iOS系统下具体的实现原理 [^2]。 ### AOSP单app原理 有提到在学习`SurfaceFlinger`课程时,有针对某个app进行单图层截图的实战项目,可考虑对其进行简单修改实现单app功能,但未详细阐述具体原理 [^1]。
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值