下面是我的一些总结:(这里只有播放音乐的部分)
首先.h文件中
#import <Foundation/Foundation.h>
#import <AudioToolbox/AudioToolbox.h>
static const int kNumberBuffers = 3; // 1
typedef struct AQPlayerState {
AudioStreamBasicDescription mDataFormat; // 2
AudioQueueRef mQueue; // 3
AudioQueueBufferRef mBuffers[kNumberBuffers]; // 4
AudioFileID mAudioFile; // 5
UInt32 bufferByteSize; // 6
SInt64 mCurrentPacket; // 7
UInt32 mNumPacketsToRead; // 8
AudioStreamPacketDescription *mPacketDescs; // 9
bool mIsRunning; // 10
}AQPlayerState;
这个是一个自定义的一个包含音频队列对象的结构体,里面的字段,表示的是音频队列的各个信息.
1.音频队列的缓冲区的个数
2.也是一个结构体,描述的是音频流的基本信息.
3.创建的音频队列对象
4.音频队列中得缓存区变量
5.要播放的音频文件
6.音频队列中每个缓冲区文件大小
7.从音频文件中读取的下一个包得索引
8.每次引用CallBack,读取的包得个数
9.要播放的音频流的描述也是一个结构体
10.表示音频的是否正在播放.
还要定义一个属性
{
AQPlayerState aqData;
}
#pragma mark Audio Queue 回调方法
static void HandleOutputBuffer (
AQPlayerState *aqData, // 1
AudioQueueRef inAQ, // 2
AudioQueueBufferRef inBuffer // 3
);
1.我们上面定义的包含音频队列信息类型,在这里创建一个指针,指向这个结构体.
2.调用这个方法的音频队列变量
3.从音频文件中读取到音频队列中的缓冲区,要填充到队列缓冲区.就是上面那个图的这个东西.
第三步 定义一个计算音频队列流中数据大小的方法
//计算音频队列流的大小
void DeriveBufferSize (
AudioStreamBasicDescription ASBDesc, // 1
UInt32 maxPacketSize, // 2
Float64 seconds, // 3
UInt32 *outBufferSize, // 4
UInt32 *outNumPacketsToRead // 5
);
1.音频流数据的基本格式 ,这个在我们自定义的音频队列中得字段一样
2.要播放的时,设置读取的最大包的数据大小,可以通过AudioFileGetProperty这个方法进行设置.
3.一个音频流持有的时间
4.这个音频队列缓冲区的大小
5.每次引用CallBack方法时读取音频数据包得个数.
第四步:定义一个初始化的方法和播放的方法
//播放方法定义
-(id)initWithAudio:(NSString *)path;
<pre name="code" class="objc">-(void)play;