Android音视频开发知识点,2024年最新android基础面试题

采样频率 x 采样位数 x 通道数 = 8000 x 16 x 1 = 128000bit

注:这个单位是bit(比特位)可以简写为b,8个bit为1个字节,1024字节为1KB,所以128000位换成KB等于:

128000 ÷ 8 ÷ 1024 = 15.625KB

如果采集1分钟,则采集到的PCM音频大小为:15.625KB x 60秒 = 937.5KB,差不多1MB。如果录3分钟(差不多一首歌曲的时长),则需要不到3MB的存储空间,注意,这是原始PCM音频数据需要的存储空间,算是非常小的了,平时我们下载的mp3音频是经过压缩的,也是3M左右,所以1分钟的PCM音频才3MB是非常小的。

在压缩的时候,有一个压缩参数叫码率(也叫做比特率),码率的单位是bit,表示1秒钟的PCM压缩后的大小是多少,比如我们设置码率为32000bit,假如1秒钟的PCM数据大小为128000bit(也就是15.625KB),压缩成AAC后,音频大小就变成了32000bit(大约4KB),看到了吧,原本15KB的音频,压缩后变成4KB,这个压缩比例为:128000 ÷ 32000 = 4倍,也就是说,压缩后的音频大小为原来的4分之一,小了很多,方便传输或存储。

如果按照前面例子的参数,录制1分钟,并按32kb的码率压缩为AAC,则1分钟的AAC文件大小约234KB,天哪,怎么这么小!因为我们使用的采样率比较低,所以AAC就小,相应的声音质量就低,8KHz的采样频率适合人的通话声音,如果要录制音乐,则需要使用更高的采样频率,相对的压缩时使得的码率也得跟着提高才行,比如,你使用44100Hz的采样频率,则1秒钟的PCM大小为:

44100 x 16 x 1 = 705600bit

如果你还使用32kb的码率,则比原来小了22倍(705600 ÷ 32000 = 22.05),那太恐怖了,声音质量肯定会大大下降的,705600bit大约为86KB,32000bit大约为4KB,86KB的音频变成4KB,你品,你细品!实际测试时,我发现44.1KHz + 32kb码率录制的音乐比8KHz + 32kb的音质好很多,而我使用的是动态码率,44.1KHz录1分钟为254K,8KHz录1分钟为239K,也没大多少,但是音质却好很多,神奇哈,一个压缩了22倍的音质竟然比压缩了4倍的好,只因一个采样率高,一个采样率低。

那AAC的码率选多少合适呢?我也不知道,百度上也找不到文章介绍说什么采样频率应该使用什么码率的。所以也只能靠自猜了,压缩比例为4倍肯定是没问题的,倍数太大了声音失真,倍数太小了音频文件太大,所以选 4 ~ 7倍的压缩率是比较适中的(这是我自己乱猜的),而我们平时常见的码率有320kb,256kb,192kb,128kb,64kb,32kb,那我们就使用这些常见码率的其中一个即可,挑选时自己计算一下压缩率,如果压缩率在4 ~ 7倍则是合适的,希望音质好一点则压缩率就调小一点,希望文件小一点,则把压缩率调大一点,比如,44100Hz采样率的音频,我希望用6倍的压缩率,则44100 x 16 x 1 ÷ 6 = 117600bit,就是说用6倍的6压缩率,压缩后大小为117600bit(约为117kb),然后我们看它与128kb这个常见码率接近,则可以使用128kb作为压缩码率。

需要注意的是:

  • 码率是使用bit(比特位)来作为单位的,8b(8位),8kb(8千位),8mb(8兆位)

  • 我们平时是使用Byte(字节)来作为单位的,8B(8字节),8KB(8千字节),8MB(8兆字节)

  • 1kb、1mb可以简写为1k、1m,1KB、1MB也可简写为1K、1M

  • 小写的b、kb、mb之间的换算是要乘1000,如1000b = 1kb,1000kb = 1mb

  • 大写的B、KB、MB之间的换算是要乘1024,如1000B = 1KB,1000KB = 1MB

  • B和b也是可以换算的,1B = 8b,所以bit(位)单位可以和byte(字节)相互转换,示例如下:

