gpt4 book ai didi

objective-c - AVAssetReader 到 AudioQueueBuffer

转载 作者:塔克拉玛干 更新时间:2023-11-02 20:21:04 31 4
gpt4 key购买 nike

目前,我正在做一个小测试项目,看看我是否可以从 AVAssetReader 获取样本,以便在 iOS 上使用 AudioQueue 进行播放。

我读过这个:( Play raw uncompressed sound with AudioQueue, no sound )还有这个:(How to correctly read decoded PCM samples on iOS using AVAssetReader -- currently incorrect decoding),

这两者实际上都有帮助。在阅读之前,我根本听不到任何声音。现在,我能听到声音了,但音频播放速度超快。这是我第一次涉足音频编程,非常感谢任何帮助。

我这样初始化读取器:

NSDictionary * outputSettings = [NSDictionary dictionaryWithObjectsAndKeys:
[NSNumber numberWithInt:kAudioFormatLinearPCM], AVFormatIDKey,
[NSNumber numberWithFloat:44100.0], AVSampleRateKey,
[NSNumber numberWithInt:2], AVNumberOfChannelsKey,
[NSNumber numberWithInt:16], AVLinearPCMBitDepthKey,
[NSNumber numberWithBool:NO], AVLinearPCMIsNonInterleaved,
[NSNumber numberWithBool:NO], AVLinearPCMIsFloatKey,
[NSNumber numberWithBool:NO], AVLinearPCMIsBigEndianKey,

nil];

output = [[AVAssetReaderAudioMixOutput alloc] initWithAudioTracks:uasset.tracks audioSettings:outputSettings];
[reader addOutput:output];
...

然后我这样抓取数据:

CMSampleBufferRef ref= [output copyNextSampleBuffer];
// NSLog(@"%@",ref);
if(ref==NULL)
return;
//copy data to file
//read next one
AudioBufferList audioBufferList;
NSMutableData *data = [NSMutableData data];
CMBlockBufferRef blockBuffer;
CMSampleBufferGetAudioBufferListWithRetainedBlockBuffer(ref, NULL, &audioBufferList, sizeof(audioBufferList), NULL, NULL, 0, &blockBuffer);
// NSLog(@"%@",blockBuffer);

if(blockBuffer==NULL)
{
[data release];
return;
}
if(&audioBufferList==NULL)
{
[data release];
return;
}

//stash data in same object
for( int y=0; y<audioBufferList.mNumberBuffers; y++ )
{
// NSData* throwData;
AudioBuffer audioBuffer = audioBufferList.mBuffers[y];
[self.delegate streamer:self didGetAudioBuffer:audioBuffer];
/*
Float32 *frame = (Float32*)audioBuffer.mData;
throwData = [NSData dataWithBytes:audioBuffer.mData length:audioBuffer.mDataByteSize];
[self.delegate streamer:self didGetAudioBuffer:throwData];
[data appendBytes:audioBuffer.mData length:audioBuffer.mDataByteSize];
*/
}

最终将我们带到音频队列,以这种方式设置:

//Apple's own code for canonical PCM
audioDesc.mSampleRate = 44100.0;
audioDesc.mFormatID = kAudioFormatLinearPCM;
audioDesc.mFormatFlags = kAudioFormatFlagsAudioUnitCanonical;
audioDesc.mBytesPerPacket = 2 * sizeof (AudioUnitSampleType); // 8
audioDesc.mFramesPerPacket = 1;
audioDesc.mBytesPerFrame = 1 * sizeof (AudioUnitSampleType); // 8
audioDesc.mChannelsPerFrame = 2;
audioDesc.mBitsPerChannel = 8 * sizeof (AudioUnitSampleType); // 32


err = AudioQueueNewOutput(&audioDesc, handler_OSStreamingAudio_queueOutput, self, NULL, NULL, 0, &audioQueue);
if(err){
#pragma warning handle error
//never errs, am using breakpoint to check
return;
}

然后我们就这样排队

while (inNumberBytes)
{
size_t bufSpaceRemaining = kAQDefaultBufSize - bytesFilled;
if (bufSpaceRemaining < inNumberBytes)
{
AudioQueueBufferRef fillBuf = audioQueueBuffer[fillBufferIndex];
fillBuf->mAudioDataByteSize = bytesFilled;
err = AudioQueueEnqueueBuffer(audioQueue, fillBuf, 0, NULL);
}


bufSpaceRemaining = kAQDefaultBufSize - bytesFilled;
size_t copySize;
if (bufSpaceRemaining < inNumberBytes)
{
copySize = bufSpaceRemaining;
}
else
{
copySize = inNumberBytes;
}

if (bytesFilled > packetBufferSize)
{
return;
}

AudioQueueBufferRef fillBuf = audioQueueBuffer[fillBufferIndex];
memcpy((char*)fillBuf->mAudioData + bytesFilled, (const char*)(inInputData + offset), copySize);


bytesFilled += copySize;
packetsFilled = 0;
inNumberBytes -= copySize;
offset += copySize;
}
}

我试图尽可能地包含代码,以便每个人都能轻松指出我在哪里是个白痴。话虽如此,我感觉我的问题要么出现在轨道阅读器的输出设置声明中,要么出现在 AudioQueue 的实际声明中(我向队列描述了我将要发送的音频类型)。事实上,我真的不知道如何在数学上实际生成这些数字(每个数据包的字节数、每个数据包的帧数,你有什么)。对此的解释将不胜感激,并感谢您提前提供帮助。

最佳答案

不确定这是多少答案,但评论的文本和链接太多,希望它能有所帮助(也许会引导您找到答案)。

首先,我知道在我当前的项目中,调整采样率会影响声音的速度,因此您可以尝试使用这些设置。但 44k 是我在大多数默认实现中看到的,包括苹果示例 SpeakHere .但是,我会花一些时间将您的代码与该示例进行比较,因为它们之间存在很多差异。比如入队前检查。

首先查看此贴 https://stackoverflow.com/a/4299665/530933它讨论了您需要如何了解音频格式,特别是一帧中有多少字节,以及如何进行适当的转换

祝你好运。我在这里、苹果论坛和 ios 论坛(不是官方论坛)上发布了很多问题。几乎没有回应/帮助。为了达到今天的状态(ulaw 中的音频录制和流式传输),我最终不得不打开 Apple Dev Support Ticket。在处理音频之前我从来不知道存在(开发支持)。一件好事是,如果您有一个有效的开发帐户,您可以免费获得 2 个事件! CoreAudio 并不好玩。文档很少,而且除了 SpeakHere 之外,示例也不多。我确实发现的一件事是框架 header 确实有一些很好的信息和 this book .不幸的是,我才刚刚开始阅读这本书,否则我可能会进一步帮助你。

您也可以查看我自己的一些帖子,我已尽力回答这些帖子。 This is my main audio question which I have spent alot of time on to compile all pertinent links and code.

using AQRecorder (audioqueue recorder example) in an objective c class

trying to use AVAssetWriter for ulaw audio ( 2 )

关于objective-c - AVAssetReader 到 AudioQueueBuffer,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/11398997/

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