3

サンプルをファイルに保存するために、AudioToolBox フレームワークの ExtAudioFileCreateWithURL と ExtAudioFileWrite を使用しました。しかし、NSDocument を使用しているため、NSFileWrapper に保存する必要があります。

- (NSFileWrapper *)fileWrapperOfType:(NSString *)typeName error:(NSError **)outError 

NSFileWrapperinitRegularFileWithContents:(NSData*)contentsメソッドを使用できるように、NSMutableData オブジェクトで ExtAudioFileXXX 関数を使用する方法はありますか?

ファイルに保存するためのコードを削除しました (動作します):

AudioStreamBasicDescription file_desc;
FillOutASBDForLPCM(file_desc, _sample_rate, _channel_count, 32, 32, true, false);
OSStatus rv = ExtAudioFileCreateWithURL(url, kAudioFileWAVEType, &file_desc, NULL, kAudioFileFlags_EraseFile, &fout);
if (rv == noErr){
    int buff_size = sizeof(AudioBufferList) + sizeof(AudioBuffer);
    AudioBufferList* bufferList = (AudioBufferList*)malloc(buff_size);
    bufferList->mNumberBuffers = 1;
    bufferList->mBuffers[0].mData = _samples;
    bufferList->mBuffers[0].mNumberChannels = _channel_count;
    bufferList->mBuffers[0].mDataByteSize = _channel_count * _frame_count * sizeof(float);
    ExtAudioFileWrite(fout, _frame_count, bufferList);
    free(bufferList);
    ExtAudioFileDispose(fout);
}
4

1 に答える 1

0

外部ファイルを使用することは、ほとんどのシナリオで最適なソリューションです。NSDataキャッシュされていないファイルとマップされたファイルの初期化子があることに注意してください。多くの場合、大量のメモリを消費せずに I/O を最小限に抑える必要があることは明らかです (また、キャッシュ メモリの増加に注意する必要があります)。さらに一歩進んで、これらの重みのあるアセット (サブ NSFileWrappers、リンク) に対してファイル ラッパー オブジェクトを別の方法で表現する方法を検討してください。

メモリが問題にならない場合 (例: 小さなサンプルと限られたファイルとドキュメントしか扱っていない場合)、Wave で動作する を使用できます (ただし、すべての形式ではありません)。AudioFileInitializeWithCallbacksこれにより、メモリ内のファイル全体を表す連続した割り当てのために、メモリ内の独自のバッファを処理できます。次に、NSData表現の作成は簡単です。メモリ使用量を監視し、排他的な読み取り/書き込みアクセスを確認するだけです。NSDataディープ コピーを作成する必要がないことに注意してください。それを設計に反映させてください。OS X でこのオプションを使用すると、明らかにより多くの柔軟性が得られます。この場合、実際にどれだけ書き込むかを確認してください。おそらく、優れたディスク ベースのソリューション (上記) を使用すると、ディスクへの書き込みを大幅に削減できます。

NSFileWrapperいずれにせよ、ドキュメントあたりのオーディオ ファイル アセットがすぐに 100 MB を超える可能性があるため、これにはほとんどのベース実装よりも多くの考慮が必要です。

于 2012-10-31T17:15:43.760 に答える