比如32kb的码率,把位单位(千位:kb)换成我们熟悉的字节单位(千字节:KB),步骤如下:

  1. 把32kb换成bit:32 x 1000 = 32000b

  2. 把bit换成对应千字节(KB):32000 ÷ 8 = 4000Byte,4000 ÷ 1024 = 3.9KB

一般表示比特率时,会用bps来表示 ,如32kbps。bps的意思为:bit per second,即每秒钟传输的比特数量,32kbps即表示每秒传输的比特位数量为32kb。

注意:网络供应商,如电信,在介绍宽带时,一般使用形如4Mbps的方式来表示网速(注意,这里的M是大写而b是小写),则它最初是这样转变过来的:b -> Kb -> Mb,前面有介绍到,大写的转换是要乘1024的,所以1024b = 1Kb,1024Kb = 1Mb。把位单位(兆位:mb)换成我们熟悉的字节单位(兆字节:MB),如下:

  1. 把码率换成bit:4 * 1024Kb = 4096Kb(因为M大写所以乘1024),4096Kb * 1024 = 4194304b

  2. 把bit换成对应的字节单位(兆字节:MB):4194304b ÷ 8 = 524288byte,524288byte ÷ 1024 = 512KB,512KB ÷ 1024 = 0.5MBps

由此可见,当你拉了一条4Mbps的宽带时,你下载文件的速度最大就是0.5MB每秒,不要以为是4M每秒哦!注意:看上面的换算,步骤1是乘两个1024,而步骤2是除两个1024,还多除了一个8,所以两个1024可以化掉,直接除8好可,如4Mbps = 4 / 8 = 0.5MBps。

总结:

  • bps 表示每秒多少个位

  • Bps 表示每秒多少个字节,换成位就是8bps,所以bps与Bps是8倍的关系(在单位相同的情况下),如:Bps是bps的8倍(8b = 1B),KBps是Kbps的8倍,KB对Kb,两者的K都代表1024可以化掉,剩下B和b自然就是8倍的关系了。MBps是Mbps的8倍。所以100Mbps的网线下载速度为100 ÷ 8 = 12.5MBps

  • b -> kb -> mb,每个转变乘1000,如1000b = 1kb,1000kb = 1mb

  • b -> Kb -> Mb,每个转变乘1000,如1024b = 1Kb,1024Kb = 1Mb

  • B -> KB -> MB,每个转变乘1024,如1024B = 1KB,1024KB = 1MB。MB与Mb,M相同可以化掉,剩下B和b,1B=8b,所以1MBps = 8Mbps

  • mBps,应该没人使用这种形式的。

  • mbps一般用来表示码率(用于音视频压缩)

  • Mbps和MBps一般用来表示网速

  • 采样频率KHz中的K是大写,但是它表示1000

对应的视频也有码率,码率设置多少合适也可参照音频这里的方法,比如yuv视频压缩为h264视频,一般压缩比例是多少,然后根据你的实际yuv大小除以压缩比例,就得到一个码率,然后再去找找一些觉见的视频压缩码率,找一个接近的码率即可。

打印MediaCodec支持的H264编码器

=====================================================================================


object H264Util {



    /** 打印支持的H264编码器 */

    @Suppress("DEPRECATION")

    fun printSupportedH264Encoder() {

        val codecCount = MediaCodecList.getCodecCount()

        for (i in 0 until codecCount) {

            val codecInfo = MediaCodecList.getCodecInfoAt(i)

            if (!codecInfo.isEncoder) continue              // 如果不是编码器,则找下一个

            val mimeType = MediaFormat.MIMETYPE_VIDEO_AVC   // H264的mime类型

            val supportedH264 = codecInfo.supportedTypes.any { type -> type.equals(mimeType, true) }

            if (supportedH264) {

                val colorFormats = codecInfo.getCapabilitiesForType(mimeType).colorFormats

                // 通过int值,找到它是在MediaCodecInfo.CodecCapabilities中的哪个变量

                val colorFormatsConvert = Array(colorFormats.size) { index ->

                    ReflectUtil.getPublicStaticIntFieldNameByValue(MediaCodecInfo.CodecCapabilities::class.java, colorFormats[index])

                }

                Timber.i("H264编码器:${codecInfo.name}, 支持的颜色格式:${colorFormatsConvert.contentToString()}")

            }

        }

    }

}



