Шум в звуке в ios 4.3.x и 5.0 после записи - PullRequest
0 голосов
/ 15 ноября 2011

У меня есть приложение, в котором я использую Core Audio для записи звука.Звук из некоторых частей, а затем должен быть сохранен на устройстве.Это работало нормально, но в некоторых новых версиях ios у меня есть шум, что-то вроде искажения в выходных файлах.Какова возможная причина?ExtAudioFileCreateWithURL используется для создания выходного файла и ExtAudioFileSetProperty для установки его свойств.Мы будем благодарны за любую помощь.

Этот код был создан другим программистом, который в настоящее время недоступен, поэтому я понятия не имею, почему такой хак был реализован.

Способ создания звукового буферадля разных версий ios:

static BOOL shouldFixData = NO;
    static int checkOnce = 1;
    if (checkOnce) {
        checkOnce = 0;
        if (inNumberFrames * 8 == ioData->mBuffers[0].mDataByteSize) {
            shouldFixData = YES;
        }
    }

    if (shouldFixData) {
        AudioBufferList cutData = {0};
        cutData.mNumberBuffers = 1;
        cutData.mBuffers[0].mNumberChannels = ioData->mBuffers[0].mNumberChannels;
        cutData.mBuffers[0].mDataByteSize = ioData->mBuffers[0].mDataByteSize / 2;
        cutData.mBuffers[0].mData = malloc(cutData.mBuffers[0].mDataByteSize);

        SInt32* oldData = (SInt32*)ioData->mBuffers[0].mData;
        SInt32* newData = (SInt32*)cutData.mBuffers[0].mData;
        int count = cutData.mBuffers[0].mDataByteSize/4;
        for (int i = 0; i < count; ++i) {
            newData[i] = oldData[i*2];
        }

        ExtAudioFileWriteAsync(userData->outputFile, inNumberFrames, &cutData);
        free(cutData.mBuffers[0].mData);
    } else {
        ExtAudioFileWriteAsync(userData->outputFile, inNumberFrames, ioData);
    }
}

Сохранение записи:

 CAStreamBasicDescription dstFormat;
        dstFormat.mSampleRate = mOutputFormat.mSampleRate;
        dstFormat.mFormatID = kAudioFormatLinearPCM;            
        dstFormat.mChannelsPerFrame = 2;
        dstFormat.mBitsPerChannel = 16;
        dstFormat.mBytesPerPacket = 2 * dstFormat.mChannelsPerFrame;
        dstFormat.mBytesPerFrame = 2 * dstFormat.mChannelsPerFrame;
        dstFormat.mFramesPerPacket = 1;
        dstFormat.mFormatFlags = kLinearPCMFormatFlagIsPacked | kLinearPCMFormatFlagIsSignedInteger;

        //recordInfo.output file is ExtAudioFileRef

        err = ExtAudioFileCreateWithURL((CFURLRef)recordFileURL, kAudioFileWAVEType, &dstFormat, NULL, kAudioFileFlags_EraseFile, &recordInfo.outputFile);
        if (err) { printf("ExtAudioFileCreateWithURL result %ld %08X %4.4s\n", err, (unsigned int)err, (char*)&err); return; }

        NSString *currSysVer = [[UIDevice currentDevice] systemVersion];
        NSComparisonResult versionCompareRes = [currSysVer compare:@"4.3" options:NSNumericSearch];
        if (versionCompareRes == NSOrderedSame || versionCompareRes == NSOrderedDescending) {
//for new versions
            err = ExtAudioFileSetProperty(recordInfo.outputFile, kExtAudioFileProperty_ClientDataFormat, sizeof(mOutputFormat), &mOutputFormat);
            if (err) { printf("ExtAudioFileSetProperty result %ld %08X %4.4s\n", err, (unsigned int)err, (char*)&err); return; }
        } else {
            //for old versions
            err = ExtAudioFileSetProperty(recordInfo.outputFile, kExtAudioFileProperty_ClientDataFormat, sizeof(dstFormat), &dstFormat);
            if (err) { printf("ExtAudioFileSetProperty result %ld %08X %4.4s\n", err, (unsigned int)err, (char*)&err); return; }
        }

пример выходного файла: output.mp3

Ответы [ 2 ]

1 голос
/ 28 декабря 2012

Вы можете использовать SPEEX для шумоподавления, сначала включите speex_preprocess.h:

SpeexPreprocessState *_spt = speex_preprocess_state_init(NN, 16000);/NN is 320 for sampleRate 16000.
int i=1;
speex_preprocess_ctl(_spt, SPEEX_PREPROCESS_SET_DENOISE, &i);

-(BOOL)doConvert:(void *)data SampleLength:(SInt64)length
{
    AudioBufferList *dataBuffer = (AudioBufferList*)data;
    AudioSampleType *samples = (AudioSampleType*)dataBuffer->mBuffers[0].mData;

    SInt64 count = length / NN;
    //short sample_ground[count][NN];

    short **sample_group;
    sample_group = (short**)malloc(sizeof(short*)*count);
    for (int i=0; i<count; i++)
        sample_group[i] = (short*)malloc(sizeof(short)*NN);

    for (int i = 0; i < count; i++) {
        for (int j = 0 ; j < NN; j++) {
            short value = samples[i*NN+j];
            sample_group[i][j] = value;
        }
    }
    for (int i = 0; i < count; i++) {
        speex_preprocess_run(_spt, sample_group[i]);
    }
    for (int i = 0; i < count; i++) {
        for (int j = 0 ; j < NN; j++) {
            samples[i*NN+j] = sample_group[i][j];
        }
    }

    for (int i=0; i<count; i++)
        free(sample_group[i]);
    free(sample_group);

    return YES;
}
0 голосов
/ 21 ноября 2011

упс .. должна была быть обратная связь.Извините ..

Основным отличием в размещенном вами коде является настройка формата sizeof (mOutputFormat), & mOutputFormat, где mOutputFormat не указан, как его установить.

по сравнению с форматом dst для более старой версии, которая

Установка "неправильного" формата обычно дает плохой звук: -)

...