gpt4 book ai didi

iphone - 在iPhone上播放第三方库解码的音频

转载 作者:行者123 更新时间:2023-12-03 20:37:00 24 4
gpt4 key购买 nike

第三方库生成任意所需大小的 16 位带符号立体声样本的顺序缓冲区。我无法弄清楚使用哪些框架/函数来从这些缓冲区中播放。我一直在研究 this answer 中的示例使用 AudioQueue 但它显然在我无法解析的方面不完整(局部变量的使用就好像它们是对象成员、未声明的变量等)。

Apple 的 SpeakHere 示例项目中的代码仅显示如何使用 AudioQueue 播放文件中的音频。有人能指出我正确的方向吗?

最佳答案

想通了。这是一个简单、完整且工作的白噪声生成器,使用从基于Windows的应用程序项目模板创建的AudioQueue。

StaticAppDelegate.h:

//  StaticAppDelegate.h

#import <UIKit/UIKit.h>

// STATIC ADDITIONS
// Add > Existing Frameworks... > AudioToolbox.framework to your Target
#import <AudioToolbox/AudioToolbox.h>
// END STATIC ADDITIONS

@interface StaticAppDelegate : NSObject <UIApplicationDelegate> {
UIWindow *window;
}

@property (nonatomic, retain) IBOutlet UIWindow *window;

// STATIC ADDITIONS
- (void)startStatic;
- (void)handleBufferCompleteForQueue:(AudioQueueRef)inAQ
buffer:(AudioQueueBufferRef)inBuffer;
// END STATIC ADDITIONS

@end

StaticAppDelegate.m:

//  StaticAppDelegate.m

#import "StaticAppDelegate.h"

// STATIC ADDITIONS
#define kNumberBuffers 4
#define kBufferSize 2048

// AudioQueue callback
void AQOutputCallback(
void *inData,
AudioQueueRef inAQ,
AudioQueueBufferRef inBuffer
)
{
StaticAppDelegate *staticApp = (StaticAppDelegate *)inData;
[staticApp handleBufferCompleteForQueue:inAQ buffer:inBuffer];
}
// END STATIC ADDITIONS

@implementation StaticAppDelegate

@synthesize window;


- (void)applicationDidFinishLaunching:(UIApplication *)application {

// Override point for customization after application launch
[window makeKeyAndVisible];

// STATIC ADDITIONS
[self startStatic];
// END STATIC ADDITIONS
}

- (void)dealloc {
[window release];
[super dealloc];
}

// STATIC ADDITIONS
- (void)startStatic
{
srandom(time(NULL));

// initiate audio session
AudioSessionInitialize(NULL, NULL, NULL, NULL);
UInt32 category = kAudioSessionCategory_MediaPlayback; // plays through sleep lock and silent switch
AudioSessionSetProperty(kAudioSessionProperty_AudioCategory, sizeof(category), &category);
AudioSessionSetActive(true);

// following is modified from http://stackoverflow.com/questions/1710133/playing-generated-audio-on-an-iphone

// setup queue
AudioQueueRef audioQueue;
AudioQueueBufferRef buffers[kNumberBuffers];
AudioStreamBasicDescription format;
memset(&format, 0, sizeof(format));
format.mSampleRate = 44100;
format.mFormatID = kAudioFormatLinearPCM;
format.mFormatFlags = kLinearPCMFormatFlagIsSignedInteger | kLinearPCMFormatFlagIsPacked;
format.mChannelsPerFrame = 1;
format.mBitsPerChannel = 16;
format.mBytesPerFrame = (format.mBitsPerChannel / 8) * format.mChannelsPerFrame;
format.mFramesPerPacket = 1;
format.mBytesPerPacket = format.mBytesPerFrame * format.mFramesPerPacket;

AudioQueueNewOutput(&format,
AQOutputCallback,
self,
CFRunLoopGetCurrent(),
kCFRunLoopCommonModes,
0,
&audioQueue);

// allocate and fill the buffers
for (int i = 0; i < kNumberBuffers; ++i)
{
AudioQueueAllocateBuffer(audioQueue, kBufferSize, &buffers[i]);
AQOutputCallback(self, audioQueue, buffers[i]);
}

AudioQueueSetParameter(audioQueue, kAudioQueueParam_Volume, 1.0);
AudioQueueStart(audioQueue, NULL);
}

- (void)handleBufferCompleteForQueue:(AudioQueueRef)inAQ
buffer:(AudioQueueBufferRef)inBuffer
{
inBuffer->mAudioDataByteSize = inBuffer->mAudioDataBytesCapacity;

int *buffer = (int *)inBuffer->mAudioData;
for (int i = 0; i < inBuffer->mAudioDataByteSize/sizeof(int); ++i)
{
buffer[i] = (int)rand(); // refill the buffer
}
AudioQueueEnqueueBuffer(inAQ, inBuffer, 0, NULL);
}
// END STATIC ADDITIONS

@end

一旦我弄清楚如何实际重新填充缓冲区(inBuffer->mAudioData 使用某种类型转换),其他一切就都到位了。

关于iphone - 在iPhone上播放第三方库解码的音频,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/2270218/

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