bug1:部分系统版本有杂音
16384
Optional(<CMAudioFormatDescription 0x600000878b40 [0x7fff805ed4e0]> {
mediaType:'soun'
mediaSubType:'lpcm'
mediaSpecific: {
ASBD: {
mSampleRate: 44100.000000
mFormatID: 'lpcm'
mFormatFlags: 0xc
mBytesPerPacket: 2
mFramesPerPacket: 1
mBytesPerFrame: 2
mChannelsPerFrame: 1
mBitsPerChannel: 16 }
cookie: {(null)}
ACL: {Mono}
FormatList Array: {
Index: 0
ChannelLayoutTag: 0x640001
ASBD: {
mSampleRate: 44100.000000
mFormatID: 'lpcm'
mFormatFlags: 0xc
mBytesPerPacket: 2
mFramesPerPacket: 1
mBytesPerFrame: 2
mChannelsPerFrame: 1
mBitsPerChannel: 16 }}
}
extensions: {(null)}
})
解决:ASBD设置
bug2:真机有杂音,模拟器正常
void impAudioQueueInputCallback ( void * inUserData, AudioQueueRef inAQ, AudioQueueBufferRef inBuffer, const AudioTimeStamp * inStartTime, UInt32 inNumberPacketDescriptions, const AudioStreamPacketDescription *inPacketDescs)
{
struct RecorderStat *recorderStat = (struct RecorderStat *) inUserData;
if (0 == inNumberPacketDescriptions && recorderStat->mDataFormat.mBytesPerPacket != 0) { // for CBR
inNumberPacketDescriptions = recorderStat->bufferByteSize/recorderStat->mDataFormat.mBytesPerPacket;
}
NSLog(@"%u",(unsigned int)recorderStat->mCurrentPacket);
OSStatus stt = AudioFileWritePackets(recorderStat->mAudioFile, true, recorderStat->bufferByteSize, inPacketDescs, recorderStat->mCurrentPacket, &inNumberPacketDescriptions, inBuffer->mAudioData);
VStatus(stt, @"AudioFileWritePackets error");
recorderStat->mCurrentPacket += inNumberPacketDescriptions;
stt = AudioQueueEnqueueBuffer(recorderStat->mQueue, inBuffer, 0, NULL);
VStatus(stt, @"AudioQueueEnqueueBuffer error");
if(inNumberPacketDescriptions > 0 && recorderStat->mIsRunning){
// 发送数据
NSData *bufferData = [NSData dataWithBytes:inBuffer->mAudioData length:inBuffer->mAudioDataByteSize];
//NSLog(@"%lu",(unsigned long)bufferData.length);
int sendLen = 0;
int sendUnit = 640;
if(bufferData.length < sendUnit){
[[BGSocketManage sharedInstance] sendVoiceData:bufferData];
}
else{
for(;sendLen < bufferData.length;sendLen += sendUnit){
if(sendLen + sendUnit >= bufferData.length){
NSData *subdata = [bufferData subdataWithRange:NSMakeRange(sendLen,bufferData.length-sendLen)];
[[BGSocketManage sharedInstance] sendVoiceData:subdata];
}else{
NSData *subdata = [bufferData subdataWithRange:NSMakeRange(sendLen,sendUnit)];
[[BGSocketManage sharedInstance] sendVoiceData:subdata];
}
}
}
}
}
解决:AudioQueueEnqueueBuffer放最后,或者缓冲区大于3