AVFoundation: искаженный формат файла .m4a с использованием AVAudioEngine и AVAudioFile.

У меня проблема с записью данных с помощью AVAudioEngine и AVAudioFile с использованием новой платформы AVFoundation в бета-версии iOS 8.

Я хотел бы записывать данные, нажимая на входной узел, используя формат m4a. Однако выходной файл кажется поврежденным, но при изменении формата файла на .aac с той же настройкой файл имеет правильный формат и может успешно воспроизводиться:

import Foundation
import AVFoundation

func captureMicrophoneInput() {
    var error : NSError?

    var audioFileSettings = Dictionary<NSObject, AnyObject>()
    audioFileSettings[AVFormatIDKey]                 = kAudioFormatMPEG4AAC
    audioFileSettings[AVNumberOfChannelsKey]         = 1
    audioFileSettings[AVSampleRateKey]               = 44100.0
    audioFileSettings[AVEncoderBitRatePerChannelKey] = 16
    audioFileSettings[AVEncoderAudioQualityKey]      = AVAudioQuality.Medium.toRaw()

    let audioEngine = AVAudioEngine()
    let inputNode = audioEngine.inputNode

    // by using .acc the output file can be played successfully
    let url : CFURL = NSURL.fileURLWithPath("/path/to/outputdir/myFileWithProblematicExtension.m4a") as CFURL
    var audioFile = AVAudioFile(forWriting: url, settings: audioFileSettings, error: &error)

    if error != nil {
        println("AVAudioFile error")
        println(error)
        return
    }   

    // Write the output of the input node to disk
    inputNode.installTapOnBus(0, bufferSize: 4096, 
                                     format: inputNode.outputFormatForBus(0), 
                                      block: { (audioPCMBuffer : AVAudioPCMBuffer!, audioTime : AVAudioTime!) in
        audioFile.writeFromBuffer(audioPCMBuffer, error: &error)

        if error != nil {
            println("AVAudioFile error")
            println(error)
            return
        }
    })    

    audioEngine.startAndReturnError(&error)
}

Я был бы рад, если бы кто-нибудь мог внести свой вклад в это. Спасибо!


person borrel    schedule 25.06.2014    source источник
comment
Ошибка с идентификатором 17495706 была отправлена ​​в Apple.   -  person borrel    schedule 28.06.2014
comment
Вы изменили свои настройки, чтобы использовать kAudioFormatAppleLossless для AVFormatIDKey?   -  person Gene De Lisa    schedule 10.08.2014
comment
Удалось ли вам когда-нибудь это решить? У меня такая же проблема. Использование .acc работает нормально, но .m4a - нет.   -  person rodskagg    schedule 02.12.2015


Ответы (1)


Мой код Swift также не может записывать в формат MPEG4AAC, начиная с XCode 6.0 / Swift 1.0 GM. По-видимому, константа kAudioFormatMPEG4AAC все еще неправильно определена. Файл создается, но не заполняется звуковыми образцами.

Единственный обходной путь, который я смог найти, - это создать словарь настроек во вспомогательной функции Objective C:

+ (NSDictionary *)getRecorderSettings
{
    return @{AVFormatIDKey: @(kAudioFormatMPEG4AAC),
             AVNumberOfChannelsKey: @(1),
             AVSampleRateKey:@(22050),
             AVEncoderAudioQualityKey: @(AVAudioQualityHigh)};
}

и передайте это обратно в код Swift для инициализации AVAudioRecorder:

_recorder = AVAudioRecorder(URL: fileURL, settings: recsettings, error: &initRecorderError)   
person karstkhan    schedule 26.09.2014
comment
Ваш обходной путь не требуется: вы также можете создать NSNumber из быстрого кода. например что-то вроде [AVFormatIDKey: NSNumber (unsignedInt: kAudioFormatMPEG4AAC), AVNumberOfChannelsKey: NSNumber (unsignedInt: 2), AVSampleRateKey: NSNumber (double: 44100.0)] отлично работает для меня. - person zliw; 01.11.2015
comment
Вам не нужно создавать AVAudioRecorder, чтобы получить аудиоданные, он просто нажимает на микрофон. - person user3344977; 13.03.2016