gpt4 book ai didi

ios核心音频: how to get samples from AudioBuffer with interleaved audio

转载 作者:塔克拉玛干 更新时间:2023-11-02 10:30:38 35 4
gpt4 key购买 nike

我已使用 ExtAudioFileRead 函数将音频文件读入 AudioBufferList
这是音频的 ASBD:

AudioStreamBasicDescription importFormat;

importFormat.mFormatID = kAudioFormatLinearPCM;
importFormat.mFormatFlags = kAudioFormatFlagIsSignedInteger | kAudioFormatFlagIsPacked;
importFormat.mBytesPerPacket = 4;
importFormat.mFramesPerPacket = 1;
importFormat.mBytesPerFrame = 4;
importFormat.mChannelsPerFrame = 2;
importFormat.mBitsPerChannel = 16;
importFormat.mSampleRate = [[AVAudioSession sharedInstance] sampleRate];

所以我们得到并交错了 2 个 channel 的音频,每个 channel 有 16 位有符号整数
AudioBufferList 初始化:

UInt32 *audioData = (UInt32 *) calloc (totalFramesInFile, sizeof (UInt32));

AudioBufferList *bufferList;
bufferList = (AudioBufferList *) malloc (sizeof (AudioBufferList));

// buffers amount is 1 because audio is interleaved
bufferList->mNumberBuffers = 1;

bufferList->mBuffers[0].mNumberChannels = 2;
bufferList->mBuffers[0].mDataByteSize = totalFramesInFile * sizeof(UInt32);
bufferList->mBuffers[0].mData = audioData;

并读入缓冲区:

CheckError(ExtAudioFileRead (
audioFileObject,
&numberOfPacketsToRead,
bufferList), "error ExtAudioFileRead");

audioFileObjectExtAudioFileRef 的实例,它在较早的代码中启动,我没有在此处粘贴以节省空间。
我想要完成的是在渲染回调中修改音频样本。

OSStatus MyCallback (void *inRefCon,
AudioUnitRenderActionFlags *ioActionFlags,
const AudioTimeStamp *inTimeStamp,
UInt32 inBusNumber,
UInt32 inNumberFrames,
AudioBufferList *ioData){


ViewController *view = (__bridge ViewController *) inRefCon;

soundStruct *soundStruct = (soundStruct *) &view->mys;

SInt64 frameTotalForSound = soundStruct->frameCount;

soundStruct->isPlaying = true;

UInt32 *audioData = soundStruct->audioData;

UInt32 sampleNumber = soundStruct->sampleNumber;

for( int i = 0; i < ioData->mNumberBuffers; i++){

AudioBuffer buffer = ioData->mBuffers[i];
UInt32 *frameBuffer = buffer.mData;

for(UInt32 frame = 0; frame < inNumberFrames; frame++) {

// here I fill the buffer with my audio data.
// i need to get left and right channel samples
// from audioData[sampleNumber], modify them
// and write into frameBuffer

frameBuffer[frame] = audioData[sampleNumber];

sampleNumber++;

if(sampleNumber > frameTotalForSound) {
soundStruct->isPlaying = false;
AudioOutputUnitStop(soundStruct->outputUnit);
}
}
}

soundStruct->sampleNumber = sampleNumber;

return noErr;

}

是否可以从音频数据的 UInt32 数组中获取 Sint16 左右声道样本?

最佳答案

audioDataframeBuffer都是SInt16:

SInt16 *audioData;
// ...
SInt16 *frameBuffer;

您的缓冲区大小计算应为 n * 2 * sizeof(SInt16) 并且您需要更改soundStruct` 或添加类型转换。

然后您可以像这样访问交错样本:

frameBuffer[0] = modify(audioData[0]);    // left sample 1
frameBuffer[1] = modify(audioData[1]); // right sample 1
frameBuffer[2] = modify(audioData[2]); // left sample 2
frameBuffer[3] = modify(audioData[3]); // right sample 2
// ...
frameBuffer[2*(n-1)] = modify(audioData[2*(n-1)]); // left sample n
frameBuffer[2*(n-1)+1] = modify(audioData[2*(n-1)+1]); // right sample n

关于ios核心音频: how to get samples from AudioBuffer with interleaved audio,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/38038822/

35 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com