2015-12-06 25 views
5

サウンドファイルにサウンドを書き込むための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、ので、いくつかの提案をした後、私はいくつかの変更をしました。基本的には、私が服用しているステップです:

  1. ファイルがすでに存在するかどうかを確認してください。
  2. もしそうなら、読み込み用に開き、オーディオバッファを取得します。
  3. 新しいファイルに古いファイルからバッファを書き込むために(同じファイルのURLを使用して)
  4. 使用writeFromBufferを記述するための新しいファイルを作成します。私はそのように最後に新しいファイルのframePositionを移動
  5. それに書き込み/録音を続けることができます。

ただし、書き込んだ後の新しいファイルの長さは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) 
+0

は '-50'通常、パラメータエラーです。 'audioFrameCount'の背後にある'! 'は本当に必要ですか? 'audioFrameCount'は有効な値を持っていますか? – hendrik

+0

私は削除! (なぜ私はそこにそれがあったかわからない)。はい、audioFrameCountには有効な値があります。 – andlin

+0

そしてあなたはまだ50を得ていますか?書き込み用に開かれたファイルから実際に読み込むことができないか、または設定が何らかの形でオーディオバッファ形式と一致しません。最初にファイルを開いて読み込み、ファイルを閉じてからこの問題を回避するために書き出してみませんか? – hendrik

答えて

1

これはあなたがここで提供したコードでちょうどタイプミスがあるかどうかわからないの後に、このライン

try existingAudioFile.readIntoBuffer(audioBuffer) 

を追加し、私はこの分野での専門家ではないんだけど、おそらくそれは(newAudioFile)を作成するための開かれたファイルから読み取ることができないことを理にかなっているので

try audioFile.readIntoBuffer(audioBuffer, frameCount: audioFrameCount!) 

:あなたはなりクラッシュラインを持つことを意味しました。

し、そのバッファを充填した後、あなたはwriteFromBuffer https://developer.apple.com/library/ios/documentation/AVFoundation/Reference/AVAudioFile_Class/#//apple_ref/occ/instm/AVAudioFile/writeFromBuffer:error使用して、新しいファイルに書きたいでしょう:

+0

バッファーを私の古いオーディオファイルから新しく作成したバッファーに追加します(そして最後に録音を続けます)。代わりにwriteFromBufferを使うべきですか?私がクラッシュすることはありません、私のオーディオファイルの長さは、書き込み後に0です。私はいくつかの詳細情報を私の質問を更新します – andlin

+0

私はこれを解決するのを助けてくれてありがとう。バッファを使用する前に、readIntoBufferを呼び出して、古いファイルのデータで実際にバッファを埋める必要があることに気づいていませんでした。 readIntoBufferのドキュメントでは、「ファイルを読み込むバッファ」と記載されています。それは私が実際にしているものとは正反対のものと思われます。 – andlin

関連する問題