概述
实现了PCM混音算法。以5个wav混音,其中每个wav长度均为2205个点,为例。
数据格式:以16位有符号数short存储wav音频文件。(#define AUDIO_DATA_TYPE short)
输入
allMixingSounds为5个vector,其中每个vector为2205个音频点。
输出
__pRawDataBuffer为1个vector,其中为2205个音频点。
混音算法
- 时间片切割:单点、分段
- 简单叠加
- 叠加+归一化
注意
音频信号有正负。
叠加时要用更长的数据长度来存储,防止溢出。(有符号数超过上限,如short的音频值超过32767或小于-32768)
代码
数据类型
#define AUDIO_DATA_TYPE short // 为方便修改,在AudioDevice.h的顶部设定数据类型宏定义
// DWORD(unsigned long)? long? short?
#define AUDIO_DATA_TYPE_MAX 32767 // 2^15(short)
#define AUDIO_DATA_TYPE_MIN -32768
#define WIDEN_TEMP_TYPE int // 4字节有符号的中间变量,用于混音时防止溢出
头文件
class CAudioMix
{
public:
// 切割时间片,单点混音
void TimeSliceByPoint( vector<vector<AUDIO_DATA_TYPE>> allMixingSounds,
DWORD RawDataCnt,
vector<AUDIO_DATA_TYPE>* __pRawDataBuffer);
// 切割时间片,分段混音
void TimeSliceBySection(vector<vector<AUDIO_DATA_TYPE>> allMixingSounds,
DWORD RawDataCnt,
vector<AUDIO_DATA_TYPE>* __pRawDataBuffer);
// CombinePointsToOneWay1
void CombinePointsToOneWay1(vector<vector<AUDIO_DATA_TYPE>> allMixingSounds,
DWORD RawDataCnt,
vector<AUDIO_DATA_TYPE>* __pRawDataBuffer);
// MixNewLC
void CombinePointsToOneNewLC(vector<vector<AUDIO_DATA_TYPE>> allMixingSounds,
DWORD RawDataCnt,
vector<AUDIO_DATA_TYPE>* __pRawDataBuffer);
// 直接简单地叠加
void CAudioSource::CAudioMix::MixSoundsBySimplyAdd(vector<vector<AUDIO_DATA_TYPE>> allMixingSounds,
DWORD RawDataCnt,
vector<AUDIO_DATA_TYPE>* __pRawDataBuffer);
// 叠加,然后取均值
void CAudioSource::CAudioMix::MixSoundsByMean(vector<vector<AUDIO_DATA_TYPE>> allMixingSounds,
DWORD RawDataCnt,
vector<AUDIO_DATA_TYPE>* __pRawDataBuffer);
// 叠加,然后归一化
void CAudioSource::CAudioMix::AddAndNormalization(vector<vector<AUDIO_DATA_TYPE>> allMixingSounds,
DWORD RawDataCnt,
vector<AUDIO_DATA_TYPE>* __pRawDataBuff