Android视频编码_安卓视频解码器

Android视频编码_安卓视频解码器SVideoRecorder(https://github.com/yellowcath/SVideoRecorder)使用Android原生的MediaCodec进行视频录制,对比大量使用FFmpeg进行录制的库优点如下:体积小 :编译后的aar只有187K,ffmpeg一个so就7、8M,精简之后也差不多还有一半大小 速度快 :在huaweiP9上,720P的一帧:  FFmpeg编码…

大家好,又见面了,我是你们的朋友全栈君。如果您正在找激活码,请点击查看最新教程,关注关注公众号 “全栈程序员社区” 获取激活教程,可能之前旧版本教程已经失效.最新Idea2022.1教程亲测有效,一键激活。

Jetbrains全系列IDE使用 1年只要46元 售后保障 童叟无欺

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、支持分段录制时进行回退

使用

主要类图如下

Android视频编码_安卓视频解码器

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)

Android视频编码_安卓视频解码器

Android视频编码_安卓视频解码器

 

版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请联系我们举报,一经查实,本站将立刻删除。

发布者:全栈程序员-站长,转载请注明出处:https://javaforall.net/184849.html原文链接:https://javaforall.net

(0)
上一篇 2022年8月31日 下午11:16
下一篇 2022年8月31日 下午11:16


相关推荐

  • 什么是pisa测试_什么是pisa考试?

    什么是pisa测试_什么是pisa考试?导读:众所周知,对于前期所做的一切努力,如果最终没有一个评价的标准,或者说差异化评估,那么如何证明前期从事的一切是有效的,因此在学生的学习方面,我们也需要比较合适的评估方式。今天推荐的一个国际化标准测评体系,叫做“PISA”,主要针对接近完成基础教育的15岁学生进行评估。PISA(ProgramforInternationalStudentAssessment)(国际学生评估项目的缩写)是…

    2022年6月6日
    49
  • java自画快递单,使用画图功能绘制快递单,并调用打印机打印

    java自画快递单,使用画图功能绘制快递单,并调用打印机打印目录快递单展示

    2026年3月18日
    2
  • dns备用服务器信息,dns服务器地址(dns首选和备用填多少)

    dns备用服务器信息,dns服务器地址(dns首选和备用填多少)dns服务器地址DNS是计算机域名体系(DomainNameSystem或DomainNameService)的缩写,它是由解析器以及域名服务器组成的。域名服务器是指保存有该网络中所有主机的域名和对应IP地址,并具有将域名转换为IP地址功用的服务器。其中域名有必要对应一个IP地址,而IP地址不一定只对应一个域名。域名体系选用相似目录树的等级结构。域名服务器为客户机/服务器方式中的服务器方,它主要有…

    2022年6月8日
    80
  • 检测数据集(测试数据集是什么)

    AdvancedVideoandSignalbasedSurveillanceCoupledObjectDetectionandTrackingMichaelD.Breitenstein

    2022年4月13日
    46
  • war包压缩命令_抽取zh.pak

    war包压缩命令_抽取zh.pak参考链接:[url]http://www.javaworld.com/article/2857714/learn-java/manipulating-jars-wars-and-ears-on-the-command-line.html[/url]jarcvfaaa.war*jartvfaaa.warjarxvfaaa.war能够作用于jar文件的jar命令同样也…

    2022年10月4日
    5
  • mybatis分页sql语句_MySQL 分页查询

    mybatis分页sql语句_MySQL 分页查询Mybatis可以使用RowBounds进行分页dao层sql的xml文件,因为是java层面的分页,所以sql不需要分页单元测试因为参数是第几个开始,这样很不友好,我们一般情况分页是第几页开始,页大小是多少,所以这就需要我们自己封装一层分页对象packagecom.lingaolu.utils;importorg.apache.ibatis.session.RowBounds;/***@author林高禄*@create.

    2026年2月17日
    3

发表回复

您的邮箱地址不会被公开。 必填项已用 * 标注

关注全栈程序员社区公众号