KSYAudioMixer.h 5.9 KB

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