Android视频编码_安卓视频解码器
2023-06-13 09:11:13 时间
SVideoRecorder(https://github.com/yellowcath/SVideoRecorder)使用Android原生的MediaCodec进行视频录制,对比大量使用FFmpeg进行录制的库优点如下:
- 体积小 :编译后的aar只有187K,ffmpeg一个so就7、8M,精简之后也差不多还有一半大小
- 速度快 :在huaweiP9上,720P的一帧: FFmpeg编码时间:50~60ms MediaCodec(YUV)编码时间:20~25ms MediaCodec(Surface)编码时间:10~15ms
- CPU占用低 :ffmpeg录制时占用CPU低端机明显卡顿,MediaCodec录制时几乎无影响
缺点是只支持Android4.3+(Android4.1和4.2已有MediaCodec,但是官方不保证可用)
功能简介
1、录制相机原始视频(YUV) 2、录制Surface,用户可自行在相机原始预览数据上添加滤镜、贴纸等特效,再直接录制下来 3、支持分段录制 4、支持分段录制时进行回退
使用
主要类图如下
SMediaCodecRecorder:接收YUV数据进行录制 SSurfaceRecorder:提供一个Surface,录制绘制到该Surface上的图像数据 SSegmentRecorder:对上述两个类进行包装,扩展出分段录制的能力
初始化
//实现ICameraProxyForRecord接口,提供预览参数
ICameraProxyForRecord cameraProxyForRecord = new ICameraProxyForRecord() {
@Override
public void addSurfaceDataListener(PreviewSurfaceListener listener, SurfaceCreatedCallback callback) {
//SSurfaceRecorder调用
RecordHelper.setPreviewSurfaceListener(previewSurfaceListener, surfaceCreatedCallback);
}
@Override
public void removeSurfaceDataListener(PreviewSurfaceListener listener) {
//SSurfaceRecorder调用
RecordHelper.setPreviewSurfaceListener(null, null);
}
@Override
public void addPreviewDataCallback(PreviewDataCallback callback) {
//SMediaCodecRecorder调用
mCallback = callback;
}
@Override
public void removePreviewDataCallback(PreviewDataCallback callback) {
//SMediaCodecRecorder调用
mCallback = null;
}
@Override
public int getPreviewWidth() {
return mPreviewSize.width;
}
@Override
public int getPreviewHeight() {
return mPreviewSize.height;
}
@Override
public int getVideoRotation() {
return mCameraFacing == Camera.CameraInfo.CAMERA_FACING_BACK ? 90 : 270;
}
};
mRecorder = new SMediaCodecRecorder(this, cameraProxyForRecord);
mRecorder.addRecordListener(this);
数据帧来源
SMediaCodecRecorder
@Override
public void onPreviewFrame(byte[] data, Camera camera) {
if (mCallback != null) {
long timeUs = System.nanoTime() / 1000;
mCallback.onPreviewData(data, timeUs);
}
}
SSurfaceRecorder
Demo里提供两种方式(详见RecordHelper.java): 1、 drawBlitFrameBuffer,将预览界面的图像数据直接拷贝到MediaCodec的Surface里,要求GLES3.0,部分老机型可能支持不太好 2、drawBlit2X,直接将预览界面的图像数据重复绘制一次到MediaCodec的Surface,考虑到性能问题,这里需要使用FBO
调用
//开始录制
mRecorder.startRecord();
//结束录制,成功后回调OnRecordSuccess
mRecorder.stopRecord();
//暂停录制,只用于SSegmentRecorder
mRecorder.pauseRecord();
//恢复录制,只用于SSegmentRecorder
mRecorder.resumeRecord();
//取消,回调OnRecordFail()
mRecorder.cancelRecord();
Demo
1、正常录YUV格式视频 2、分段录YUV格式视频 3、分段录带特效视频(Surface)
发布者:全栈程序员栈长,转载请注明出处:https://javaforall.cn/184849.html原文链接:https://javaforall.cn
相关文章
- android activity自动跳转,Android activity跳转之finish()方法的作用
- android进阶之了解Android系统与开机过程
- Android File Transfer mac直装版 mac安卓文件传输工具
- android toast防重_如何解决android Toast重复显示
- 安卓监听屏幕触摸事件_android设置按钮点击事件
- android计算器开发实例_安卓开发计算器代码
- 【Android FFMPEG 开发】音视频基础 和 FFMPEG 编译 ( 音视频基础 | MPEG-4 标准 | Android 开发环境 | FFMPEG 交叉编译 | 安卓项目导入配置 )
- 【Android Protobuf 序列化】Protobuf 服务器与客户端通信 ( TCP 通信中使用 Protobuf )
- 【Flutter】Flutter 混合开发 ( 关联 Android 工程与 Flutter 工程 | 安卓页面中嵌入 Flutter 页面 | 安卓中启动 Flutter 页面 )
- Android File Transfer (mac-安卓手机文件传输)
- android 开发Handler源码剖析详解手机开发
- Android开发实战之SQL Server(安卓sqlserver)
- 谷歌发现的 iPhone 攻击者同样也在攻击 Android 和 Windows 系统
- 安卓编年史(7):Android 1.1——第一个真正的增量更新
- 使用Android实现连接MySQL数据库:实现快速数据交互与管理(android连接mysql数据库)
- android图像绘制(二)画布上放大缩小问题
- Android开发笔记之:如何安全中止一个自定义线程Thread的方法
- 解析android中系统日期时间的获取
- Android入门之ActivityGroup+GridView实现Tab分页标签的方法
- Android上使用ZXing识别条形码与二维码的方法