3

AVAudioEngine を使用して、マイクからの音をさまざまな効果音ファイルと一緒に AVAudioFile に録音しようとしています。

次のように AVAudioFile を作成します。

let settings = self.engine.mainMixerNode.outputFormatForBus(0).settings
try self.audioFile = AVAudioFile(forWriting: self.audioURL, settings: settings, commonFormat: .PCMFormatFloat32, interleaved: false)

オーディオ エンジンの mainMixerNode にタップをインストールし、バッファをファイルに書き込みます。

self.engine.mainMixerNode.installTapOnBus(0, bufferSize: 4096, format: self.engine.mainMixerNode.outputFormatForBus(0)) { (buffer, time) -> Void in
    do {
        try self.audioFile?.writeFromBuffer(buffer)
    } catch let error as NSError {
        NSLog("Error writing %@", error.localizedDescription)
    }
}

self.engine.mainMixerNode.outputFormatForBus(0).settingsApple は、「バッファ形式はファイルの処理形式と一致する必要があるため、上記の AVAudioFile オブジェクトの作成時に outputFormatForBus: が使用された」と述べているため、オーディオ ファイルの作成時に使用しています。installTapOnBus のドキュメントでは、「指定されたバスのタップと接続の形式 (非 nil の場合) は同一である必要があります」

ただし、これにより、圧縮されていない非常に大きなオーディオ ファイルが生成されます。ファイルを .m4a として保存したいのですが、使用したい設定を指定する場所がわかりません:

[
    AVFormatIDKey: NSNumber(unsignedInt: kAudioFormatMPEG4AAC),
    AVSampleRateKey : NSNumber(double: 32000.0), //44100.0
    AVNumberOfChannelsKey: NSNumber(int: 1),
    AVEncoderBitRatePerChannelKey: NSNumber(int: 16),
    AVEncoderAudioQualityKey: NSNumber(int: Int32(AVAudioQuality.High.rawValue))
]

オーディオ ファイルの作成時に代わりにこれらの設定を渡すと、録音時にアプリがクラッシュします。

これを解決する方法に関する提案やアイデアはありますか?

4

0 に答える 0