2017-08-19 30 views
0

次のコードは、すべて私のデバイス(iPhone、アップルウォッチ、シミュレータ)の上に短い期間のオーディオファイルのために働く:AVAudioPCMBuffer - バッファへの読み込み:AVAudioPCMBuffer)メモリクラッシュ? (バッファオーバーフロー)

let file = try! AVAudioFile(forReading: url!) let format = AVAudioFormat(commonFormat: .pcmFormatFloat32, sampleRate: file.fileFormat.sampleRate, channels: file.fileFormat.channelCount, interleaved: false) let buf = AVAudioPCMBuffer(pcmFormat: format!, frameCapacity: UInt32(file.length)) try! file.read(into: buf!)

クラッシュがしかし5を読み取ろうとtry! file.read(into: buf!) で発生しますたとえば、長いオーディオファイルがApple Watchでクラッシュしています(ただし、Apple Watch Simulatorで動作します)。 Program ended with exit code: 0

デバッグツールを見ても、明らかにこのプロセスはiPhoneよりもApple Watchに課税されます。私は別のスレッド、バックグラウンドなどで役に立たないように実行しようとしました。

私はバッファーを処理するためにiPhoneに送ることができますが、時計からバッファーを厳密に読み取ることができれば(少しでも時間がかかりますが)見たいと思います。

答えて

0

44.1kHzで5分間のモノLPCM float32オーディオは5 * 60 * 44100 * 4バイト、つまり約53MBになります。ステレオの場合は2倍。私は時計の記憶限界が何であるか分からないが、あなたがそれらを超えていると思う。

+0

はい、実際には2チャンネルオーディオ、デバッガでは時計が約70-80MBのメモリ使用量に達するとクラッシュします。とにかくApple Watchの負荷を軽減できますか? – devone

+0

あなたは何をしようとしていますか?一度に5分間のオーディオを本当にロードする必要がありますか?それとも解凍しますか? –

+0

バッファから読み込んでいます - readFile.arrayValues = Array(UnsafeBufferPointer(start:buf!.floatChannelData?[0]、count:Int(buf!.frameLength)))そこからオーディオ波形を作成するポイントを処理します。このようにする必要があります。これを行う簡単な方法は、watchOS上で利用可能なフレームワークではないからです。 – devone

関連する問題