1.主要流程

录屏(涉及的Android Api: MediaProjectionManager, MediaProjection,VirtualDisplay可以参考:https://blog.csdn.net/ss182172633/article/details/79480853)

编码(通常编为:H264编码,使用api: MediaCodec)

封包(使用的API:MediaMuxer)

发送(rtsp)

2.关于开源项目:ScreenRecorder

在界面中获取所有可配置的信息EncodeConfig(MediaCodec,MediaMuxer都会使用)

主要方法:

获取MediaProjectionManager实例

mMediaProjectionManager = (MediaProjectionManager) getApplicationContext().getSystemService(MEDIA_PROJECTION_SERVICE);

录屏授权

Intent captureIntent = mMediaProjectionManager.createScreenCaptureIntent();

startActivityForResult(captureIntent, REQUEST_MEDIA_PROJECTION);

授权后获取实例

MediaProjection mediaProjection = mMediaProjectionManager.getMediaProjection(resultCode, data);

VirtualDisplay virtualDisplay = mediaProjection.createVirtualDisplay("ScreenRecorder-display0",

config.width, config.height, 1 /*dpi*/,

DisplayManager.VIRTUAL_DISPLAY_FLAG_PUBLIC,

null /*surface*/, null, null);

mVirtualDisplay.setSurface(mVideoEncoder.getInputSurface());

创建封包器并丢数据进出

mMuxer = new MediaMuxer(mDstPath, MediaMuxer.OutputFormat.MUXER_OUTPUT_MPEG_4);

writeSampleData(mVideoTrackIndex, buffer, encodedData);

通过MediaCodec获取h264数据

MediaFormat format = createMediaFormat();

Log.d("Encoder", "Create media format: " + format);

String mimeType = format.getString(MediaFormat.KEY_MIME);

final MediaCodec encoder = createEncoder(mimeType);

try {

if (this.mCallback != null) {

// NOTE: MediaCodec maybe crash on some devices due to null callback

encoder.setCallback(mCodecCallback);

}

encoder.configure(format, null, null, MediaCodec.CONFIGURE_FLAG_ENCODE);

onEncoderConfigured(encoder);

encoder.start();

} catch (MediaCodec.CodecException e) {

Log.e("Encoder", "Configure codec failure!\n with format" + format, e);

throw e;

}

MediaCodec 运行状态,编码后的数据通过回掉返回

/**

* let media codec run async mode if mCallback != null

*/

private MediaCodec.Callback mCodecCallback = new MediaCodec.Callback() {

@Override

public void onInputBufferAvailable(MediaCodec codec, int index) {

mCallback.onInputBufferAvailable(BaseEncoder.this, index);

}

@Override

public void onOutputBufferAvailable(MediaCodec codec, int index, MediaCodec.BufferInfo info) {

mCallback.onOutputBufferAvailable(BaseEncoder.this, index, info);

}

@Override

public void onError(MediaCodec codec, MediaCodec.CodecException e) {

mCallback.onError(BaseEncoder.this, e);

}

@Override

public void onOutputFormatChanged(MediaCodec codec, MediaFormat format) {

mCallback.onOutputFormatChanged(BaseEncoder.this, format);

}

};

Android推流并录像,关于Android录屏并推流相关推荐

  1. Android 如何实现App在后台录屏

    在 Android 中实现 App 在后台录屏主要需要使用到 MediaProjection API. MediaProjection API 是 Android 5.0(API Level 21)引 ...

  2. (第一版) 完全免费的屏幕采集\录屏\直播推流的一体化工具

    这是我的第二个免费软件了, 为了方便大家,也有博友提出有这个需求,所以写了这个桌面采集\录屏\推流的一体化工具. 作为一个基本的桌面采集软件,麻雀虽小五脏俱全. 它的功能也算强大了, 基本够用. 用过 ...

  3. (第二版) 完全免费的屏幕采集\录屏\直播推流的一体化工具

    第二版是第一版的优化, 只因怕有些同学会不注意会以为没有改变,所以新起一篇, 但介绍还是承接之前的内容. 下载地址: (第二版)完全免费的屏幕采集\\录屏\\直播推流的一体化工具 第二版界面稍有变化 ...

  4. 【工具】Gif录像软件录制录屏(ScreenToGif)

    [工具]Gif录像软件录制录屏(ScreenToGif) screentogif: Screen to Gif是一款方便好用的小软件,可以用来快速录制屏幕上的指定区域,将其直接保存为GIF动画文件 ( ...

  5. C#开源录音组件、录像组件、录屏组件及demo源码

    在多媒体系统中,一般都会涉及到录音.录像.录屏问题,采集得到的数据可以用来传输.播放.或存储.所以,对于像课件录制系统.语音视频录制系统.录屏系统等,多媒体数据的采集就是最基础的功能之一. MCapt ...

  6. Android性能优化:定性和定位Android图形性能问题——以后台录屏进程为例

    原文链接:https://juejin.cn/post/7096288511053004830 作者github:https://github.com/NasdaqGodzilla 简介 发现.定性与 ...

  7. Android、iOS如何实现自动化录屏,超实用!

    阅读本文大约需要1分钟. 背景 在做移动端自动化测试的过程中,有很多场景需要录制设备的屏幕视频,比如Crash现场记录,启动/页面加载耗时类的评测等,那么如何实现Android和iOS设备的屏幕录制呢 ...

  8. android手机截图gif,bash 一键录屏 Android 生成 gif 文件脚本

    目的 编写 bash 脚本, 实现一行命令得到 Android 手机录制屏幕 gif 动图文件. 博主使用 ubuntu 系统, shell 为 bash. 这个脚本也可以用在 mac 系统上. 听说 ...

  9. Android开发之在软件内录屏录画面,直接CV就能用

    关于Android开发录屏的资料,真的是很难找到那种拿来就能用的,不是付费专栏就是要积分才能下载源码,起不到任何帮助.我需要的是录制软件画面,找到的几个例子都是录制时返回桌面,然后弹出小窗口开始录制桌 ...

最新文章

  1. 钢结构节点输出软件_BIM助力桥梁钢结构设计施工一体化建设
  2. Vue——prop双向绑定解决方案
  3. 计算机网络面试题整理
  4. 【WIN10】VisualStateManager使用說明
  5. python多进程间通信_python多进程间通信代码实例
  6. linux查看执行过的命令行,在Linux命令终端中查看和编辑曾执行过的命令 – LINUX笔记 – CFEI.NET...
  7. mysql 大量数据 更改索引_MySql——来自狂神说Java - 贤贤贤sir
  8. 手机恶意软件激增,使用代码签名证书防范恶意侵害
  9. linux串口导致死机,Linux系统死机情况分析与处理方案介绍
  10. python爬取快手视频_【原创开源】快手爬虫,根据id批量爬取用户的所有图集和视频...
  11. AT89C51单片机的8位竞赛抢答器的protues仿真设计_倒计时可调
  12. 大数据项目实战——基于某招聘网站进行数据采集及数据分析(一)
  13. 通过python获取浏览器cookie
  14. NRF52840开发注意
  15. 科技爱好者周刊(第 150 期):当音乐还是稀缺的时候
  16. 使用UMI仿今日头条首页
  17. 由浅入深的分析HashMap原理
  18. Golang入门,安装与环境配置,简单代码入门
  19. Vagrant up启动失败 invalid byte sequence in UTF-8 (ArgumentError)
  20. 《Ext JS 6.2实战》节选——迁移管理模版

热门文章

  1. Python3自定义排序
  2. 协同软件的应用和技术发展
  3. 软件说明|Google地球影像下载及导航软件无法使用的解决办法
  4. springboot 根据请求IP做的分布式限流
  5. 脉冲编码调制的简单介绍
  6. 学漫画设计需要学习什么内容?
  7. 试题 算法提高 珠心算测验
  8. Getting_Started_with_QNX_Neutrino -- Chapter 2:Message Passing
  9. log-pilot 多行日志合并multiline
  10. OpenGL(5)深入理解Pipeline, State, Context