【原】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(0, 100, [UIScreen mainScreen].bounds.size.width, 300);// 设置背景颜色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(0, 100, [UIScreen mainScreen].bounds.size.width, 300);// 设置背景颜色layer.backgroundColor = [UIColor cyanColor].CGColor;// 设置播放窗口和当前视图之间的比例显示内容layer.videoGravity = AVLayerVideoGravityResizeAspect;// 添加播放视图到view上 [self.view.layer addSublayer:layer];// 设置播放进度的默认值self.progressSlider.value = 0;// 设置播放音量的默认值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(@"视频播放完成."); }
转载于:https://www.cnblogs.com/gfxxbk/p/5531879.html
【原】iOS学习45之多媒体操作相关推荐
- IOS学习笔记39——拍照、从相册选图并对图片进行裁剪
2013第一篇,大家新年快乐!感谢一直关注我博客的同学们,有你们的支持我才有动力越做越好!有阵子没写博客了,因为前阵子着实比较忙,没时间整理,今天主要实现一个小Demo,我们知道在Instagram或 ...
- iOS学习之iOS沙盒(sandbox)机制和文件操作(二)
接上篇 iOS学习之iOS沙盒(sandbox)机制和文件操作(一) 我们看看如何获取应用程序沙盒目录.包括真机的沙盒的目录. 1.获取程序的Home目录 [cpp] view plaincopy N ...
- 【原】iOS学习之事件处理的原理
在iOS学习23之事件处理中,小编详细的介绍了事件处理,在这里小编叙述一下它的相关原理 1.UITouch对象 在触摸事件的处理方法中都会有一个存放着UITouch对象的集合,这个参数有什么用呢? ( ...
- ios学习 准备列表
2019独角兽企业重金招聘Python工程师标准>>> Skip to content This repository Pull requests Issues Gist Watch ...
- iOS 学习资料整理
这份学习资料是为 iOS 初学者所准备的, 旨在帮助 iOS 初学者们快速找到适合自己的学习资料, 节省他们搜索资料的时间, 使他们更好的规划好自己的 iOS 学习路线, 更快的入门, 更准确的定位的 ...
- ios学习--iphone开发笔记和技巧总结(原址持续更新)
ios学习--iphone开发笔记和技巧总结(原址持续更新) 分类: ios Object-C2012-04-18 10:16 2716人阅读 评论(1) 收藏 举报 uiviewiphonelist ...
- 电大本科计算机应用基础课程考核,2016年度春中央电大本科计算机应用基础学习知识网考操作技巧题及其规范标准答案.doc...
2016年度春中央电大本科计算机应用基础学习知识网考操作技巧题及其规范标准答案.doc -一.操作题1.请在考生文件夹下完成如下操作(1)通过"资源管理器"窗口,在考生文件夹下建立 ...
- iOS学习:调用相机,选择图片上传,带预览功能
iOS学习:调用相机,选择图片上传,带预览功能 发表于2年前(2013-05-30 21:38) 阅读( 18194) | 评论( 16) 27人收藏此文章,我要收藏 赞3 8月22日珠海 OSC ...
- 多媒体计算机采用的数字化,数字化学习中运用多媒体(下)
原标题:数字化学习中运用多媒体(下) 本文发表于 <数字教育> 2019年第2期(总第26期)特稿栏目,页码:1-11.转载请注明出处. 摘 要:本文通过回顾12 条基于研究的教学设计原则 ...
最新文章
- git 代码托管使用方法
- microsoft .net framework专题汇总
- 2021-02-21 代码不规范,运维两行泪 代码规范
- Python ndarray.strides用法
- gRPC in ASP.NET Core 3.x -- Protocol Buffer, Go语言的例子(下)
- browserquest php安装,请问一下browserquest-php项目换成GatewayWorker的形式需要怎么部署worker...
- 49session的生命周期实例
- MySQL查询表的所有列名,用逗号拼接
- KVM Tracing, perf_events
- input只改变光标的颜色 不改变字的颜色
- vue怎么实现右键二级菜单_vue中如何自定义右键菜单详解
- Android给scrollView截图超过屏幕大小形成长图
- [学习笔记]在数据库层面应对并发访问产生的问题
- 通过SessionID和用户名来保证同一个用户不能同时登录
- 数据库事务的特性(ACID)
- 在写csdn博客时,如何实现用超链接进行页面内跳转?
- 数学与应用数学考研计算机方向,数学专业考研方向解析:应用数学
- Vuex入门及进阶笔记
- 更好玩的跑步机,还有丰富课程资源,赤兔Air跑步机体验
- 第三方支付和第四方支付有什么区别?
热门文章
- SAP基底数据仓库实战项目(序章)
- flink on yarn使用第三方jars的方法如何查看进程所持有jar包
- CTF show 萌新区解题报告 (一)
- mac笔记本怎么外接显示屏_苹果MAC笔记本怎么外接显示器
- android电商平台,基于Android的电商平台通用客户端的设计与实现
- 批量提取 srt 字幕文件中的文字
- 若干物联网无线技术 - NB-IOT、LoRa、433、GPRS、2.4G、PKE近场通信,基础理论与开发点滴总结
- 正确建立索引以及最左前缀原则
- 配置OHS 12C转发HTTPS请求
- 初中计算机实践研究计划,《初中信息技术学科学生作品有效评价的实践研究》课题研究计划...