Android推流并录像,关于Android录屏并推流
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录屏并推流相关推荐
- Android 如何实现App在后台录屏
在 Android 中实现 App 在后台录屏主要需要使用到 MediaProjection API. MediaProjection API 是 Android 5.0(API Level 21)引 ...
- (第一版) 完全免费的屏幕采集\录屏\直播推流的一体化工具
这是我的第二个免费软件了, 为了方便大家,也有博友提出有这个需求,所以写了这个桌面采集\录屏\推流的一体化工具. 作为一个基本的桌面采集软件,麻雀虽小五脏俱全. 它的功能也算强大了, 基本够用. 用过 ...
- (第二版) 完全免费的屏幕采集\录屏\直播推流的一体化工具
第二版是第一版的优化, 只因怕有些同学会不注意会以为没有改变,所以新起一篇, 但介绍还是承接之前的内容. 下载地址: (第二版)完全免费的屏幕采集\\录屏\\直播推流的一体化工具 第二版界面稍有变化 ...
- 【工具】Gif录像软件录制录屏(ScreenToGif)
[工具]Gif录像软件录制录屏(ScreenToGif) screentogif: Screen to Gif是一款方便好用的小软件,可以用来快速录制屏幕上的指定区域,将其直接保存为GIF动画文件 ( ...
- C#开源录音组件、录像组件、录屏组件及demo源码
在多媒体系统中,一般都会涉及到录音.录像.录屏问题,采集得到的数据可以用来传输.播放.或存储.所以,对于像课件录制系统.语音视频录制系统.录屏系统等,多媒体数据的采集就是最基础的功能之一. MCapt ...
- Android性能优化:定性和定位Android图形性能问题——以后台录屏进程为例
原文链接:https://juejin.cn/post/7096288511053004830 作者github:https://github.com/NasdaqGodzilla 简介 发现.定性与 ...
- Android、iOS如何实现自动化录屏,超实用!
阅读本文大约需要1分钟. 背景 在做移动端自动化测试的过程中,有很多场景需要录制设备的屏幕视频,比如Crash现场记录,启动/页面加载耗时类的评测等,那么如何实现Android和iOS设备的屏幕录制呢 ...
- android手机截图gif,bash 一键录屏 Android 生成 gif 文件脚本
目的 编写 bash 脚本, 实现一行命令得到 Android 手机录制屏幕 gif 动图文件. 博主使用 ubuntu 系统, shell 为 bash. 这个脚本也可以用在 mac 系统上. 听说 ...
- Android开发之在软件内录屏录画面,直接CV就能用
关于Android开发录屏的资料,真的是很难找到那种拿来就能用的,不是付费专栏就是要积分才能下载源码,起不到任何帮助.我需要的是录制软件画面,找到的几个例子都是录制时返回桌面,然后弹出小窗口开始录制桌 ...
最新文章
- 钢结构节点输出软件_BIM助力桥梁钢结构设计施工一体化建设
- Vue——prop双向绑定解决方案
- 计算机网络面试题整理
- 【WIN10】VisualStateManager使用說明
- python多进程间通信_python多进程间通信代码实例
- linux查看执行过的命令行,在Linux命令终端中查看和编辑曾执行过的命令 – LINUX笔记 – CFEI.NET...
- mysql 大量数据 更改索引_MySql——来自狂神说Java - 贤贤贤sir
- 手机恶意软件激增,使用代码签名证书防范恶意侵害
- linux串口导致死机,Linux系统死机情况分析与处理方案介绍
- python爬取快手视频_【原创开源】快手爬虫,根据id批量爬取用户的所有图集和视频...
- AT89C51单片机的8位竞赛抢答器的protues仿真设计_倒计时可调
- 大数据项目实战——基于某招聘网站进行数据采集及数据分析(一)
- 通过python获取浏览器cookie
- NRF52840开发注意
- 科技爱好者周刊(第 150 期):当音乐还是稀缺的时候
- 使用UMI仿今日头条首页
- 由浅入深的分析HashMap原理
- Golang入门,安装与环境配置,简单代码入门
- Vagrant up启动失败 invalid byte sequence in UTF-8 (ArgumentError)
- 《Ext JS 6.2实战》节选——迁移管理模版
热门文章
- Python3自定义排序
- 协同软件的应用和技术发展
- 软件说明|Google地球影像下载及导航软件无法使用的解决办法
- springboot 根据请求IP做的分布式限流
- 脉冲编码调制的简单介绍
- 学漫画设计需要学习什么内容?
- 试题 算法提高 珠心算测验
- Getting_Started_with_QNX_Neutrino -- Chapter 2:Message Passing
- log-pilot 多行日志合并multiline
- OpenGL(5)深入理解Pipeline, State, Context