簡體   English   中英

確定核心音頻AudioBuffer中的幀數

[英]Determine Number of Frames in a Core Audio AudioBuffer

我試圖在iPhone / iPad上訪問音頻文件的原始數據。 我有以下代碼,這是我需要的路徑的基本開始。 但是,一旦我有了一個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屬性的任何建議。 我在過去也沒有做過很多關於void指針的事情,所以在這種情況下對它的幫助也會很棒!

audioBuffer.mDataByteSize告訴您緩沖區的大小。 你知道嗎? 只是因為你沒有,你不能看看struct AudioBuffer的聲明。 您應該始終查看頭文件以及文檔。

要使mDataByteSize有意義,您必須知道數據的格式。 輸出值的計數是mDataByteSize / sizeof(outputType)。 但是,您似乎對格式感到困惑 - 您必須在某處指定它。 首先,您將其視為16位簽名int

SInt16 *frames = audioBuffer.mData

然后你把它當作32位浮點數

Float32 currentFrame = frames[i] / 32768.0f

inbetween你假設有24000個值,當然如果沒有24000個16bit值,這將會崩潰。 此外,您將數據稱為“幀”,但您真正的意思是樣本。 您稱為“currentFrame”的每個值都是音頻的一個示例。 'Frame'通常指的是像.mData這樣的樣本塊

因此,假設數據格式是32位浮點數(請注意,我不知道它是否,它可能是8位int,或32位固定所有我知道)

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,但我把它留下來清楚。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM