编码机

精通音视频开发是真的可以为所欲为

发布时间:2023/1/3 9:17:23   

在日常生活中,视频类应用占据了我们越来越多的时间,各大公司也纷纷杀入这个战场,不管是抖音、快手等短视频类型,虎牙、斗鱼等直播类型,腾讯视频、爱奇艺、优酷等长视频类型,还是Vue、美拍等视频编辑美颜类型,总有一款适合你。

未来随着5G普及以及网络资费的下降,音视频的前景是非常广阔的。但是另一方面,无论是音视频的编解码和播放器、视频编辑和美颜的各种算法,还是视频与人工智能的结合(AI剪片、视频修复、超清化等),它们都涉及了方方面面的底层知识,学习曲线比较陡峭,门槛相对比较高,所以也造成了目前各大公司音视频相关人才的紧缺。如果你对音视频开发感兴趣,我也非常建议你去往这个方向尝试,我个人是非常看好音视频开发这个领域的。

不管作为开发者还是用户,现在我们每天都会接触到各种各样的短视频、直播类的App,与之相关的音视频方向的开发也变得越来越重要。但是对于大多数Android开发者来说,从事Android音视频相关的开发可能目前还算是个小众领域,虽然可能目前深入这个领域的开发者还不是太多,但这个方向涉及的知识点可一点都不少。

音视频开发的学习之路

音视频相关开发涉及面很广,如果想深入音视频领域发展,从我个人学习的经历来看,想要成为一名合格的开发者,除了基础的Android开发知识以外,还要深入学习,我认为还需要掌握下面的技术栈。

语言

C/C++:音视频开发经常需要跟底层代码打交道,掌握C/C++是必须的技能。这方面资料很多,相信我们都能找到。

ARMNEON汇编:这是一项进阶技能,在视频编解码、各种帧处理低下时很多都是利用NEON汇编加速,例如FFmpeg/libyuv底层都大量利用了NEON汇编来加速处理过程。虽说它不是必备技能,但有兴趣也可以多多了解,具体资料可以参考ARM社区的教程。

框架

FFmpeg:可以说是业界最出名的音视频处理框架了,几乎囊括音视频开发的所有流程,可以说是必备技能。

libyuv:Google开源的YUV帧处理库,因为摄像头输出、编解码输入输出也是基于YUV格式,所以也经常需要这个库来操作数据(FFmpeg也有提供了这个库里面所有的功能,在libswscale都可以找到类似的实现。不过这个库性能更好,也是基于NEON汇编加速)。

libx/libx:目前业界最为广泛使用的H./H.软编解码库。移动平台上虽然可以使用硬编码,但很多时候出于兼容性或画质的考虑,因为不少低端的Android机器,在低码率的场景下还是软编码的画质会更好,最终可能还是得考虑使用软编解码。

OpenGLES:当今,大部分视频特效、美颜算法的处理,最终渲染都是基于GLES来实现的,因此想要深入音视频的开发,GLES是必备的知识。另外,除了GLES以外,Vulkan也是近几年开始发展起来的一个更高性能的图形API,但目前来看,使用还不是特别广泛。

ExoPlayer/ijkplayer:一个完整的视频类App肯定会涉及视频播放的体验,这两个库可以说是当下业界最为常用的视频播放器了,支持众多格式、协议,如果你想要深入学习视频播放处理,它们几乎也算是必备技能。

从实际需求出发,基于上述技术栈,我们可以从下面两条路径来深入学习。

1.视频相关特效开发

直播、小视频相关App目前越来越多,几乎每个App相关的特效,往往都是利用OpenGL本身来实现。对于一些简单的特效,可以使用类似ColorLookUpTable的技术,通过修改素材配合Shader来查找颜色替换就能实现。如果要继续学习更加复杂的滤镜,推荐你可以去shadertoy学习参考,上面有非常多Shader的例子。

而美颜、美型相关的效果,特别是美型,需要利用人脸识别获取到关键点,对人脸纹理进行三角划分,然后再通过Shader中放大、偏移对应关键点纹理坐标来实现。如果想要深入视频特效类的开发,我推荐可以多学习OpenGL相关的知识,这里会涉及很多优化点。

2.视频编码压缩算法

