サウンドファイルにサウンドを書き込むためのAVAudioFileを作成しています。ファイルが既に存在する場合、私は、既存のファイルを置き換えるのではなく、最後に書き込みを続けるために、ファイルの最後にframePositionを移動したいと思います。ファイルが存在する場合でもAVAudioFile.lengthは0です。
私はいくつかのテストを行いました。ファイルから新しいファイルにバッファを読み込み、元のファイルを上書きしないようにしました。
let audioFile = try AVAudioFile(forReading: [URL to existing .caf file])
let audioFrameCount = AVAudioFrameCount(UInt32(audioFile.length))
let audioBuffer = AVAudioPCMBuffer(PCMFormat: audioFile.processingFormat, frameCapacity: audioFrameCount)
let newAudioFile = try AVAudioFile(forWriting: [another URL], settings: self.engine.mainMixerNode.outputFormatForBus(0).settings)
try newAudioFile.readIntoBuffer(audioBuffer, frameCount: audioFrameCount!) <-- CRASHES ON THIS LINE
クラッシュログ:終了によるキャッチされない例外のアプリ「com.apple.coreaudio.avfaudio」、理由:「私は新しいファイルにバッファを読み込むしようとしているとき、私はクラッシュを取得していますエラー-50 '
男、私は本当にCoreAudioクラッシュログが嫌いです。彼らは私に絶対に何も言わない!
書き込みのために作成されたファイルにデータを読み込むことはできませんか?
UPDATE
OK、ので、いくつかの提案をした後、私はいくつかの変更をしました。基本的には、私が服用しているステップです:
- ファイルがすでに存在するかどうかを確認してください。
- もしそうなら、読み込み用に開き、オーディオバッファを取得します。 新しいファイルに古いファイルからバッファを書き込むために(同じファイルのURLを使用して)
- 使用writeFromBufferを記述するための新しいファイルを作成します。私はそのように最後に新しいファイルのframePositionを移動
- それに書き込み/録音を続けることができます。
ただし、書き込んだ後の新しいファイルの長さは0です。
はここに私のコードです:ところで
//Check if a file already exists. If so continue to record at the end of it
var audioBuffer : AVAudioPCMBuffer!
var audioFrameCount : AVAudioFrameCount!
if (NSFileManager.defaultManager().fileExistsAtPath(self.audioRecordURL.path!)) {
do {
let existingAudioFile = try AVAudioFile(forReading: self.audioRecordURL)
audioFrameCount = AVAudioFrameCount(existingAudioFile.length)
if (audioFrameCount > 0) {
audioBuffer = AVAudioPCMBuffer(PCMFormat: existingAudioFile.processingFormat, frameCapacity: audioFrameCount)
}
} catch let error as NSError {
NSLog("Error reading buffer from file %@", error.localizedDescription)
}
}
//Create a new file. This will replace the old file
do {
self.audioFile = try AVAudioFile(forWriting: self.audioRecordURL, settings: self.engine.mainMixerNode.outputFormatForBus(0).settings)
} catch let error as NSError {
NSLog("Error creating AVAudioFile %@", error.localizedDescription)
}
//Read the audio buffer from the old file into the new file
if (audioBuffer != nil) {
do {
try self.audioFile.writeFromBuffer(audioBuffer)
self.audioFile.framePosition = self.audioFile.length
} catch let error as NSError {
NSLog("Error reading buffer into file %@", error.localizedDescription)
}
}
、readIntoBufferの命名は私には非常に混乱しています。バッファにファイルを読み込むためにそのメソッドを使用する必要があるかのように聞こえますが、ドキュメントに従ってバッファをファイルに読み込む必要がありますか?では、なぜ私のファイルにバッファを追加するためにそのメソッドを使用できないのですか?なぜ私はwriteFromBufferを使用する必要がありますか?
UPDATE 2
だから、私はそれを解決するために管理しました。私はそれを使用する前に、実際にデータをバッファに書き込むためにreadIntoBufferを呼び出す必要があったようです。だから私は
audioBuffer = AVAudioPCMBuffer(PCMFormat: existingAudioFile.processingFormat, frameCapacity: audioFrameCount)
は '-50'通常、パラメータエラーです。 'audioFrameCount'の背後にある'! 'は本当に必要ですか? 'audioFrameCount'は有効な値を持っていますか? – hendrik
私は削除! (なぜ私はそこにそれがあったかわからない)。はい、audioFrameCountには有効な値があります。 – andlin
そしてあなたはまだ50を得ていますか?書き込み用に開かれたファイルから実際に読み込むことができないか、または設定が何らかの形でオーディオバッファ形式と一致しません。最初にファイルを開いて読み込み、ファイルを閉じてからこの問題を回避するために書き出してみませんか? – hendrik