2010-11-28 12 views
7

iPhone/iPadでオーディオファイルの生データにアクセスしようとしています。私は必要なパスを基本的に開始する次のコードを持っています。しかし、AudioBufferがあれば、私は何をすべきか分かりません。Core Audio AudioBufferのフレーム数を確認してください

AVAssetReader *assetReader = [AVAssetReader assetReaderWithAsset:urlAsset error:nil]; 
AVAssetReaderTrackOutput *assetReaderOutput = [AVAssetReaderTrackOutput assetReaderTrackOutputWithTrack:[[urlAsset tracks] objectAtIndex:0] outputSettings:nil]; 
[assetReader addOutput:assetReaderOutput]; 
[assetReader startReading]; 

CMSampleBufferRef ref; 
NSArray *outputs = assetReader.outputs; 
AVAssetReaderOutput *output = [outputs objectAtIndex:0]; 
int y = 0; 
while (ref = [output copyNextSampleBuffer]) { 
    AudioBufferList audioBufferList; 
    CMBlockBufferRef blockBuffer; 
    CMSampleBufferGetAudioBufferListWithRetainedBlockBuffer(ref, NULL, &audioBufferList, sizeof(audioBufferList), NULL, NULL, 0, &blockBuffer); 
    for (y=0; y<audioBufferList.mNumberBuffers; y++) { 
     AudioBuffer audioBuffer = audioBufferList.mBuffers[y]; 
     SInt16 *frames = audioBuffer.mData; 
     for(int i = 0; i < 24000; i++) { // This sometimes crashes 
      Float32 currentFrame = frames[i]/32768.0f; 
     } 
    } 
} 

基本的に、各バッファに含まれるフレームの数を確認する方法がわからないため、データを確実に抽出できません。私は生のオーディオデータを扱うのが初めてであるので、AudioBufferの構造体のmDataプロパティを最もよく読み取る方法についての提案はすべて公開されています。私も過去には無効なポインタをあまり使っていないので、この文脈での助けも素晴らしいでしょう!

+0

優れた質問!あなたの質問は、私の同様の問題を解決するのに役立ちました。 – user523234

+0

blockBufferが漏れています –

答えて

13

audioBuffer.mDataByteSizeは、バッファのサイズを示します。あなたはこれを知っていましたか?あなたは、あなたがstruct AudioBufferの宣言を見ることができなかったのではないかと思います。あなたは常にヘッダーファイルとドキュメントを見てください。

mDataByteSizeを理解するには、データの形式を知っている必要があります。出力値の数はmDataByteSize/sizeof(outputType)です。しかし、あなたはフォーマットについて混乱しているように思えます - あなたはどこかでそれを指定したに違いありません。 16ビットがint

SInt16 *frames = audioBuffer.mData

に署名したとしてまず第一に、あなたがそれを扱うあなたは24000個の値は、もちろんこの意志があることを前提としていわたってるしき、あなたは、32ビット浮動小数点

Float32 currentFrame = frames[i]/32768.0f

として扱います厳密に24000の16ビット値がないとクラッシュします。また、データを「フレーム」と呼んでいますが、実際にはサンプルです。 「currentFrame」と呼ばれる各値は、オーディオの1つのサンプルです。 'Frame'は、通常.mDataのようなサンプルブロックを指します。

データフォーマットが32bit Floatであると仮定すると、それは8ビット整数か32bit固定であるかどうかはわかりません私が知っているすべて)

for(int y=0; y<audioBufferList.mNumberBuffers; y++) 
{ 
    AudioBuffer audioBuffer = audioBufferList.mBuffers[y]; 
    int bufferSize = audioBuffer.mDataByteSize/sizeof(Float32); 
    Float32 *frame = audioBuffer.mData; 
    for(int i=0; i<bufferSize; i++) { 
    Float32 currentSample = frame[i]; 
    } 
} 

注意のために、はsizeof(FLOAT32)は常に4ですが、私は明確にすることで、それを残しました。

+0

audioBuffer.mDataByteSize/sizeof(Float32)は私が感謝の必要な部分でした! – macinjosh

+0

AudioBufferをcmd-clickすると、xcodeはヘッダファイルの厳密な宣言にジャンプします。あなたが扱っているものをチェックするのに便利です。 – hooleyhoop

+4

抜粋ですが、フレームのCore Audioの定義は全チャンネルで1サンプルです。 – sbooth

関連する問題