【原】iOS学习45之多媒体操作
1. 音频
1> 音频实现简述
iOS 里面共有四种专门实现播放音频的方式:
System Sound Services(系统声音服务)
OpenAL(跨平台的开源的音频处理接口)
Audio Queue Services(播放和录制音频服务)
AVAudioPlayer(高级音频播放器)
2> System Sound Services(系统声音服务)
① System Sound Services 是最底层也是最简单的声音播放服务,通过调用 AudioServicesPlaySystemSound 这个函数就可以播放一些简单的音频文件
② 局限性:
1. 声音长度要小于30秒
2. 格式:IMA4
3. 不能控制播放的进度
4. 调用方法后立即播放声音
5. 没有循环播放和立体声音播放
③ 实例代码
CFBundleRef mainBundle; SystemSoundID soundFileObject; mainBundle = CFBundleGetMainBundle (); CFURLRef soundFileURLRef = CFBundleCopyResourceURL (mainBundle, CFSTR ("蔡琴 - 爱断情伤"), CFSTR ("wav"), NULL); AudioServicesCreateSystemSoundID (soundFileURLRef, &soundFileObject); AudioServicesPlaySystemSound(soundFileObject);
3> OpenAL
① 简介
OpenAL 是一套跨平台的开源的音频处理接口
最适合开发游戏的音频
OpenAL 包含三个 实体:Listener(听者)、Source(音源)、 Buffer(缓存)
Audio Queue Services 主要用来实现录制音频,为了简化音频文件的处理,通常还需要使用到 AudioFileServices
② 开发步骤
1.获取device
2.将context关联到device
3.将数据放入buffer
4.将buffer链接到一个source
5.播放source
OpenAL资料网址: http://www.devdiv.com/thread-19636-1-1.html
http://www.cocoachina.com/bbs/read.php?tid-112679-page-1.html
相对底层的 API参考:http://blog.csdn.net/midfar/article/details/7233454
4> AVAudioPlayer简介
我们可以把 AVAudioPlayer 看作是一个高级的播放器,它支持广泛的音频格式,如下:
AAC
AMR(AdaptiveMulti-Rate, aformatforspeech)
ALAC(AppleLossless)
iLBC(internetLowBitrateCodec, anotherformatforspeech)
IMA4(IMA/ADPCM)
linearPCM(uncompressed)
MP3(MPEG-1audiolayer3)
5> AVAudioPlayer优势
支持更多的格式
可以播放任意长度的音频文件
支持循环播放
可以同步播放多个音频文件
控制播放进度以及从音频的任意一点开始播放
6> AVAudioPlayer开发步骤
- 步骤一:AVAudioPlayer 包含在 AVFoundation 框架中,所以开发的时候首先导入音频的框架 AVFoundation.framework
引入头文件
#import <AVFoundation/AVFoundation.h>
- 步骤二: AVAudioPlayer 的初始化的时候需要给一个播放文件
AVAudioPlayer *avAudioPlayer = [[AVAudioPlayer alloc] initWithContentsOfURL:文件路径 error:nil];
- 步骤三:重要属性
设置初始音量大小 audioPlayer.volume = 1;(0.0 ~ 1.0)
设置音乐播放次数 audioPlayer.numberOfLoops = -1;(只要是负数都是循环播放)
播放进度 audioPlayer.currentTime = 0;
- 步骤四:重要方法
预播放
[audioPlayer prepareToPlay];
播放
[audioPlayer play];
暂停
[audioPlayer pause];
停止
[audioPlayer stop];
- 步骤五:代理方法
协议:AVAudioPlayerDelegate
播放完成会调用的代理方法
- (void)audioPlayerDidFinishPlaying:(AVAudioPlayer *)player successfully:(BOOL)flag;
播放解码失败
- (void)audioPlayerDecodeErrorDidOccur:(AVAudioPlayer *)player error:(NSError *)error;
7> 简单代码实例:
// 懒加载
- (AVAudioPlayer *)player
{
if (_player == nil) { NSString *urlString = [[NSBundle mainBundle] pathForResource:@"南征北战 - 骄傲的少年" ofType:@"mp3"]; NSURL *url = [NSURL fileURLWithPath:urlString]; _player = [[AVAudioPlayer alloc] initWithContentsOfURL:url error:nil]; _player.delegate = self; // 设置默认的音量
_player.volume = 0.5;
}
return _player;
} // 播放按钮响应事件
- (IBAction)play:(id)sender
{
[self.player play];
} // 暂停按钮响应事件
- (IBAction)pause:(id)sender
{
[self.player pause];
} // 停止按钮响应事件
- (IBAction)stop:(id)sender
{
[self.player stop];
} // 音量滑竿响应事件
- (IBAction)changeVolume:(UISlider *)sender
{
self.player.volume = sender.value;
}
在我的github上有一个较完善的练习代码,有兴趣的小伙伴可以看看!
8> 音频的后台播放
- 首先要修改配置文件,在 Info.plist 文件中,添加 UIBackGroundModes ,可以添加包括 Audio 在后台播放音频和视频里的声音,location 保持当前用户的位置信息, voip 使用网络电话。添加以上字段是为了通知系统框架,在应用程序进入后台时候请求在后台继续播放一段时间,具体播放多久,根据 UIBackGroundTask 去申请一段时间。还可以使用本地通知,预先设定 local notification 来让应用程序在后台运行。
- 后台播放音频设置
AVAudioSession *session = [AVAudioSession sharedInstance];
[session setActive:YES error:nil];
[session setCategory:AVAudioSessionCategoryPlayback error:nil];
- 让app支持接受远程控制事件
[[UIApplication sharedApplication] beginReceivingRemoteControlEvents];
2. 视频
1> AVPlayer
iOS 里面视频播放用到的是 AVPlayer(包含在AVFoundation框架内)与 AVAudioPlayer 有点类似,但是 AVPlayer 的功能更加强大,它可以用来播放音频也可以用来播放视频。而且在播放音频方面 AVPlayer 可以直接播放网络音频。
2> 视频播放实现步骤
- 步骤一:导入支持视频播放的框架AVFoundation.framework
引入头文件代码
#import <AVFoundation/AVFoundation.h>
- 步骤二:获取播放的地址
NSString *playString = @"http://static.tripbe.com/videofiles/20121214/9533522808.f4v.mp4"; // 播放地址
NSURL *playURL = [NSURL URLWithString:playString];
- 步骤三:根据播放的 URL 创建 AVPlayerItem 对象
AVPlayerItem 可以获取视频的信息,当前播放时间,总时间等
AVPlayerItem *item = [[AVPlayerItem alloc] initWithURL:playURL];
AVPlayerItem 的重要属性
状态 status
AVPlayerStatusUnknown,(代表视频播放出现了未知的问题)
AVPlayerStatusReadyToPlay,(代表视频可以播放,可以调用 play方法)
AVPlayerStatusFailed(代表视频无法进行播放了)
loadedTimeRange:代表已经缓存的进度,监听此属性可以在 UI 中更新缓存进度,也是很有用的一个属性
- 步骤四:根据 AVPlayerItem 初始化 AVPlayer 对象
@interface ViewController ()
@property(nonatomic, strong)AVPlayer *player;
@end self.player = [[AVPlayer alloc] initWithPlayerItem:item];
- 步骤五:把 AVPlayerLayer 添加到需要播放页面的 Layer 层
// 设置播放页面
AVPlayerLayer *layer = [AVPlayerLayer playerLayerWithPlayer:_player];
// 设置播放页面的大小
layer.frame = CGRectMake(, , [UIScreen mainScreen].bounds.size.width, );
// 设置背景颜色
layer.backgroundColor = [UIColor cyanColor].CGColor;
// 设置播放窗口和当前视图之间的比例显示内容
layer.videoGravity = AVLayerVideoGravityResizeAspect;
// 添加播放视图到view上
[self.view.layer addSublayer:layer];
- 步骤六:AVPlayerLayer 播放
// 播放
[self.player play];
- 步骤七:在指定的时间播放
[self.player seekToTime:CMTimeMakeWithSeconds(progress,
//设置每秒钟多少帧
self.player.currentTime.timescale) completionHandler:^(BOOL finished) { }]; // 设置音量
self.player.volume = 1.0f;
// 当前播放时间
self.player.currentTime
- 步骤八:播放完成的通知
//当播放完成时,可以注册通知,根据需求,做出不同的响应
AVPlayerItemDidPlayToEndTimeNotification
可以通过设置观察者来完成添加播放完成通知
-(void)addNotification{
//给AVPlayerItem添加播放完成通知
[[NSNotificationCenter defaultCenter] addObserver:self selector:@selector(playbackFinished:)name:AVPlayerItemDidPlayToEndTimeNotification object:self.player.currentItem];
} -(void)playbackFinished:(NSNotification *)notification{
NSLog(@"视频播放完成.");
}
通过以上的六个步骤已经可以实现视频在 iOS 客户端的播放;
AVPlayerltem 资源管理对象,作用是:切换视频播放,使用时切换不同的 Item 即可. 而非创建新的 AVPlayer.
AVPlayerItem 的一些重要属性可以使我们定制视频的开发
实例代码:
- (void)viewDidLoad {
[super viewDidLoad]; NSString *playString = @"http://static.tripbe.com/videofiles/20121214/9533522808.f4v.mp4";
NSURL *url = [NSURL URLWithString:playString];
// 本地视频
// NSURL *url = [NSURL fileURLWithPath:[[NSBundle mainBundle] pathForResource:@"1457622279563.mp4" ofType:nil]]; // 设置播放的项目
AVPlayerItem *item = [[AVPlayerItem alloc] initWithURL:url]; // 初始化player对象
self.player = [[AVPlayer alloc] initWithPlayerItem:item]; // 设置播放页面
AVPlayerLayer *layer = [AVPlayerLayer playerLayerWithPlayer:_player];
// 设置播放页面的大小
layer.frame = CGRectMake(, , [UIScreen mainScreen].bounds.size.width, );
// 设置背景颜色
layer.backgroundColor = [UIColor cyanColor].CGColor;
// 设置播放窗口和当前视图之间的比例显示内容
layer.videoGravity = AVLayerVideoGravityResizeAspect;
// 添加播放视图到view上
[self.view.layer addSublayer:layer]; // 设置播放进度的默认值
self.progressSlider.value = ;
// 设置播放音量的默认值
self.player.volume = 1.0f; [self addNotification];
} #pragma mark - 开始播放按钮的响应方法
- (IBAction)startPlayer:(UIButton *)sender
{
[self.player play];
}
#pragma mark - 暂停播放按钮的响应方法
- (IBAction)puasePlayer:(UIButton *)sender
{
[self.player pause];
}
#pragma mark - 改变进度按钮的响应方法
- (IBAction)changeProgress:(UISlider *)sender
{
self.sumPlayOperation = _player.currentItem.duration.value / _player.currentItem.duration.timescale; // CMTimeMake(a, b) a表示当前时间,b表示每秒钟有多少帧
[_player seekToTime:CMTimeMakeWithSeconds(sender.value * self.sumPlayOperation, _player.currentTime.timescale) completionHandler:^(BOOL finished) {
[self.player play];
}];
} - (void)addNotification{
//给AVPlayerItem添加播放完成通知
[[NSNotificationCenter defaultCenter] addObserver:self selector:@selector(playbackFinished:)name:AVPlayerItemDidPlayToEndTimeNotification object:self.player.currentItem];
} - (void)playbackFinished:(NSNotification *)notification{
NSLog(@"视频播放完成.");
}
【原】iOS学习45之多媒体操作的更多相关文章
- IOS学习笔记25—HTTP操作之ASIHTTPRequest
IOS学习笔记25—HTTP操作之ASIHTTPRequest 分类: iOS2012-08-12 10:04 7734人阅读 评论(3) 收藏 举报 iosios5网络wrapper框架新浪微博 A ...
- IOS学习笔记25—HTTP操作之ASIHTTPRequest(一)
ASIHTTPRequest是一个第三方开源项目,在现在的IOS应用中多使用到这个开源类库来提供网络操作,相比于SDK提供的网络操作类库,ASIHTTPRequest使用上更加方便.效率更高,同时功能 ...
- iOS: 学习笔记, 使用FMDatabase操作sqlite3
使用FMDatabase操作sqlite3数据库非常简单和方便 // // main.m // iOSDemo0602_sqlite3 // // Created by yao_yu on 14-6- ...
- 原 iOS深入学习(Block全面分析)http://my.oschina.net/leejan97/blog/268536
原 iOS深入学习(Block全面分析) 发表于1年前(2014-05-24 16:45) 阅读(26949) | 评论(14) 39人收藏此文章, 我要收藏 赞21 12月12日北京OSC源创会 ...
- 【原】iOS学习47之第三方-FMDB
将 CocoaPods 安装后,按照 CocoaPods 的使用说明就可以将 FMDB 第三方集成到工程中,具体请看博客iOS学习46之第三方CocoaPods的安装和使用(通用方法) 1. FMDB ...
- 【原】iOS学习之SQLite和CoreData数据库的比较
1. SQLite数据库 sqlite数据库操作的基本流程是, 创建数据库, 再通过定义一些字段来定义表格结构, 可以利用sql语句向表格中插入记录, 删除记录, 修改记录, 表格之间也可以建立联系. ...
- IOS学习之IOS沙盒(sandbox)机制和文件操作
IOS学习之IOS沙盒(sandbox)机制和文件操作(一) 1.IOS沙盒机制 IOS应用程序只能在为该改程序创建的文件系统中读取文件,不可以去其它地方访问,此区域被成为沙盒,所以所有的非代码文件都 ...
- iOS学习之UITableView中Cell的操作
接着iOS学习之Table View的简单使用 这篇,这里主要讲UITableView 中的Cell的操作,包括标记.移动.删除.插入. 为了简单快捷,直接从原来那篇的代码开始,代码下载地址:http ...
- iOS学习之iOS沙盒(sandbox)机制和文件操作1
iOS学习之iOS沙盒(sandbox)机制和文件操作 接上篇 iOS学习之iOS沙盒(sandbox)机制和文件操作(一) 我们看看如何获取应用程序沙盒目录.包括真机的沙盒的目录. 1.获取程序的H ...
随机推荐
- Http返回码
HTTP协议状态码表示的意思主要分为五类 ,大体是 : ~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1×× 保留 2×× 表示请求成功地接收 3×× 为完成请求客户需 ...
- 瞧一瞧迷一般的SQLDA
With static SQL, host variables used in embedded SQL statements are known at application compile tim ...
- JavaScript基础——理解变量作用域
一旦你开始在JavaScript应用程序中添加条件.函数和循环,就需要理解变量作用域.变量作用域规定了如何确定正在执行的代码行上的一个特定变量名的值. JavaScript允许你既定义全局版本又定义局 ...
- SQLServer事务
指访问并可能更新数据库中各种数据项的一个程序执行单元(unit)由多个sql语句组成,必须作为一个整体执行这些sql语句作为一个整体一起向系统提交,要么都执行.要么都不执行 语法步骤:开始事务:BEG ...
- linux cpuInfo
转自:http://blog.csdn.net/lgstudyvc/article/details/7889364 /proc/cpuinfo文件分析 在Linux系统中,提供了proc文件系统显 ...
- 排队打饭 sdut 2443【最简单的贪心法应用举例】
排队打饭 Time Limit: 1000ms Memory limit: 65536K 有疑问?点这里^_^ 题目描述 题目链接:http://acm.sdut.edu.cn/sdutoj/p ...
- windows常用命令
打开"运行"对话框(Win+R),输入cmd,打开控制台命令窗口... 也可以通过cmd /c 命令 和 cmd /k 命令的方式来直接运行命令 注:/c表示执行完命令后关闭cmd ...
- Swipe JS – 移动WEB页面内容触摸滑动类库
想必做移动前端的同学经常会接到这样子的一个需求,就是在移动设备页面上的banner图能够用手指触摸左右或上下的滑动切换,这在移动设备是个很常见的一个效果,其用户体验远甚于点击一个按钮区域,通过手指的触 ...
- Solr入门之(8)中文分词器配置
Solr中虽然提供了一个中文分词器,但是效果很差,可以使用IKAnalyzer或Mmseg4j 或其他中文分词器. 一.IKAnalyzer分词器配置: 1.下载IKAnalyzer(IKAnalyz ...
- 【转】从RGB色转为灰度色算法
----本文摘自作者ZYL910的博客 一.基础 对于彩色转灰度,有一个很著名的心理学公式: Gray = R*0.299 + G*0.587 + B*0.114 二.整数算法 而实际应用时,希望避 ...