H./H.都是非常成熟的视频编码标准,如何利用这些视频编码标准,在保证视频质量的前提下,将视频大小最小化,从而节省带宽,这就需要对视频编码标准本身要有非常深刻的理解,是一个门槛相对较高的方向。

相关学习资源:

Android音视频开发这块目前没有比较系统的教程或者书籍,网上的博客文章也都是比较零散的。只能通过一点点的学习和积累把这块的知识串联积累起来。

不少人在音视频初级入门过程中只是接触Android多媒体展示相关的API,通过单独的列举和使用这些API,只能让你对Android音视频处理有一个基本的轮廓,知识点都是零散的,根本没有有效的途径将所有知识点串联起来。

这样对于音视频的了解和控制就仅仅局限于最外层的API了,在深入学习之前,往往这些API就已经把脑袋都弄大了,而且,仅仅停留在使用API的层次,不能让你适应不断变化的需求。

如果最开始的方向都错了,那么不管你如何努力,都学不好音视频!

而如果是跟着正确的学习路线一步步深挖,那么一切都不是问题!

音视频初级入门

Android音视频开发(一):通过三种方式绘制图片

Android音视频开发(二):使用AudioRecord采集音频PCM并保存到文件

Android音视频开发(三):使用AudioTrack播放PCM音频

Android音视频开发(四):使用CameraAPI采集视频数据

Android音视频开发(五):使用MediaExtractor和MediaMuxerAPI解析和封装mp4文件

Android音视频开发(六):MediaCodecAPI详解

Android音视频开发(七):音视频录制流程总结

……

音视频中级进阶:OpenSLES学习

AndroidOpenGLES开发(一):OpenGLES介绍

AndroidOpenGLES开发(二):OpenGLES环境搭建

AndroidOpenGLES开发(三):OpenGLES定义形状

AndroidOpenGLES开发(四):OpenGLES绘制形状

AndroidOpenGLES开发(五):OpenGLES使用投影和相机视图

AndroidOpenGLES开发(六):OpenGLES添加运动效果

AndroidOpenGLES开发(七):OpenGLES响应触摸事件

AndroidOpenGLES开发(八):OpenGLES着色器语言GLSL

AndroidOpenGLES开发(九):OpenGLES纹理贴图

AndroidOpenGLES开发(十):通过GLES20与着色器交互

……

音视频高级探究

音视频编解码技术

音视频编解码技术(一):MPEG-4/H.AVC编解码标准

音视频编解码技术(二):AAC音频编码技术

……

流媒体协议

流媒体协议(一):HLS协议

流媒体协议(二):RTMP协议

……

多媒体文件格式

多媒体文件格式(一):MP4格式

多媒体文件格式(二):FLV格式

多媒体文件格式(三):M3U8格式

多媒体文件格式(四):TS格式

多媒体文件格式(五):PCM/WAV格式

……

FFmpeg学习

FFmpeg命令行工具学习(一):查看媒体文件头信息工具ffprobe

FFmpeg命令行工具学习(二):播放媒体文件的工具ffplay

FFmpeg命令行工具学习(三):媒体文件转换工具ffmpeg

FFmpeg命令行工具学习(四):FFmpeg采集设备

FFmpeg命令行工具学习(五):FFmpeg调整音视频播放速度

……

FFmpeg学习(一):FFmpeg简介

FFmpeg学习(二):Mac下安装FFmpeg

FFmpeg学习(三):将FFmpeg移植到Android平台

FFmpeg学习(四):FFmpegAPI介绍与通用API分析

FFmpeg学习(五):FFmpeg编解码API分析

FFmpeg学习(六):FFmpeg核心模块libavformat与libavcodec分析

……

FFmpeg结构体学习(一):AVFormatContext分析

FFmpeg结构体学习(二):AVStream分析

FFmpeg结构体学习(三):AVPacket分析

FFmpeg结构体学习(四):AVFrame分析

FFmpeg结构体学习(五):AVCodec分析

FFmpeg结构体学习(六):AVCodecContext分析

FFmpeg结构体学习(七):AVIOContext分析

FFmpeg结构体学习(八):FFMPEG中重要结构体之间的关系

……

FFmpeg开发之AVFilter使用流程总结

FFmpeg过时Api汇总整理

……

#Android开发#



转载请注明:http://www.aideyishus.com/lktp/2773.html
------分隔线----------------------------