本文原文包含链接较多,这边发不了,想看完整版的可以关注我的公众号:程序喵大人,搜本文标题
大家好,我是程序喵。
本人是主要从事音视频相关的开发工作,但发现网上关于音视频的学习资料都比较零散,而且也没有一套比较全面的面经,所以我把自己这几年整理的相关资料都掏出来给大家。(获取完整版pdf文档请在公众号后台回复“微信”,添加我微信领取)
咳咳:这篇文章我本来都想开付费阅读了,因为真的耗费了我极大精力。后来想想还是算了,支持的就点个赞、转发、在看吧。
废话不多数,直接上干货,内容都是自己整理的,有些地方难免有错误,大家见谅哈。
-
音频处理需要理解的概念有哪些?
-
采样率:每秒采集声音的数量HZ,一般为44100HZ
-
-
采样精度:每次采样的精度位数,位数越多,能记录的范围就越大,一般为16bit。
-
通道:单声道,双声道,四声道等。
-
比特率:也叫码率,比特率 = 采样率 x 采样精度 x 通道数
-
采样率44100,采样精度16,通道2的比特率为44100*16*2bps。
-
wav格式:前44字节(有可能比44字节多)记录采样率通道等信息,后面就是pcm裸数据。【http://soundfile.sapp.org/doc/WaveFormat/】
-
aac格式:一般packet为adts头+编码数据;如果是将aac封装到mp4容器中,则不需要为每个aac packet添加adts,音频信息和偏移量可以存储到moov中,然后直接存储aac packet即可。
-
https://zhuanlan.zhihu.com/p/34295106
-
https://blog.csdn.net/yuhengyue/article/details/91443191
-
PCM音频数据是如何组织的?
-
PCM数据是指未经压缩的音频采样数据裸流,它是模拟信号经过采样、量化、编码转换成的标准数字音频数据。
-
-
一般都是LRLR方式
-
https://www.jianshu.com/p/e568f94cdf6a
-
https://blog.csdn.net/qq_31186123/article/details/80060102
-
https://www.zhihu.com/question/29721784
-
https://blog.csdn.net/lifei092/article/details/80990813
-
pcm数据经过AAC编码器编码后,直接写文件会怎么样?
-
不能播放,需要为aac对每一个packet添加adts头,形成adts帧,即可播放。
-
-
还有一种方式是ADIF格式,头信息只在文件头部,解码必须从头部开始,获取头信息后,剩下全是音频数据,但是这种格式的解码必须在开头位置进行。
-
https://blog.51cto.com/u_15072920/3950445【adts一般为7字节,也有可能9字节】
-
https://blog.csdn.net/user_jiang/article/details/108033848
-
https://juejin.im/post/5d6b83646fb9a06af7124c40
-
将AAC封装到mp4容器中,是否需要为每个AAC packet添加ADTS?
-
不需要,因为moov里存储里aac的具体声音信息和每个packet的偏移量,可以不需要adts。
-
-
https://www.cnblogs.com/chyingp/p/mp4-file-format.html【mp4格式介绍】
-
https://zhuanlan.zhihu.com/p/374140861【mp4格式介绍】
-
https://www.cnblogs.com/zhangxuan/p/8809245.html
-
https://blog.csdn.net/skdkjzz/article/details/40506473
-
AAC(Advance Audio Coding)封装有哪些规格,ADTS帧头包含哪些字段和含义
-
ADIF格式,头信息只在文件头部,解码必须从头部开始,获取头信息后,剩下全是音频数据,但是这种格式的解码必须在开头位置进行。
-
-
ADTS格式,每个packet都有个header,可以从任何位置开始。
-
如图 https://zhuanlan.zhihu.com/p/162998699
正在上传…重新上传取消
-
WAV格式,WAV的数据头的最小大小和作用
-
上面介绍过,前44字节(有可能比44字节多)记录采样率通道等信息,后面就是pcm裸数据。
-
-
介绍信号的时域和频域?
-
时域:信号在时间轴随时间变化的总体概括,时间和振幅的关系【横轴是时间,纵轴是信号的变化幅度】
-
-
频域:频谱图,频率和振幅的关系【横轴是频率,纵轴是信号的变化幅度】
-
https://www.zhihu.com/question/21040374
-
RTP数据包格式
-
real-time transport protocol实时传输协议。
-
-
https://zhuanlan.zhihu.com/p/86919417
-
简述H264格式
-
目标:高的视频压缩比、良好的网络亲和性,适用于各种传输网络
-
-
分层:目的是?
-
视频编码层VCL:VCL数据是编码处理的输出,表示被压缩编码后的视频数据序列。【编码/压缩、切分】
-
-
网络提取层NAL:VCL数据传输和存储之前,这些VCL数据,会被封装进NAL单元中。【打包】
-
NALU结构
-
Header有一个字节,8个比特位(1,2,5)
-
1(forbidden_zero_bit):正常为0,当前NALU存在错误时才为1
-
-
2(nal_ref_idc):NALU的重要性,0-3,值越大越重要,0表示非参考帧(其他帧解码时不需要参考该帧),如果NALU是参考帧或SPS、PPS重要数据时会大于0。
-
5(nal_unit_type):当前NALU的类型,具体类型如下图:
-
NALU Body,如图:
-
NALU = header + EBSP = header + 0x03 + RBSP = header + 0x03 + SODB + 补齐字节
-
一个NALU可以代表一个完整的帧吗?
-
不可以,看nal_unit_type,5代表完整帧,1-4不一定是完整帧。
-
-
多个NAL单元组成一个Access Unit,多个Access Unit再组成一个视频编码序列(即原始视频的一帧一帧的像素数据经过编码之后的结构组成的序列)。
-
nal_unit_type的第9位才表示是不是一个完整帧结束。
-
SPS:序列参数集,保存编码序列的全局参数,主要是profile(baseline、main、extended profile)
-
PPS:图像参数集,保存整体图像相关的参数,每一帧可能有不同的设置信息,初始QP,分块信息等。
-
IDR:后面的帧不会参考IDR之前的帧,可以刷新缓冲队列。
-
Slice:主要就是表示IBP帧。
-
SEI:补充增强帧,可以增加图像参数、用户信息等。
完整文章可以关注公众号:程序喵大人