Android视频录制以及声音视频特效实现研究

来源:互联网 发布:javase8 mac 下载 编辑:程序博客网 时间:2024/04/28 13:52

Android平台录制视频,我想一般开发者的第一反应是MediaRecorder,是的这个是Android自带的媒体录制接口,如果只是想录视频的话,这个是最佳选择。

But,如果你想对录制的声音或者视频进行处理,那么这个MediaRecorder恐怕无法实现这一需求,当然还有个思路就是我先用MediaRecorder录好,再对录制好的视频文件进行解析提取声音视频流进行处理,但是这样效率将会极低,我发现“某拍“录完视频后会进行很长时间的处理,用户体验相当差,录1min几乎处理需要1min左右,用户基本不会再去使用,很牛逼的手机或者录制视频较短除外。

先分析下录制完再处理会有哪些毕竟耗时的操作:

1.视频容器解析,将格式解析出来,以及有视频流音频流的编码格式

2.视频解码,音频解码

3.对解码后的视频音频进行处理

4.重新编码视频音频并写入新的视频文件格式

想必大家也看到了,不仅要解码还要编码,这肯定快不起来。

下面进入正题,提供一种解决方案,那就是Android4.3+的MediaMuxer+OpenglES,前者提供视频录制,后者可在录制的同时进行渲染以及视频处理,最主要的是,MediaMuxer的视频和音频源可以由自己来控制,视频可以从Camera出来,再由MediaCodec处理后丢到MediaMuxer,而音频同样可以从AudioRecorder出来经由MediaCodec处理后丢给MediaMuxer写入容器中形成视频文件。

最重要的一点就是视频和音频的原始数据都暴露给了我们,这样我们就可以先对这些原始数据进行处理,然后再丢给MediaMuxer写入容器。如果我们想对视频进行处理,那么采用Opengles可以这样做:

Camera开启时可以传入一个SurfaceTexture,关于SurfaceTexture这里不多讲,大家自行百度补脑,简单的说这个可以使Camera的视频数据不放到Surface里面显示给用户,而是先放到framebuffer中,让开发者可以对framebuffer里面的数据先进行下处理再丢给用户显示或者编码之类的。

其实SurfaceTexture与Opengles是密切相关的,SurfaceTexture也是纹理的一种,opengles绘制图像就是需要一个问题,只不过SurfaceTexture是一种特殊的2D图像纹理,Camera把数据丢给了SurfaceTexture后,就可以通知Opengles对该texture进行处理,至于你想做什么样的处理那就全凭你对opengles掌握的程度的,反正做个什么黑白相机,扭曲变形之类的只需要简单的加个滤镜就可以了。以下就是google给的黑白滤镜(也称之为着色器语言)

    // Fragment shader that converts color to black & white with a simple transformation.    private static final String FRAGMENT_SHADER_EXT_BW =            "#extension GL_OES_EGL_image_external : require\n" +            "precision mediump float;\n" +            "varying vec2 vTextureCoord;\n" +            "uniform samplerExternalOES sTexture;\n" +            "void main() {\n" +            "    vec4 tc = texture2D(sTexture, vTextureCoord);\n" +            "    float color = tc.r * 0.3 + tc.g * 0.59 + tc.b * 0.11;\n" +            "    gl_FragColor = vec4(color, color, color, 1.0);\n" +            "}\n";
如果想来点更高难度的,比如像现在比较流行的直播里面的贴图,给主播戴个帽子,加个大花猫脸之类的就需要研究下OpenCv人脸识别之类的了,其实就是计算出我这个贴图要合成到图片/视频中的位置,当然你必须要知道眼口鼻耳朵嘴在什么位置喽。


至于声音处理的话,比较多的就是变声了,变声的方法网上有很多库可以使用,当然最好自己研究下加入点自己的算法,使变声效果更好,声音更逼真就最好了,我前段时间也有做过一个变声类的APP(安卓变声器/聊天变声器)上架360手机助手和应用宝,目前表现还可以,所以又加入了视频变声的功能,也就是为什么我写这篇blog,因为研究花了不少时间,所以想给大家一个思路避免大家有类似需求的再浪费时间(期间也采用过ffmpeg,但是效果不理想,大家就不要再走这条弯路了)。



0 0