一、音频播放方式
1.System Sound Services
2.AVAudioPlayer
3.Audio Queue Service
4.OpenAL
二、使用
1.System Sound Services的使用
SystemSoundID soundId;
//后面将使用soundId引用音频文件
NSString *soundFile = [[NSBundle mainBundle]pathForResource:@"XXX" ofType:@"wav"];
//通过NSBundle的mainBundle方法返回一个NSBundle对象,该对象对应当 前应用程序可执行二进制文件所属目录。pathForResource方法回去aaa.wav的真实路径
AudioServicesCreateSystemSoundID( (__bridge CFURLRef ) [ NSURL fileURLWithPath:soundFile ] .&soundId ) ;
//创建soundFile的SystemSoundID,
// (__bridge CFURLRef ) 是强制转换成CFURLRef对象,因为此处理讲一个C语言结构转换我一个OC对象,所以必须加上__bridge
AudioServicesPlaySystemSound(soundId);
//播放音频 System Sound Services 不能播放超过30s的声音,并且支持wav
2.AVAudioPlayer的使用
(1)AVAudioPlayer类的一个实例,被称为一个音频播放器,从文件或者内存中提供音频播放数据
(2)Apple 推荐使用这个类来实现音频播放,除非你播放网络音频流或者要求费城地的I/O延迟
(3)AVAudioPlayer 的功能
A.播放任意时间的音频
B.播放声音文件或内存缓存区
C.循环播放
D.播放多个声音,一个播放器一个声音,精确同步
E.控制每一个正在播放声音的playback level,stereo positioning,and playback rate;
F.搜索音频文件的特定性,支持快进快退功能
G.使用播放计量来获取数据
(4)AVAudioPlayer的事件处理
A. Responding to Sound Playback Completion
- audioPlayerDidFinishPlaying:successfully;
B.Responding to an Audio Decoding Error
- audioPlayerDecodeErrorDidOccur:error;
C.Handling Audio Interruptions
- audioPlayerBeginInterruption;
- audioPlayerEndInterruption:withOptions;
- audioPlayerEndInterruption: (Deprecated in iOS 6.0)
- audioPlayerEndInterruption:withFlags:(Deprecated in iOS 6.0)
(5) AVAudioPlayer 的使用
NSError *error;
AVAudioPlayer _backgroundMusicPlayer = [[AVAudioPlayer alloc]initWithContentsOfURL:backgroundMusicURL error:&error];
[_backgroundMusicPlayer prepareToPlay];
[_backgroundMusicPlayer play];
(6)AVAudioPlayer 的属性特征
A. playing: 一个Bool值,表示是否是一个正在播放的播放器
B. volume:音频播放器增益,数值从0.0 ~ 1.0
C. pan: 音频播放器的立体声位置(左右声道),数值-1.0 ~ 1.0
D. rate: 音频播放的播放率,默认数值为1.0
E. enableRate:一个Bool值,制定是否启用音频播放器的播放速度调整
F. numberOfLoops:音频重复播放次数
3.Audio Queue Service的使用
(1)音频队列是一个用于音频录制或者播放的软件对象,一个音频队列做的工作:
A.链接到音频硬件
B.管理内存
C.如需要时使用编解码器来压缩音频格式
D.调停播放或录音
(2)基本工作原理
A. 音频队列的架构
所有音频队列具有相同的结构,由这些部分组成:
a. 一组音频队列缓存区,每一个是这些音频数据的临时存储区
b. 缓存区队列,有序列表的音频队列缓存区
c. 音频队列的回调函数
B.记录进程:
a. 将视频填入第一个缓冲器中
b. 当队列中的第一个缓冲器填满时,会自动填充下一个缓冲器,此时,会触发回调
c. 在回调函数中需要将音频数据流写入磁盘
d. 然后,需要在回调函数中将该缓冲器中重新放入缓冲队列,以便重复使用该缓冲器,重复步骤2
播放进程:
a. 将音频读入到缓存器中,一旦填充满一个缓存器,就会进入缓存队列,此时处于待命状态
b. 应用程序命令发出指令,要求音频队列开始播放
c. 音频蛔虫第一个缓存其中读取数据,并开始播放
d. 一旦播放完成,就会触发回调,并开始播放下一个缓存器中的内容
e. 回调中需要给该缓存器读取后面的音频数据,然后重新放入缓存队列中,重复步骤3
4. OpenAL的使用
(1)OpenAL是一个跨平台(包括iphone OS)的音频API,被推荐用于音频游戏中,并且也非常适合许多其他类型的应用程序
(2)OpenAL主要由3个实体构成:听众Listener ,声援Source,以及缓存Buffer
A. 听众Listener:就是你,Listener的位置是可以移动的。
B. 声援Source:类似一个话筒,他发出声音给听众听,和Listener一样,声源的位置是可以移动的,
C. 缓存Buffer:存着原始声音数据,就是你需要播放的声音。
还有2个重要的对象,设备device 和环境context
A. 设备是播放声音的硬件
B. 环境是声源和听众所在的空间
(3)OpenAL的使用
让OpenAL工作所需的最少步骤是:
A. 得到设备信息
B. 将环境与设备关联
C. 在缓存中加入声音数据
D. 在声源中加入缓存数据
E. 播放声源
三、视频开发
iOS有数种技术可用于播放应用程序包的电影文件以及来自网络的数据流内容,如果瑟呗具有合适的视频硬件,这些技术也可用于捕捉视频,并可将捕获到的视频集成到应用程序
系统也提供多种方法用于播放或者录制视频内容,你可以根据需要选择,选择视频技术的时候,请尽可能选择高级框架,因为高级框架可以简化为提供对某种功能的支持所需的工作,下面列出的框架由高级到低级排列。其中,媒体播放器框架提供最高级的接口
A. UIKit 中的UIImagePickerController类提供了一个口在能支持camera的设备上记录音频的标准接口
B. The Media Player framework 提供了一组易用于使用的借口,用于播放application中全屏或者部分屏幕视频
C. The AV Foundation framework 提供了一组Objective-C接口,可以管理视频的录制与播放
D. Core Media 对较高的框架使用的底层类型进行描述,同时提供对media操纵的底层接口
iOS视频技术支持播放的视频文件应具有。mov,.mp4,.m4v以及.3gp文件扩展名,而且文件应使用下属压缩标准:
H.264视频,多达1.5Mbps,640*480像素,每秒30帧。H.264Baseline Profile 的Low-Complexity版本支持AAC-LC音频(.m4v,.买mp4以及.mov文件格式中高达160Kbps,48KHz的立体音频)
H.264视频,高达68Kbps,320*240像素,每秒30帧,达到Level1.3的BaseLine Profile支持AAC-1_C音频(.m4v、.mp4以及.mov)
MPEG-4视频,高达2.5Mbps,640*480像素,每秒30帧,Simple Profile支持ACC-LC音频(.m4v、.mp4以及.mov文件格式中高达160Kbps,48KHz的立体音频)
各种音频格式,包括“音频技术”列出的清单
1.Media Player framework
Media Player framework提供了用于播放视频、阴影、博客和音频书文件的工具
此框架的MPMoviePlayerController和MPTimedMetadata类让你播放流媒体视频内容和包含在流的响应时间的元数据
(1) MPMoviePlayerController
一个电影播放器(MPMoviePlayerController类型)管理从文件或网络流播放的电影,发生电影播放器和拥有播放器 视图无论是全屏或内联播放。你可以在你的app所拥有的视图层次结构中加入电影播放器,或者使用MPMoviePlayerView Controller对象管理
当加入一个播放器到你的app中时,应该是这样的
MPMoviePlayerController *player = [[MPMoviePlayerController alloc] initWithContentURL:myURL];
[player prepareToPlay];
[player.view setFrame:myView.bounds]; //player's frame must match parent's
[myView addSubview:player.view];
// something to do ...
[player play];
Movie Notifications:
A. MPMovieDurationAvailableNotification: 当电影时间已经确定时post
B. MPMovieMediaTypesAvailableNotification: 当media类型确定时post
C. MPMoviePlayerContentPreloadDidFinishNotification:当movie在内存中准备播放时post
D. MPMoviePlayerWillEnterFullscreenNotification:将进入全屏模式post
E. MPMoviePlayerDidEnterFullscreenNotification:进入全屏模式时post
F. MPMoviePlayerWillExitFullscreenNotification:将退出全屏模式时post
G. MPMoviePlayerDidExitFullscreenNotification:退出全屏模式时post
H. MPMoviePlayerLoadStateDidChangeNotification:当播放器忘了缓存status改变时post
I. MPMoviePlayerNowPlayingMovieDidChangeNotification:切换视频时post
J. MPMoviePlayerPlaybackDidFinishNotification:视频播放完成时post
K. MPMoviePlayerPlaybackStateDidChangeNotification:视频播放状态改变时post
L. MPMoviePlayerReadyForDisplayDidChangeNotification:视频准备播放状态改变post
(2)AV Foundation framework
A. AV Foundation 提供了一个基于时间试听数据水平的Objective-C接口,具有播放、录制、编辑、转换、捕捉等功能
B. AV Foundation 使用AVAsset 代表一个抽象的媒体,包含标题文件大小等,不关联任何格式
a. 对要合成和编辑媒体就会打开多个音频和视频文件,为每个打开的音频和视频取个抽象名叫轨道track
b. 请注意,建立了AVASset不意味着他就可以使用了,他要进行一些计算,会阻塞当前线程,为了避免足协要求童工 多线程调用block来处理
C. AVFoundation 容许你管理多个playback,为了支持这一点,它把一组表述状态从 asset 中分离出来,这样你就可以同 时播放几个内容,为了管理多个播放提供了一个play item 对象,对应轨道提供有player item trak 对象,要播放play item同 player对象
D. player item 用来管理AVAsset的播放,play item track 用来管理track的播放
(3)Core Media
CoreMedia框架提供了一个底层的接口,管理和播放试听媒体在你的application中