技术标签: 安卓进阶 音视频 android 音视频开发 安卓开发
最近难得有些空闲时间,想学点新的东西,针对当前音视频app的流行,于是决定学习安卓平台音视频开发相关知识,然而自己这方面却是一个小白,所以希望通过博客的形式记录下自己一步一步学习的过程,也希望能给这方面的新手一些借鉴。
1.了解音视频的基础知识
2.了解SurfaceView,TextureView的实现和使用
3.Android平台音频采集与播放(AudioRecord相关API)
4.Android平台视频采集与播放(Camera相关API)
5.学习 Android 平台的 MediaExtractor 和 MediaMuxer API
6.学习MediaCodec API
7.了解OpenGL ES,学会使用OpenGL绘制图形
8.进一步学习OpenGL,了解如何实现视频的剪裁、旋转、水印、滤镜等
9.学习GLSurfaceView的使用
10.学习使用第三方库ffmpeg
11.了解RTMP,RTSP,学习使用第三方库librtmp
整个学习计划大概就这么多,如果以后深入了解涉及到其他再补充,最后我将使用以上涉及的技术开发一个简易的音视频app,这是一个漫长的过程,希望自己能坚持下去,共勉!
接下来正式进入正轨:
1.什么是视频?
简单来说,视频可以看作是由一张张图片快速进行切换,在人眼中产生一段连贯的动作,早期电影胶片是个很明显的例子,通过记录在每一格胶片上的图像,进行快速切换,从而产生了视频效果。
2.帧
帧——就是影像动画中最小单位的单幅影像画面,相当于电影胶片上的每一格镜头,每一张图像就是一帧,一个视频就是由许许多多帧组成的。
3.帧率
帧率是指帧连续出现在显示器上的频率(速率),玩游戏的童鞋肯定对这个不陌生,通常我们都会用FPS为单位,即每秒更新的帧数(帧/秒)。高的帧率可以得到更流畅、更逼真的动画。一般来说30fps就是可以接受的,但是将性能提升至60fps则可以明显提升交互感和逼真感,但是一般来说超过75fps人眼一般就不容易察觉到有明显的流畅度提升了。
4.色彩空间
RGB:一种颜色标准,是通过对红(R)、绿(G)、蓝(B)三个颜色通道的变化以及它们相互之间的叠加来得到各式各样的颜色。屏幕上的所有颜色,都由红色绿色蓝色三种色光按照不同的比例混合而成的,这三种颜色又被成为三原色光。
YUV:YUV是被欧洲电视系统所采用的一种颜色编码方法,在现代彩色电视系统中,通常采用摄影机进行取像,然后把取得的彩色图像信号经分色、分别放大校正后得到RGB,再经过矩阵变换电路得到亮度信号Y和两个色差信号B-Y(即U)、R-Y(即V),最后发送端将亮度和色差三个信号分别进行编码,用同一信道发送出去,这就是电视信号的传输过程。这种色彩的表示方法就是所谓的YUV色彩空间表示。采用YUV色彩空间的重要性是它的亮度信号Y和色度信号U、V是分离的。其中"Y"表示明亮度,也就是灰阶值;而"U"和"V" 表示的则是色度,作用是描述影像色彩及饱和度,用于指定像素的颜色。
采用YUV的优势:
一.彩色YUV图像转黑白YUV图像转换非常简单,这一特性用在于电视信号上。
二.YUV的数据总尺寸小于RGB格式,这对缩小视频体积提供了便利。
RGB与YUV之间的转换方法:
Y = 0.299R + 0.587G + 0.114B
U = -0.147R - 0.289G + 0.436B
V = 0.615R - 0.515G - 0.100B
R = Y + 1.14V
G = Y - 0.39U - 0.58V
B = Y + 2.03U
1.什么是音频?
这里的音频是指存储声音内容的介质,任何我们可以听见的声音经过音频线或话筒的传输都会变成一系列的模拟信号。在CD时代,声音被物理手段收集刻录在磁带介质中,这一过程全是模拟的,存在声音失真的情况;而在数码时代,声音都被处理成数字信号存储在存储介质中,模拟信号是我们可以听见的,而数字信号就是用一堆数字记号(二进制的1和0)来记录声音,数字信号可以实现对声音的无损保存。
数码录音最关键的步骤就是把模拟信号转成数字信号,这里不得不提一个名词:脉冲编码调制(PCM),是一种数字数据的处理机制,具体请看百科。
PCM的工作过程如下:
模拟信号->采样->量化->编码->数字信号
2.采样率与采样位数
采样是通过周期性地以某一规定间隔截取音频信号,从而将模拟音频信号变换为数字信号的过程。每次采样时均指定一个表示在采样瞬间的音频信号的幅度的数字。
采样频率指录音设备在一秒钟内对声音信号的采样次数,根据奈奎斯特采样定理:为了不失真地恢复模拟信号,采样频率应该不小于模拟信号频谱中最高频率的2倍。也就是说我们对声音进行收集处理时,要针对性地对每一段特定频率的声音进行选取。
人耳能听到的最高频率为20kHz,所以为了满足人耳的听觉要求,采样率至少为40kHz,通常为44.1kHz,更高的通常为48kHz。
采样位数即采样值或取样值,用来衡量声音波动变化的参数,是指声卡在采集和播放声音文件时所使用数字声音信号的二进制位数。采样的位数和采样的频率决定了声音采集的质量。
数字信号中,信号一般是不连续的,所以模拟信号量化以后,只能取一个近似的整数值,为了记录这些振幅值,采样器会采用一个固定的位数来记录这些振幅值,通常有8位、16位、32位。8位代表2的8次方——256,16位则代表2的16次方——64K,32位代表2的32次方——2147483648,位数越高,声音质量越好。
3.声道
声道是指声音在录制或播放时在不同空间位置采集或回放的相互独立的音频信号,所以声道数也就是声音录制时的音源数量或回放时相应的扬声器数量。通常我们说的立体声一般有2个声道,有些更高级的有4个声道。
4.码率
码率是指每秒传送的比特(bit)数,单位bps(bit per second),通常使用kbps(每秒钟1000比特)。在音频中指将模拟声音信号转换成数字声音信号后,单位时间内的二进制数据量,是间接衡量音频质量的一个指标。码率高时文件大小变大,会占据很多的内存容量,音乐文件最常用的码率是128kbps,MP3文件可以使用的一般是8-320kbps。
码率(kbps) = 采样率(kHz)× 采样位数(bit/采样点)× 声道数量(一般为2)
1.什么是视频编码?
就是指通过压缩技术,将原始视频格式的文件转换成另一种视频格式文件的方式。从信息论的观点来看,数据=信息+数据冗余。视频信号也存在数据冗余,视频编码的实质是减少视频中的冗余数据。我们知道,视频是由帧组成的,但是在实际使用中,视频的数据并不是真正按照一帧一帧原始数据保存下来的,而是通过压缩编码后存储。视频编码能有效减少视频大小,方便传输和存储。视频和音频通过压缩编码合并后就变成了我们常见的格式,如:avi、mp4、rmvb、mov等,这些称为视频封装格式。
2.视频编码格式
视频流传输中最为重要的编解码标准有国际电联的H.261、H.263、H.264,运动静止图像专家组的M-JPEG和国际标准化组织运动图像专家组的MPEG系列标准等等。其中最主流的是H.264,当然现在已经推出H.265,这是一种更高效的编码方式,比上一代的压缩效率更高。
3.H.264编码
因为H.264编码太过庞大复杂,实际开发中,编码部分工作一般由第三方框架完成,开发者其实并不太需要去涉猎,我这里就不详细介绍了,具体请看百度百科。
也可参考入门理解H264编码
1.什么是音频编码?
参照视频编码,音频编码自然是对音频数据进行压缩处理的过程。
2.音频编码格式
PCM编码:前面我们已经介绍过了,这种编码最大的优点就是音质好,最大的缺点就是体积大。
和视频编码一样,音频也有许多的编码格式,如:WAV、MP3、WMA、APE、FLAC等等。
我这里着重介绍AAC,AAC是新一代的音频有损压缩技术,一种高压缩比的音频压缩算法。在MP4视频中的音频数据,大多数时候都是采用AAC压缩格式。
3.AAC编码
AAC是一种专为声音数据设计的文件压缩格式。与MP3不同,它采用了全新的算法进行编码,更加高效,具有更高的“性价比”。利用AAC格式,可使人感觉声音质量没有明显降低的前提下,占用存储空间更小。
AAC格式主要分为两种:ADIF、ADTS。
ADIF:Audio Data Interchange Format。 音频数据交换格式。这种格式的特征是可以确定的找到这个音频数据的开始,不需进行在音频数据流中间开始的解码,即它的解码必须在明确定义的开始处进行。这种格式常用在磁盘文件中。
ADTS:Audio Data Transport Stream。 音频数据传输流。这种格式的特征是它是一个有同步字的比特流,解码可以在这个流中任何位置开始。它的特征类似于mp3数据流格式。
硬件加速(Hardware acceleration)就是利用硬件模块来替代软件算法以充分利用硬件所固有的快速特性。硬件加速通常比软件算法的效率要高。
将2D、3D图形计算相关工作交给GPU处理,从而释放CPU的压力,也是属于硬件加速的一种。
1.区别
硬解码和上面的硬件加速对应,即使用硬件模块来解析视频、音频文件等,而软解码即是用CPU去计算解析。
硬解码是将原来全部交由CPU来处理的视频数据的一部分交由GPU来做,而GPU的并行运算能力要远远高于CPU,这样可以大大的降低对CPU的负载,CPU的占用率较低了之后就可以同时运行一些其他的程序了。
软解码具有更好的适应性,软件解码主要是会占用CPU的运行,软解不考虑设备的硬件解码支持情况,有CPU就可以使用了,但是占用了更多的CPU那就意味着很耗费性能,很耗电,在设备电量充足的情况下,或者设备硬件解码支持不足的情况下使用软件解码更加好。
一般的视频播放器都会支持软硬解码,两者相结合从而发挥最优性能。
2.Android平台的解码
安卓硬解码可以直接使用MediaCodec(API 16之后引入) ,虽然MediaPlayer也是硬件解码,但是被封装得太死了,支持的协议很少。
对于软解码,有许多第三方框架支持,最出名的莫过于ffmpeg,这个在以后的学习中再深入了解。
后记:强烈建议看官方的文档:谷歌音频和视频介绍
如何将LR的预测概率值转化为分数? 背景:在互联网金融中,一般用LR模型来预测一个借贷用户的好坏,但是LR模型得到的结果是逾期的概率值,如何仅仅给出预测概率值,人一般很难判断这个概率值代表的用户质量好坏,但是如果能够给出分数就比较理解了。而我们一般要把逾期概率转为分数来供公司进行决策,那么如何将逾期概率转化为用户质量的得分,例如0-100呢? 最容易想到的是将逾期率概率值直接乘以100就得...
.Net中的System.Configuration命名空间为我们在web.config或者app.config中自定义配置提供了完美的支持。最近看到一些项目中还在自定义xml文件做程序的配置,所以忍不住写一篇用系统自定义配置的随笔了。如果你已经对自定义配置了如指掌,请忽略这篇文章。言归正传,我们先来看一个最简单的自定义配置<?xml...
164.导出excel 0kb内存不够或者磁盘空间不足163.Unresolvable Operation:mobile in class ReportDispatcher排除jar包和插件影响的话,可能是LIC里面没有决策平台功能点162.客户嵌入我们的url时出现报错Refused to display 'URL' in a frame because it set 'X-Fr...
在做批量数据处理时,调用远程WCF服务出现异常:“远程服务器返回了意外响应: (413) Request Entity Too Large”。由于调用时发送的数据比较多,所以一看错误信息就能定位到错误的原因,于是在WCF服务端找到配置文件设置maxReceivedMessageSize,此属性用来获取或设置配置了此绑定配置的通道上可以接收的消息的最大大小(以字节为单位),默认序列化后传输的数据...
往下开展前先做个答疑,前两天有个小伙伴私下问了个问题说:如果我一部分表做了分库分表,另一部分未做分库分表的表怎么处理?怎么才能正常访问?这是一个比较典型的问题,我们知道分库分表是针对某些数据量持续大幅增长的表,比如用户表、订单表等,而不是一刀切将全部表都做分片。那么不分片的表和分片的表如何划分,一般有两种解决方案。严格划分功能库,分片的库与不分片的库剥离开,业务代码中按需切换数据源访问设置默认数据源,以 Sharding-JDBC 为例,不给未分片表设置分片规则,它们就不会执行,因为找不到路由
es5总结xiong.jpg1. strict模式严格模式,限制一些用法,'use strict';为什么使用严格模式:消除代码运行的一些不安全之处,保证代码运行的安全;消除Javascript语法的一些不合理、不严谨之处,减少一些怪异行为;提高编译器效率,增加运行速度;为未来新版本的Javascript做好铺垫。"usestrict";x=3.14;//报错不允许使用未声明的变量或...
package com.company;//定义外部类class Outer{ private static String message = "java"; //定义内部类 class InnerA{ public void print(){ System.out.println(Outer.this.message);
GAMES101:作业6接下来是实现加速的光线追踪,本练习要求实现 Ray-Bounding Volume 求交与 BVH 查找。后文中笔者也实现了SAH(Surface Area Heuristic),并逐段代码讲解了SAH的实现首先,你需要从上一次编程练习中引用以下函数:• Render() in Renderer.cpp: 将你的光线生成过程粘贴到此处,并且按照新框架更新相应调用的格式。
域名绑定https流程操作步骤网上找了很多资料,踩过不少坑,发现在网上很少有关于域名绑定https实现过程的完整资料,这里整理了下,共大家参考。1.1关于https和http的区别 HTTP协议传输的数据都是未加密的,也就是明文的,因此使用HTTP协议传输隐私信息非常不安全,为了保证这些隐私数据能加密传输,协议用于对HTTP协议传输的数据进行加密,从而就诞生了HTTPS。简单来说,HTTPS协议是由SSL+HTTP协议构建的可进行加密传输、身份认证的网络协议,要比http协议安全。 HTTPS和
flask 服务启动完成之后怎么回调执行其他代码,被这个问题困扰好久,各种查阅资料之后发现flask 的app.run()方法并没有提供回调参数,也没有提供服务启动完成之后,执行其他程序的装饰器,github上有人提了这个issue,flask本身好像确实没有提供解决方案。一番思索之后,那就自己实现一个吧。思路:在调用app.run()方法之前开启一个线程,用urllib.request检
最近发现一个很好用的控件 dotnetCHARTING ,画图真的很方便,而且功能很多,可以画各种各样的图在官方网站上下载的需要注册,现在网上有破解办的下载的(需要的朋友可以给我留言,发到邮箱)下面介绍一个我写的例子(c#)1.在的aspx也面上添加chart div style="text-align:center;">
1.动态插入组件将需要插入到页面的元素定义成一个组件,再进行操作。参考:https://jintang.github.io/2018/03/27/vue动态添加组件/2.页面直接添加元素页面结构代码:&amp;lt;ul&amp;gt; &amp;lt;li v-for=&quot;(item, index) in itemArr&quot; :key=&quot;index&quot;&amp;gt; {{index