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,但是效果不理想,大家就不要再走这条弯路了)。
- Android视频录制以及声音视频特效实现研究
- Android MediaRecorder 实现录制无声视频 禁止录入声音
- android实现视频录制
- android录制视频实现
- Android实现录制视频
- Android上实现视频录制
- Android上实现视频录制
- Android 实现视频录制播放
- 录制带声音的视频
- android 视频录制,视频拼接
- android视频录制(调用系统视频录制)
- Android 实现视频录制并播放
- Android基础--MediaRecorder类实现视频录制
- Android 微信小视频录制功能实现
- Android 拍照和视频录制实现mediaRecorder
- 实现语音视频录制
- iOS实现视频录制
- opencv实现视频录制
- NFS的配置
- Tomcat启动的初始内存设置(Tomcat 的JVM 内存溢出)
- 数据可视化简介
- SysTick时钟
- iOS 自动登录或者记住密码,求个Demo,不知如何调用
- Android视频录制以及声音视频特效实现研究
- 关于OC的autorelease
- sqlserver编辑
- Oracle 11g 闪回作业
- PHP之坑(以此记录,下次可绕开)
- java-02
- 关于bindingSource的datasouce和list操作------刷新问题
- nmealib代码分析
- 【求助】请问UITextView 如何使显示不全的单词不折行显示