Записать звук на диск из модуля ввода-вывода

Переписать этот вопрос, чтобы он был немного более удобным.

Моя проблема в том, что я не могу успешно записать аудиофайл на диск с удаленного модуля ввода-вывода.

Я предпринял следующие шаги:

Открытие mp3-файла и извлечение его звука в буфер. Я настроил asbd для использования с моим графиком на основе свойств графика. Я настраиваю и запускаю свой график, зацикливая извлеченный звук, и звук успешно выходит из динамика!

У меня возникают трудности с взятием звуковых образцов из обратного вызова удаленного ввода-вывода и их запись в аудиофайл на диске, которым я являюсь с использованием ExtAudioFileWriteASync для.

Аудиофайл записывается и имеет некоторое слышимое сходство с исходным mp3, но звучит очень искаженно.

Я не уверен, что проблема

A) ExtAudioFileWriteAsync не может записать образцы так быстро, как их предоставляет обратный вызов модуля io.

  • или -

B) Я неправильно настроил ASBD для ссылки на экстадиофайл. Я хотел начать с сохранения файла wav. Я не уверен, правильно ли я описал это в ASBD ниже.

Во-вторых, я не уверен, какое значение передать свойству inChannelLayout при создании аудиофайла.

И, наконец, я очень не уверен, какой asbd использовать для kExtAudioFileProperty_ClientDataFormat. Я использовал свой формат стереопотока, но при внимательном рассмотрении документации говорится, что это должен быть pcm. Должен ли он быть в том же формате, что и вывод для remoteio? И если это так, я ошибался, установив формат вывода удаленного io на stereostreamformat?

Я понимаю, что в этом вопросе очень много вопросов, но у меня есть много неуверенности, которую я не могу решить самостоятельно.

] настройка формата стереопотока

- (void) setupStereoStreamFormat
{

    size_t bytesPerSample = sizeof (AudioUnitSampleType);
    stereoStreamFormat.mFormatID          = kAudioFormatLinearPCM;
    stereoStreamFormat.mFormatFlags       = kAudioFormatFlagsAudioUnitCanonical;
    stereoStreamFormat.mBytesPerPacket    = bytesPerSample;
    stereoStreamFormat.mFramesPerPacket   = 1;
    stereoStreamFormat.mBytesPerFrame     = bytesPerSample;
    stereoStreamFormat.mChannelsPerFrame  = 2;                    // 2 indicates stereo
    stereoStreamFormat.mBitsPerChannel    = 8 * bytesPerSample;
    stereoStreamFormat.mSampleRate        = engineDescribtion.samplerate;

    NSLog (@"The stereo stereo format :");


}

настройка обратного вызова удаленного управления с использованием формата стереопотока

AudioUnitSetProperty(engineDescribtion.masterChannelMixerUnit, 
                             kAudioUnitProperty_StreamFormat, 
                             kAudioUnitScope_Output, 
                             masterChannelMixerUnitloop, 
                             &stereoStreamFormat, 
                             sizeof(stereoStreamFormat));

        AudioUnitSetProperty(engineDescribtion.masterChannelMixerUnit, 
                             kAudioUnitProperty_StreamFormat, 
                             kAudioUnitScope_Input, 
                             masterChannelMixerUnitloop, 
                             &stereoStreamFormat, 
                             sizeof(stereoStreamFormat));




static OSStatus masterChannelMixerUnitCallback(void *inRefCon, 
                              AudioUnitRenderActionFlags *ioActionFlags, 
                              const AudioTimeStamp *inTimeStamp, 
                              UInt32 inBusNumber, 
                              UInt32 inNumberFrames, 
                              AudioBufferList *ioData)

{

   // ref.equnit;
    //AudioUnitRender(engineDescribtion.channelMixers[inBusNumber], ioActionFlags, inTimeStamp, 0, inNumberFrames, ioData);
    Engine *engine= (Engine *) inRefCon;
    AudioUnitRender(engineDescribtion.equnit, ioActionFlags, inTimeStamp, 0, inNumberFrames, ioData);

    if(engine->isrecording)
    {
        ExtAudioFileWriteAsync(engine->recordingfileref, inNumberFrames, ioData);

    }


    return 0;

}

** настройка записи **

-(void)startrecording

{

    NSArray  *paths = NSSearchPathForDirectoriesInDomains(NSDocumentDirectory, NSUserDomainMask, YES);
    NSString *documentsDirectory = [paths objectAtIndex:0];
    destinationFilePath = [[NSString alloc] initWithFormat: @"%@/testrecording.wav", documentsDirectory];
    destinationURL = CFURLCreateWithFileSystemPath(kCFAllocatorDefault, (CFStringRef)destinationFilePath, kCFURLPOSIXPathStyle, false);

    OSStatus status;

    // prepare a 16-bit int file format, sample channel count and sample rate
    AudioStreamBasicDescription dstFormat;
    dstFormat.mSampleRate=44100.0;
    dstFormat.mFormatID=kAudioFormatLinearPCM;
    dstFormat.mFormatFlags=kAudioFormatFlagsNativeEndian|kAudioFormatFlagIsSignedInteger|kAudioFormatFlagIsPacked;
    dstFormat.mBytesPerPacket=4;
    dstFormat.mBytesPerFrame=4;
    dstFormat.mFramesPerPacket=1;
    dstFormat.mChannelsPerFrame=2;
    dstFormat.mBitsPerChannel=16;
    dstFormat.mReserved=0;

    // create the capture file
  status=  ExtAudioFileCreateWithURL(destinationURL, kAudioFileWAVEType, &dstFormat, NULL, kAudioFileFlags_EraseFile, &recordingfileref);
    CheckError( status ,"couldnt create audio file");
        // set the capture file's client format to be the canonical format from the queue
 status=ExtAudioFileSetProperty(recordingfileref, kExtAudioFileProperty_ClientDataFormat, sizeof(AudioStreamBasicDescription), &stereoStreamFormat);

    CheckError( status ,"couldnt set input format");

    ExtAudioFileSeek(recordingfileref, 0);
 isrecording=YES;

  // [documentsDirectory release];


}

редактировать 1

Сейчас я действительно колю в темноте, но мне нужно использовать аудио конвертер или kExtAudioFileProperty_ClientDataFormat позаботится об этом?

edit 2

Я прикрепляю 2 аудиофайла. Первый - это оригинальный звук, который я зацикливаю и пытаюсь скопировать. Второй - это записанный звук этого цикла. Надеюсь, это поможет кому-нибудь понять, что происходит не так.

Исходный mp3

Проблема с записью mp3

10
задан dubbeat 5 August 2011 в 12:50
поделиться