3

2 オーディオ チャンネルで録音された .wav ファイルを 1 チャンネルのみの .wav ファイルに変換し、ビット深度を 32 から 16 に減らす必要がAVAudioConverter.convertToBufferあります。 :Error Domain=NSOSStatusErrorDomain Code=-50 "(null)"

基本的に、実際に変更する必要があるのは、オーディオを 1 つのチャネルとビット深度にストリップすることだけです。これらのファイルを別のツールから取得しているため、ファイルの記録方法を変更することはできません。

私はオーディオを扱うのが得意ではないので、少し困惑しています。私が取り組んでいるコードは以下のとおりです。不足しているものはありますか?

let inAudioFileURL:NSURL = <url_to_wav_file>

var inAudioFile:AVAudioFile?
do
{
    inAudioFile = try AVAudioFile(forReading: inAudioFileURL)
}
catch let error
{
    print ("error: \(error)")
}

let inAudioFormat:AVAudioFormat = inAudioFile!.processingFormat
let inFrameCount:UInt32 = UInt32(inAudioFile!.length)

let inAudioBuffer:AVAudioPCMBuffer = AVAudioPCMBuffer(PCMFormat: inAudioFormat, frameCapacity: inFrameCount)

do
{
    try inAudioFile!.readIntoBuffer(inAudioBuffer)
}
catch let error
{
    print ("readError: \(error)")
}

let startFormat:AVAudioFormat = AVAudioFormat.init(settings: inAudioFile!.processingFormat.settings)
print ("startFormat: \(startFormat.settings)")

var endFormatSettings = startFormat.settings
endFormatSettings[AVLinearPCMBitDepthKey] = 16
endFormatSettings[AVNumberOfChannelsKey] = 1
endFormatSettings[AVEncoderAudioQualityKey] = AVAudioQuality.Medium.rawValue
print ("endFormatSettings: \(endFormatSettings)")


let endFormat:AVAudioFormat = AVAudioFormat.init(settings: endFormatSettings)
let outBuffer = AVAudioPCMBuffer(PCMFormat: endFormat, frameCapacity: inFrameCount)

let avConverter:AVAudioConverter = AVAudioConverter.init(fromFormat: startFormat, toFormat: endFormat)

do
{
    try avConverter.convertToBuffer(outBuffer, fromBuffer: inAudioBuffer)
}
catch let error
{
    print ("avconverterError: \(error)")
}

出力に関しては:

startFormat: 
  ["AVSampleRateKey": 16000,
  "AVLinearPCMBitDepthKey": 32,
  "AVLinearPCMIsFloatKey": 1,
  "AVNumberOfChannelsKey": 2,
  "AVFormatIDKey": 1819304813,
  "AVLinearPCMIsNonInterleaved": 0,
  "AVLinearPCMIsBigEndianKey": 0]

endFormatSettings:
["AVSampleRateKey": 16000,
"AVLinearPCMBitDepthKey": 16,
"AVLinearPCMIsFloatKey": 1,
"AVNumberOfChannelsKey": 1,
"AVFormatIDKey": 1819304813,
"AVLinearPCMIsNonInterleaved": 0,
"AVLinearPCMIsBigEndianKey": 0,
"AVEncoderQualityKey": 64]

avconverterError: Error Domain=NSOSStatusErrorDomain Code=-50 "(null)"
4

1 に答える 1