object ReflectUtil {



    /** 获取指定类中的所有public static int类型的变量 */

    fun getAllPublicStaticIntField(clazz: Class<*>): Map<Int, String> {

        val fieldsMap: MutableMap<Int, String> = HashMap()

        clazz.fields.filter {

            Modifier.isPublic(it.modifiers)

                    && Modifier.isStatic(it.modifiers)

                    && it.genericType === Int::class.javaPrimitiveType

        }.forEach {

            fieldsMap[it.get(null) as Int] = it.name



**自我介绍一下,小编13年上海交大毕业,曾经在小公司待过,也去过华为、OPPO等大厂,18年进入阿里一直到现在。**

**深知大多数Android工程师,想要提升技能,往往是自己摸索成长或者是报班学习,但对于培训机构动则几千的学费,着实压力不小。自己不成体系的自学效果低效又漫长,而且极易碰到天花板技术停滞不前!**

**因此收集整理了一份《2024年Android移动开发全套学习资料》,初衷也很简单,就是希望能够帮助到想自学提升又不知道该从何学起的朋友,同时减轻大家的负担。**
![img](https://img-blog.csdnimg.cn/img_convert/4374cd8783b152eb13c561b767056c50.png)
![img](https://img-blog.csdnimg.cn/img_convert/70988506a1d197c34edf852fb4bc406e.png)
![img](https://img-blog.csdnimg.cn/img_convert/1f888375ec10786abe9a6a1aaf7746f1.png)
![img](https://img-blog.csdnimg.cn/img_convert/1b207d40c1aa65fe1490d52d19efab83.png)
![img](https://img-blog.csdnimg.cn/img_convert/258733a80101d5a0c37e8efa7fac8aa3.png)
![img](https://img-blog.csdnimg.cn/img_convert/cf005f266e5c3214d602957041d59000.png)
![img](https://img-blog.csdnimg.cn/13f2cb2e05a14868a3f0fd6ac81d625c.png)

**既有适合小白学习的零基础资料,也有适合3年以上经验的小伙伴深入学习提升的进阶课程,基本涵盖了95%以上Android开发知识点,真正体系化!**

**由于文件比较大,这里只是将部分目录大纲截图出来,每个节点里面都包含大厂面经、学习笔记、源码讲义、实战项目、讲解视频,并且后续会持续更新**

**如果你觉得这些内容对你有帮助,可以添加V获取:vip204888 (备注Android)**
![img](https://img-blog.csdnimg.cn/img_convert/e85e698675001bcce8ffa0ce97b3ed84.png)



### 最后

由于题目很多整理答案的工作量太大,所以仅限于提供知识点,详细的很多问题和参考答案我都整理成了 PDF文件

![](https://img-blog.csdnimg.cn/img_convert/7a656825bebb2f7cf88aeb295c28bcf4.webp?x-oss-process=image/format,png)

![](https://img-blog.csdnimg.cn/img_convert/fe350ff55358acd303f09c841fb4e8b4.webp?x-oss-process=image/format,png)

![](https://img-blog.csdnimg.cn/img_convert/a7bb6bc1073af4aee67894b779e873f2.webp?x-oss-process=image/format,png)



**一个人可以走的很快,但一群人才能走的更远。不论你是正从事IT行业的老鸟或是对IT行业感兴趣的新人,都欢迎扫码加入我们的的圈子(技术交流、学习资源、职场吐槽、大厂内推、面试辅导),让我们一起学习成长!**
![img](https://img-blog.csdnimg.cn/img_convert/4b1570b08c823bb1f3b37127760d4a52.png)
mg-bEoRK8vM-1712780712067)]

[外链图片转存中...(img-tR59hDlH-1712780712067)]



**一个人可以走的很快,但一群人才能走的更远。不论你是正从事IT行业的老鸟或是对IT行业感兴趣的新人,都欢迎扫码加入我们的的圈子(技术交流、学习资源、职场吐槽、大厂内推、面试辅导),让我们一起学习成长!**
[外链图片转存中...(img-7PoNCXVX-1712780712067)]
  • 23
    点赞
  • 17
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值