音视频调试

99 阅读1分钟

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