- 浏览: 1318056 次
- 性别:
- 来自: 成都
文章分类
- 全部博客 (471)
- 原创文章 (4)
- Database (84)
- J2SE (63)
- Web (26)
- Javascript (30)
- Lucene (11)
- os (13)
- 算法 (8)
- Webservice (1)
- Open projects (18)
- Hibernate (18)
- Spring (15)
- Css (2)
- J2ee (2)
- 综合技术 (18)
- 安全管理 (13)
- PatternsInJava (27)
- NIO (5)
- Ibatis (2)
- 书籍收藏 (1)
- quartz (7)
- 并发编程 (15)
- oracle问题 (2)
- ios (60)
- coco2d-iphone (3)
- C++ (6)
- Zookeeper (2)
- golang (4)
- animation (2)
- android (1)
最新评论
-
dandingge123:
【引用】限制UITextField输入长度的方法 -
qja:
...
对List顺序,逆序,随机排列实例代码 -
安静听歌:
现在在搞这个,,,,,哎~头都大了,,,又freemarker ...
通用大型网站页面静态化解决方案(一) -
springdata-jpa:
java quartz定时任务demo教程源代码下载,地址:h ...
Quartz 配置参考 -
马清天:
[b][/b][list][*]引用[u][/u][/list ...
通用大型网站页面静态化解决方案(一)
(转)http://blog.chinaunix.net/uid-25788167-id-366155.html
AudioQueue是Mac OS X与iPhone中提供录音、播放功能的高级框架,比AudioUnit等框架更方便,而且不要求掌握更多专门的知识。
从AudioQueue的名称就可以看出,AudioQueue框架以队列的形式处理音频数据。因此使用时需要给队列分配缓存空间,由回调(Callback)函数完成向队列缓存读写音频数据的功能。另外,AudioQueue是AudioToolbox框架的一部分,使用前需要将AudioToolbox框架导入进来。
使用AudioQueue来实现音频播放功能时最主要的步骤,可以更简练的归纳如下。
1. 打开播放音频文件
2. 取得播放音频文件的数据格式
3. 准备播放用的队列
4. 将缓冲中的数据移动到队列中
5. 开始播放
6. 在回调函数中进行队列处理
以下是贯彻上述六个主要步骤的代码实例,只需要向[play:]中传入音频文件的路径就可以开始音频播放。稍加修改可以直接应用到自己的程序中。
Source Audioplay.h
#import <Foundation/Foundation.h>
#import <AudioToolbox/AudioToolbox.h>
#import <AudioToolbox/AudioFile.h>
#define NUM_BUFFERS 3
@interface AudioPlayer : NSObject {
//播放音频文件ID
AudioFileID audioFile;
//音频流描述对象
AudioStreamBasicDescription dataFormat;
//音频队列
AudioQueueRef queue;
SInt64 packetIndex;
UInt32 numPacketsToRead;
UInt32 bufferByteSize;
AudioStreamPacketDescription *packetDescs;
AudioQueueBufferRef buffers[NUM_BUFFERS];
}
//定义队列为实例属性
@property AudioQueueRef queue;
//播放方法定义
- (void) play:(CFURLRef) path;
//定义缓存数据读取方法
- (void) audioQueueOutputWithQueue:(AudioQueueRef)audioQueue
queueBuffer:(AudioQueueBufferRef)audioQueueBuffer;
//定义回调(Callback)函数
static void BufferCallback(void *inUserData, AudioQueueRef inAQ,
AudioQueueBufferRef buffer);
//定义包数据的读取方法
- (UInt32)readPacketsIntoBuffer:(AudioQueueBufferRef)buffer;
@end
Source Audioplay.m
static UInt32 gBufferSizeBytes = 0x10000;
@implementation AudioPlayer
@synthesize queue;
// 回调(Callback)函数的实现
static void BufferCallback(void *inUserData, AudioQueueRef inAQ,
AudioQueueBufferRef buffer) {
AudioPlayer* player = (AudioPlayer*)inUserData;
[player audioQueueOutputWithQueue:inAQ queueBuffer:buffer];
}
//初始化方法(为NSObject中定义的初始化方法)
- (id) init {
for(int i=0; i<NUM_BUFFERS; i++) {
AudioQueueEnqueueBuffer(queue,buffers[i],0,nil);
}
return self;
}
//缓存数据读取方法的实现
- (void) audioQueueOutputWithQueue:(AudioQueueRef)audioQueue
queueBuffer:(AudioQueueBufferRef)audioQueueBuffer {
OSStatus status;
// 读取包数据
UInt32 numBytes;
UInt32 numPackets = numPacketsToRead;
status = AudioFileReadPackets(
audioFile, NO, &numBytes, packetDescs,
packetIndex, &numPackets, audioQueueBuffer->mAudioData);
// 成功读取时
if (numPackets > 0) {
//将缓冲的容量设置为与读取的音频数据一样大小(确保内存空间)
audioQueueBuffer->mAudioDataByteSize = numBytes;
// 完成给队列配置缓存的处理
status = AudioQueueEnqueueBuffer(
audioQueue, audioQueueBuffer, numPackets, packetDescs);
// 移动包的位置
packetIndex += numPackets;
}
}
//音频播放方法的实现
-(void) play:(CFURLRef) path {
UInt32 size, maxPacketSize;
char *cookie;
int i;
OSStatus status;
// 打开音频文件
status = AudioFileOpenURL(path, kAudioFileReadPermission, 0, &audioFile);
if (status != noErr) {
// 错误处理
return;
}
// 取得音频数据格式
size = sizeof(dataFormat);
AudioFileGetProperty(audioFile, kAudioFilePropertyDataFormat,
&size, &dataFormat);
// 创建播放用的音频队列
AudioQueueNewOutput(&dataFormat, BufferCallback,
self, nil, nil, 0, &queue);
//计算单位时间包含的包数
if (dataFormat.mBytesPerPacket==0 || dataFormat.mFramesPerPacket==0) {
size = sizeof(maxPacketSize);
AudioFileGetProperty(audioFile,
kAudioFilePropertyPacketSizeUpperBound, &size, &maxPacketSize);
if (maxPacketSize > gBufferSizeBytes) {
maxPacketSize = gBufferSizeBytes;
}
// 算出单位时间内含有的包数
numPacketsToRead = gBufferSizeBytes / maxPacketSize;
packetDescs = malloc(
sizeof(AudioStreamPacketDescription) * numPacketsToRead);
} else {
numPacketsToRead = gBufferSizeBytes / dataFormat.mBytesPerPacket;
packetDescs = nil;
}
//设置Magic Cookie,参见第二十七章的相关介绍
AudioFileGetPropertyInfo(audioFile,
kAudioFilePropertyMagicCookieData, &size, nil);
if (size > 0) {
cookie = malloc(sizeof(char) * size);
AudioFileGetProperty(audioFile,
kAudioFilePropertyMagicCookieData, &size, cookie);
AudioQueueSetProperty(queue,
kAudioQueueProperty_MagicCookie, cookie, size);
free(cookie);
}
// 创建并分配缓存空间
packetIndex = 0;
for (i = 0; i < NUM_BUFFERS; i++) {
AudioQueueAllocateBuffer(queue, gBufferSizeBytes, &buffers[i]);
//读取包数据
if ([self readPacketsIntoBuffer:buffers[i]] == 0) {
break;
}
}
Float32 gain = 1.0;
//设置音量
AudioQueueSetParameter (
queue,
kAudioQueueParam_Volume,
gain
);
//队列处理开始,此后系统会自动调用回调(Callback)函数
AudioQueueStart(queue, nil);
}
- (UInt32)readPacketsIntoBuffer:(AudioQueueBufferRef)buffer {
UInt32 numBytes, numPackets;
// 从文件中接受包数据并保存到缓存(buffer)中
numPackets = numPacketsToRead;
AudioFileReadPackets(audioFile, NO, &numBytes, packetDescs,
packetIndex, &numPackets, buffer->mAudioData);
if (numPackets > 0) {
buffer->mAudioDataByteSize = numBytes;
AudioQueueEnqueueBuffer(queue, buffer,
(packetDescs ? numPackets : 0), packetDescs);
packetIndex += numPackets;
}
return numPackets;
}
@end
发表评论
-
ios 声音合成
2013-08-18 13:20 1246http://stackoverflow.com/ques ... -
__bridge,__bridge_retained和__bridge_transfer的意思,区别与使用 20 三
2012-12-24 01:41 1654使用ARC能帮我们减轻不少内存管理方面的负担,尤其是对用 ... -
CAAnimation
2012-12-23 01:09 2310CAAnimation采用了CAMediaTi ... -
UIViewAnimation动画与Core Animation的CATransition类动画
2012-12-23 01:06 2708使用UIView类函数实现://U ... -
GCD实战2:资源竞争
2012-12-23 01:04 1563转自http://www.dreamingwish.co ... -
GCD实战一:使用串行队列实现简单的预加载
2012-12-22 17:10 2834转自 http://www.dreamingwish.c ... -
GCD介绍(四): 完结
2012-12-22 17:08 1343转自 http://www.dreamingwish.c ... -
GCD介绍(三): Dispatch Sources
2012-12-22 17:07 1611转自 http://www.dreamingwish.com/ ... -
GCD介绍(二): 多核心的性能
2012-12-22 17:05 1161转自http://www.dreamingwish.co ... -
基本概念和Dispatch Queue
2012-12-22 17:03 1328转自 http://www.dreamingwish.c ... -
Best Audio Format for iPhone Audio Programming
2012-12-19 16:26 2517I had never done audio p ... -
LAME 是一个开源的MP3解码编码工具
2012-12-19 13:09 8515MP3 Encoding * 编码MP3文件必须按如下 ... -
sqlite3中的数据类型
2012-12-10 21:37 1277(转)http://www.cnblogs.com/kfqco ... -
ios随机数,and()、random()、arc4random()
2012-11-15 11:06 4699原文:http://bj007.blog.51cto.c ... -
IPHONE GIF 播放的方式
2012-10-11 18:30 1425转 http://blog.csdn.net/zltia ... -
在新线程中使用NSTimer
2012-10-11 18:21 1560转自 http://blog.csdn.net/sjzs ... -
Creating an iPhone Daemon – Part 5
2012-09-02 15:29 1512Creating an iPhone Daemon – ... -
Creating an iPhone Daemon – Part 4
2012-09-02 15:28 1388Creating an iPhone Daemon – ... -
Creating an iPhone Daemon – Part 3
2012-09-02 15:25 1482This is part three of the bl ... -
Creating an iPhone Daemon – Part 2
2012-09-02 15:24 1228Here is part two of the blog ...
相关推荐
这是iPhone简易音频播放程序,具体参考: http://blog.csdn.net/htttw/article/details/7842295
AVAudioPlayer类轻松实现音频播放,资源内已经对系统AVAudioPlayer做了C++类的封装,使用的时候直接调用接口即可
SoundManager, 在Mac和iPhone上,播放音频的简单声音和音乐播放器类 命令行目SoundManager是在iOS或者Mac应用程序中播放声音和音乐的简单类。支持的操作系统&版本支持 build/Mac 8.0操作系统 10.8 ( Xcode 6.0,苹果...
iphone上面实现播放视频文件,可以播放多种视频格式,音频格式
phonegap在iphone手机上pushnotification实现 代码自己已经在真机测试实现 比较不错 顶.
iphone4中文使用手册
Iphone睡眠软件音频:熟睡!是由专注在脑波研究与开发领域的LaluzAPP公司推出的重点脑波应用。只需睡前聆听“熟睡!”15分钟(软件默认播放时间),就能轻易获得5倍于平时的深度睡眠效果,安全有效。“熟睡!”经...
主要介绍了iphone的safari浏览器中实现全屏浏览的方法,同时介绍了Add to Home Screen功能的实现方法,需要的朋友可以参考下
iphone 在线视频、音频播放 项目完整源码 适合学习,
Android中实现Iphone样式的AlertDialog.rar
Iphone开发系列源码——星级评价实现代码Iphone开发系列源码——星级评价实现代码Iphone开发系列源码——星级评价实现代码Iphone开发系列源码——星级评价实现代码Iphone开发系列源码——星级评价实现代码Iphone开发...
一、获取系统所支持的国际化信息 二、在Xcode中建立多语言文档 三、在源代码中使用NSLocalizedString来引用国际化文件 四、使用Terminal
关于iphone中push notification得实现参考文档
在iPhone中简单应用Sqlite3.0数据库,实现创建表,初始化数据,带参查询,简单查询,以及插入数据信息。
在Android中实现Iphone样式的AlertDialog; 使用Dialog实现。
cocoa iPhone 音频流媒体 demo cocoa iPhone 音频流媒体 demo
Iphone开发系列源码——长按实现图标抖动和删除的代码Iphone开发系列源码——长按实现图标抖动和删除的代码Iphone开发系列源码——长按实现图标抖动和删除的代码Iphone开发系列源码——长按实现图标抖动和删除的代码...
Iphone中文使用手册,新手专用。老手参考,高手请直接无视。
iphone开发 服务器、android、iphone音频文件播放和传输 amr和wav的转换
第ⅱ部分包括第5-15章,这一部分的内容相对独立,可以根据需要选择性地阅读:第5章介绍在iphone中检索和存储数据,包括本地数据和远程数据;第6章介绍表的使用,包括表内容显示、表导航和表编辑等;第7章介绍基于...