KSYAudioMixer.h
5.94 KB
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
//
// KSYAudioMixer.h
// KSYStreamer
//
//
// Created by pengbin on 10/15/15.
// Copyright © 2015 ksy. All rights reserved.
//
#import <Foundation/Foundation.h>
#import <AVFoundation/AVFoundation.h>
#pragma mark - audio format
/** 多路pcm混音
1. 用trackId来表示某一路音频,从0开始编号
2. 要求一定要有一路麦克风的音频,其他音频都叠加到麦克风上
3. 将输入的音频pcm数据存入buffer,每一路音频的buffer独立
4. 每次麦克风的音频输入,都会触发从所有buffer中取数据,混合,发送的动作
5. 每一路音频可以单独配置音量
6. 输出格式固定为 44.1KHz, S16 (声道数可设定)
*/
@interface KSYAudioMixer : NSObject
/**
@abstract 获取最大支持的混合路数
**/
- (int)getMaxMixTrack;
/**
@abstract 设置混音音量(默认音量为1.0)
@param vol 音量比例(0.0~2.0) (<1.0 为缩小, > 1.0为放大)
@param trackId 设置对应track的
@return NO为设置失败,如track不存在,或vol超出范围
@warning 设置放大的音量可能会出现爆音, 请注意
**/
- (BOOL) setMixVolume:(float) vol
of:(int) trackId;
/**
@abstract 设置立体声混音音量(默认音量为1.0),如果设置的单声道输出,则使用leftVolume进行处理
@param leftVolume 左声道音量比例(0.0~2.0) (<1.0 为缩小, > 1.0为放大)
@param rightVolume 右声道音量比例(0.0~2.0) (<1.0 为缩小, > 1.0为放大)
@param trackId 设置对应track的
@return NO为设置失败,如track不存在,或vol超出范围
@warning 设置放大的音量可能会出现爆音, 请注意
**/
- (BOOL) setMixVolume:(float)leftVolume rightVolume:(float)rightVolume
of:(int)trackId;
/**
@abstract 查询track的音量
@param trackId 设置对应track的
@return 负数为查询失败,如track不存在
**/
- (float) getMixVolume:(int) trackId;
/**
@abstract 查询track的音量,
@param leftVolume 左声道音量比例
@param rightVolume 右音量比例
@param trackId 设置对应track的
@return 负数为查询失败,如track不存在
**/
- (void) getMixVolume:(float *)leftVolume rightVolume:(float *)rightVolume
of:(int)trackId;
/**
@abstract 开启/关闭一路声音
@param onOff 开关, 0号track默认开启
@param trackId 开关对应track
@return NO为设置失败,比如trackID不存在
**/
- (BOOL) setTrack:(int) trackId
enable:(BOOL)onOff;
/**
@abstract 查询track是否开启
@param trackId 开关对应track
**/
- (BOOL) getTrackEnable:(int) trackId;
/**
@abstract 查询track中缓存数据的长度(单位为一次输出的samplebuffer数)
@param trackId 开关对应track
@return <0, 表示查询失败
=0,表示残余的数据不足一次输出
>0, 表示buffer中的数据还可以输出n次
**/
- (int) getBufLength:(int) trackId;
/**
@abstract 查询track中缓存数据的samplebuffer数
@param trackId 开关对应track
@return <0, 表示查询失败
=0,表示无残余的数据
>0, 表示buffer中sample数
**/
- (int) getNumSamplesInBuffer:(int) trackId;
/**
@abstract 输入音频PCM
@param sampleBuffer 音频数据
@param trackId 设置对应track的
@return NO为设置失败,比如trackID不存在
*/
- (BOOL)processAudioSampleBuffer:(CMSampleBufferRef)sampleBuffer
of:(int) trackId;
/**
@abstract 输入音频PCM
@param pData 原始数据指针数组,单通道仅pData[0]有效 当输入为多通道且非交织时, pData[i]分别表示各个通道的数据
@param len 数据的长度,单位为sample (bytes / sizeof(sample))
@param fmt 原始数据的格式
@param pts 原始数据的时间戳
@param trackId 设置对应track的
@return NO为设置失败,比如trackID不存在
@discussion 传入数据为NULL时,仅仅检查是否有数据输出
*/
- (BOOL)processAudioData:(uint8_t**)pData
nbSample:(int)len
withFormat:(const AudioStreamBasicDescription*)fmt
timeinfo:(CMTime)pts
of:(int) trackId;
/**
@abstract 音频处理回调接口
@discussion sampleBuffer 混音后的音频数据
@discussion 请注意本函数的执行时间,如果太长可能导致不可预知的问题
@discussion 请参考 CMSampleBufferRef
@discussion 与pcmProcessingCallback两者只能二选一, 设置 audioProcessingCallback 会清空 pcmProcessingCallback
*/
@property(nonatomic, copy) void(^audioProcessingCallback)(CMSampleBufferRef sampleBuffer);
/**
@abstract 音频处理回调接口
@discussion pData 为数据指针 (双通道时, 数据为交织格式), 仅pData[0] 有效
@discussion nbSample 为数据长度, 单位为sample (bytes / sizeof(sample)/channels)
@discussion 请注意本函数的执行时间,如果太长可能导致不可预知的问题
@discussion 与audioProcessingCallback两者只能二选一, 设置 pcmProcessingCallback 会清空audioProcessingCallback
*/
@property(nonatomic, copy) void(^pcmProcessingCallback)(uint8_t** pData, int nbSample, CMTime pts);
/**
@abstract 主轨的trackId (默认为0)
@discussion 比如micphone的track,所有track都同步到主轨的时间轴
*/
@property(nonatomic, assign) int mainTrack;
/**
@abstract 输出音频是否为双声道立体声 (默认为NO)
@discussion 如果输入数据都不是双声道则输出数据左右耳内容一样
@discussion 输出立体声的数据格式一定是交织的
*/
@property(nonatomic, assign) BOOL bStereo;
/**
@abstract 每一次输出数据(Frame)的sample数, 默认为1024
*/
@property (nonatomic, assign) int frameSize;
/**
@abstract 输出音频的采样率, 默认为44100
*/
@property (nonatomic, assign) int sampleRate;
/**
@abstract 混音后输出PCM的格式
*/
@property (nonatomic, readonly) AudioStreamBasicDescription* outFmtDes;
@end