Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

音频动画原理及实现 #116

Open
djk3000 opened this issue Feb 1, 2023 · 0 comments
Open

音频动画原理及实现 #116

djk3000 opened this issue Feb 1, 2023 · 0 comments

Comments

@djk3000
Copy link
Owner

djk3000 commented Feb 1, 2023

基本概念

我们平时听到的声音,都是连续的,都是模拟信号,在计算机中我们需要将他变为数字信号。
声音的频率一般会以赫兹表示,记为Hz,指每秒周期性震动的次数。

声音的原理

  1. 频率-声波的频率,即声音的音调,音调越高,频率越大;音调越低,频率越小。
  2. 振幅-声音的高低,即音量(响度)越大,振幅越大;音量越小,振幅越小
  3. 波长-声音的音色,即音调越高,波长越短;音调越低,波长越长。

数字音频基本概念

  1. 采样-在时间轴上对信号进行数字化。根据奈奎斯特定律(也称作采样定律),按照比声音最高频率的2倍以上进行采样。采样频率一般为44.1kHz,这样可保证声音达到20kHz也能被数字化。44.1kHz就是代表1秒会采样44100次。
  2. 量化-将时间连续信号转换为时间离散信号,并用实数表示。
  3. 编码-采样和量化后的信号还不是数字信号,需要将它转化为数字编码脉冲,这一过程称为编码。模拟音频进采样、量化和编码后形成的二进制序列就是数字音频信号。

PCM

  • PCM(Pulse Code Modulation),即脉冲编码调制,对声音进行采样、量化过程,未经过任何编码和压缩处理。
  • PCM音频数据是未经压缩的音频采样数据裸流,它是由模拟信号经过采样、量化、编码转换成的标准的数字音频数据。
  • PCM是在录制音频是对连续音频信号抽样,以0和1的数字形式记录,所以PCM不是连续音频。

PCM数据常用量化指标

  • 采样率(Sample rate): 每秒钟采样多少次,以Hz为单位。
  • 位深度(Bit-depth): 表示用多少个二进制位来描述采样数据,一般为16bit。
  • 字节序: 表示音频PCM数据存储的字节序是大端存储(big-endian)还是小端存储(little-endian),为了数据处理效率的高效,通常为小端存储。
  • 声道数(channel number): 当前PCM文件中包含的声道数,是单声道(mono)、双声道(stereo)?此外还有5.1声道等。
  • 采样数据是否有符号(Sign): 要表达的就是字面上的意思,需要注意的是,使用有符号的采样数据不能用无符号的方式播放。
    以FFmpeg中常见的PCM数据格式s16le为例:它描述的是有符号16位小端PCM数据。
    s表示有符号,16表示位深,le表示小端存储。

音频动画相关

因为PCM所采集的数据只是时间上的振幅波动,它是二进制的,它是时域的。如果我们需要进行对他进行画图的话,我们需要将这个时域数据转换为频域数据方便后续计算。这时候就需要傅里叶变换。

先介绍两个词
1.时域(录音)二进制
横轴是时间,纵轴是信号强度

2.频域(傅里叶变化后)
横轴是频率,纵轴是该频率信号的幅度
将一个表示波的函数从时域(时间与振幅的关系)转化为频域(频率与振幅的关系)傅里叶变化

image

傅里叶变换

用于信号在时域和频域之间的变换。
具体的傅里叶原理还是看别人的深入浅出解释

音频频谱动画实现

这里可以参考:
一步一步教你实现iOS音频频谱动画(一)
一步一步教你实现iOS音频频谱动画(二)
这里先AVAudioEngine获取音频的数据->然后通过FFT傅里叶变换转换为频域数据->最后将数据做一系列处理后变化为动画。

参考资料

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment
Labels
None yet
Projects
None yet
Development

No branches or pull requests

1 participant