作为一个安卓工程师,2017年主要做了一个短视频社交项目,项目聊天使用了环信,在接近年终的时候写下这篇技术人的总结,记录下完成的项目,学习了哪些新知识和明年的规划。
2017年度总结——完成的项目
短视频录制(基于硬编码),优化思考(以下功能总结一下可分为四个点:视频采集与预览、音频采集、编码、混合。等有空一定要仔细再整理一下代码,功能模块化)
主要基于Camera/GLES,使用了开源项目GPUImage来实现了视频的预览、人像美颜、滤镜功能。
使用了Android自带的Camera实现视频采集,从Opengl拿到滤镜渲染后的数据并使用MediaCodec编码后可生成视频文件。
使用Android自带的AudioRecord实现音频采集,同样使用MediaCodec编码后可生成音频文件,使用MediaMuxer可混合音视频生成mp4文件。
短视频编辑与录制(基于ffmpeg),优化思考(以下功能总结一下可分为五个点:视频采集与预览、音频采集、编码、解码、混合。相对于第一个项目需要在采集与预览的时候做功能扩充,编解码应该各有一个数据待处理队列,各类后期效果应该是在解码队列往编码队列去的过程中被做了相应处理)
视频的预览、美颜、滤镜还是使用的Camera/GPUImage/GLES,但是流程与前面似乎有了些微差别。(具体差别待整理)
视频录制过程会有不同倍速的选择,若为加速录制则计算相应的时间与速度对应关系,每隔相应帧数就丢弃掉一定帧数。若为减速录制则每隔相应帧数就重复插入之前的帧一次。音频的倍速设置通常是通过ffmpeg的滤镜来实现(ffmpeg的滤镜使用还有待深入理解)。
视频编码应该是要支持两种编码方式、但是据传大家都在朝着硬编码的方式走,软编码都在被嫌弃。
视频后期特效,视频的后期特效都涉及到了重新解码再编码的过程,主要特效有:片段加减速、片段重复(鬼畜)、视频剪辑、倒播;倒播的实现会要求在视频一开始被编码时设置关键帧间隔为1(每一帧都是关键帧),然后帧序列重新排列来实现。
音视频合并封装成mp4,理论上使用MediaMuxer或者ffmpeg都可以,毕竟这一步的耗时相对很少。
短视频社交项目,短视频相关的技术点应该在上两个项目总结的时候就都差不多了,这个项目剩下比较值得说的有两点:
音视频的边下边播,用到了一个安卓的开源项目,具体名字可能是叫AndroidVideoCache,原理就是创建一个Socket代理请求,每次将视频播放的请求播到代理上,代理把请求转发到该视频服务器,视频服务器返回来的数据代理都保存在一个文件中,并同时写回给本地播放器。(这个项目详细细节也可以再整理一下。)
即时聊天1:基于环信,没啥可说的,就是调用环信的api,换个api就没用的知识,纯粹被业务牵着鼻子走做出来的。
即时聊天2:基于消息队列(kafka),客户端发送消息通过http短链接来发布到队列,同时客户端与服务端建立长链接来接收推送,kafka的具体实现不太清楚。这也是一个可以再研究的点。主要说说客户端的开发“android简单即时聊天sdk”,im的具体研究还得再看看xmpp类的项目或者直接研究下xmpp协议。
2018总体规划
2018年做一个不纠结的人,坚持做跟音视频相关的项目,谁劝都没用,不给干就走人。
完成遗留的问题,总结完以上三个项目(前两个为重点必须完成,第三个侧重kafka实现方式的理解)
预计2月底之前完成
真真项目尽量维持运行,改变自己拖拉的习惯,对于估期问题要慎重回答。
英语学习,每周六、周日晚上7点到8点半。
健身,晚上9点到10点,每周至少两次。
看完《android内核剖析》
每周起码花半小时在github上
工作必须认真对待,事关饭碗的事放在所有事情第一位,建立一个自己的关于kugou/fanxing的相关文档系统,每周起码更新进入一篇文章,时间可以在每天10点以前的时间段,同时要养成在10点以前整理自己一天大概计划的习惯,可以预测也可以回顾,时间在半小时左右,做一个聪明的懒人。
总结:
稍稍总结下以上所述,以上其实关于两个系统的建立,一个是代码系统,另一个是文档系统:
代码系统需要整理从视频采集-视频预览-视频编码-视频解码-视频加减速-视频边下边播-音频采集-音频边下边播-音频加减速-音视频合成等等一系列流程,最终应该形成一套完整的集软硬编解码能力于一身的音视频编辑sdk,明年应该主要是建立并完善这个代码。
文档系统基本与代码系统配合说明。
具体代码与文档的结合手段可以先搜一搜网上别人的做法,找一个简单易操作,优雅又舒适的方式来操作。
本文转自wall_j的博客,原文地址http://blog.csdn.net/jw20082009jw/article/details/78806338