CaptureSessionController.mm в AVCaptureToAudioUnit не будет записывать файлы wav, aac или mp3

Я использую пример кода AVCaptureToAudioUnit для записи голоса, используя iPhone в качестве микрофона. Я использовал этот пример в качестве отправной точки, потому что у меня был больший успех с этим примером проекта, чем с другими примерами проекта.

Когда файл имеет формат.aif или.caf, демонстрационное приложение работает нормально, но когда я создаю файл.wav, .aac или.mp3, в консоли отладки появляется следующее сообщение

AudioStreamBasic Описание: 1 канал, 44100 Гц, 'lpcm' (0x0000000E) 16-разрядное целое число со знаком с прямым порядком байтов

2013-07-26 19:52:06.653 AVCaptureToAudioUnit[2514:907] Failed to setup audio file! (29759)

Чтобы изменить формат файла, я сделал два изменения

[a] расширение файла в операторе NSString (см. изменение в init ниже) и

[b] совместимые настройки с использованием констант, определенных в Справочнике по аудиофайловым службам (в startRecording).

Нужно ли менять другие свойства при использовании других форматов файлов? Кто-нибудь сталкивался с этой проблемой?

Вот код для [a]

@implementation CaptureSessionController

#pragma mark ======== Setup and teardown methods =========

- (id)init
{
    self = [super init];

    if (self) {

    NSArray  *paths = NSSearchPathForDirectoriesInDomains(NSDocumentDirectory, NSUserDomainMask, YES);
    NSString *documentsDirectory = [paths objectAtIndex:0];
    //NSString *destinationFilePath = [NSString stringWithFormat: @"%@/AudioRecording.aac", documentsDirectory];
    //NSString *destinationFilePath = [NSString stringWithFormat: @"%@/AudioRecording.caf", documentsDirectory];
    //NSString *destinationFilePath = [NSString stringWithFormat: @"%@/AudioRecording.wav", documentsDirectory];
    //NSString *destinationFilePath = [NSString stringWithFormat: @"%@/AudioRecording.mp3", documentsDirectory];

    // and the following statement is the line of code found in the original example

    NSString *destinationFilePath = [NSString stringWithFormat: @"%@/AudioRecording.aif", documentsDirectory];
    _outputFile = CFURLCreateWithFileSystemPath(kCFAllocatorDefault, (CFStringRef)destinationFilePath, kCFURLPOSIXPathStyle, false);

    [self registerForNotifications];
    }

return self;

}

И вот код для [b]

- (void)startRecording
{
    if (!self.isRecording) {
    OSErr err = kAudioFileUnspecifiedError;
    @synchronized(self) {
    if (!extAudioFile) {
/*
    Start recording by creating an ExtAudioFile and configuring it with the same 
    sample rate and channel layout as those of the current sample buffer.
*/
    // recording format is the format of the audio file itself
    CAStreamBasicDescription recordingFormat(currentInputASBD.mSampleRate, currentInputASBD.mChannelsPerFrame, CAStreamBasicDescription::kPCMFormatInt16, true);
    recordingFormat.mFormatFlags |= kAudioFormatFlagIsBigEndian;

    NSLog(@"Recording Audio Format:");
    recordingFormat.Print();

    err = ExtAudioFileCreateWithURL(_outputFile,

    //kAudioFileAAC_ADTSType,   // won't restart recording "Failed to setup audio file"
    //kAudioFileCAFType,        // starts and stops correctly
    //kAudioFileWAVEType,       // won't restart recording "Failed to setup audio file"
    //kAudioFileMP3Type,        // won't restart recording "Failed to setup audio file"
    kAudioFileAIFFType,       // starts and stops correctly

    &recordingFormat,
    currentRecordingChannelLayout,
    kAudioFileFlags_EraseFile,
    &extAudioFile);

    if (noErr == err)

    // client format is the output format from the delay unit
    err = ExtAudioFileSetProperty(extAudioFile, kExtAudioFileProperty_ClientDataFormat, sizeof(graphOutputASBD), &graphOutputASBD);

    if (noErr != err) {

                        if (extAudioFile) ExtAudioFileDispose(extAudioFile);
                        extAudioFile = NULL;
                      }
                  }
              } // @synchronized

    if (noErr == err) {
        self.recording = YES;
      NSLog(@"Recording Started");
       } else {
        NSLog(@"Failed to setup audio file! (%ld)", (long)err);
         }
    }
}

0 ответов

Другие вопросы по тегам