1

オーディオ ファイルに書き込みたい _recordingSamples という Float32 値の配列があります。_recordingLength の値は約 390000 です。次のコードを使用しています。

NSString *outputPath = @"/Users/evanjackson/output.caf";
NSFileManager *fileManager = [NSFileManager defaultManager];
[fileManager createFileAtPath:outputPath contents:nil attributes:nil];

AudioStreamBasicDescription _audioFormat;
_audioFormat.mSampleRate = 44100.0;
_audioFormat.mFormatID = kAudioFormatLinearPCM;
_audioFormat.mFormatFlags = kAudioFormatFlagsNativeFloatPacked;
_audioFormat.mChannelsPerFrame = 1;
_audioFormat.mBitsPerChannel = 32;
_audioFormat.mBytesPerFrame = 4;
_audioFormat.mFramesPerPacket = 1;
_audioFormat.mBytesPerPacket = _audioFormat.mFramesPerPacket * _audioFormat.mBytesPerFrame;

UInt32 lengthPropertySize = sizeof(SInt64);
ExtAudioFileRef filteredAudio;
NSURL *destinationURL = [NSURL URLWithString:outputPath];
OSStatus status = ExtAudioFileCreateWithURL((__bridge CFURLRef)destinationURL, kAudioFileCAFType, &_audioFormat, NULL, kAudioFileFlags_EraseFile, &filteredAudio);
printf("Status: %d\n", status);
//ExtAudioFileOpenURL((__bridge CFURLRef)[NSURL fileURLWithPath:outputPath], &filteredAudio);
const AudioStreamBasicDescription audioFormat = [del audioFormat];
status = ExtAudioFileSetProperty(filteredAudio, kExtAudioFileProperty_ClientDataFormat, sizeof(audioFormat), &audioFormat);
printf("Status: %d\n", status);
status = ExtAudioFileGetProperty(filteredAudio, kExtAudioFileProperty_FileLengthFrames, &lengthPropertySize, &_recordingLength);
printf("Status: %d\n", status);
AudioBufferList *buffers = (AudioBufferList *)malloc(sizeof(AudioBufferList) + sizeof(AudioBuffer));
buffers->mNumberBuffers = 1;
for (int i = 0; i < buffers->mNumberBuffers; i++) {
    buffers->mBuffers[0].mData = _recordingSamples;
    buffers->mBuffers[0].mNumberChannels = 1;
    buffers->mBuffers[0].mDataByteSize = _recordingLength * sizeof(Float32);
}

status = ExtAudioFileWrite(filteredAudio, _recordingLength, buffers);
printf("Status: %d\n", status);

すべてのステータスが 0 として返され、ファイルが作成されます (4 バイト) が、Quicktime はファイルを開かず、エラー -12842 を返し、コンパイラは次のメッセージを配信します。

libc++abi.dylib: terminating with uncaught exception of type std::bad_alloc: std::bad_alloc
(lldb) 

何が問題なのか知っている人はいますか?前もって感謝します。

4

2 に答える 2

0

これはかなり毛むくじゃらのコードの集まりです。

この行:

AudioBufferList *buffers = 
  (AudioBufferList *)malloc(sizeof(AudioBufferList) + sizeof(AudioBuffer));

私には不審に見えます。sizeof(AudioBufferList) と sizeof(AudioBuffer) の合計である固定サイズのバッファを割り当てています。

これらの 2 つの変数の型は何ですか?

Sizeof は、構造体が指すコンテンツのサイズではなく、構造体のサイズを返します。単一の float のサイズに、配列内の float の総数を保持する値を掛けた値に割り当てられるバッファーが必要であると推測しています。(それは _recordingLength ですか?)

このコードはどこから来たのですか? それが何をしているのか、詳細に説明できますか?フロートの配列はどこから来たのですか? コードに何バイトあるかを示すものは何ですか? データはメモリのどこに保存されますか? その値のバッファをディスクに書き込むのは何ですか?

ファイルが作成され、長さが 4 バイトであるとします。390000 個の float を格納しようとしている場合、これは確かに問題のように思えます。

于 2014-06-12T16:00:48.410 に答える