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之多媒体操作的更多相关文章

  1. IOS学习笔记25—HTTP操作之ASIHTTPRequest

    IOS学习笔记25—HTTP操作之ASIHTTPRequest 分类: iOS2012-08-12 10:04 7734人阅读 评论(3) 收藏 举报 iosios5网络wrapper框架新浪微博 A ...

  2. IOS学习笔记25—HTTP操作之ASIHTTPRequest(一)

    ASIHTTPRequest是一个第三方开源项目,在现在的IOS应用中多使用到这个开源类库来提供网络操作,相比于SDK提供的网络操作类库,ASIHTTPRequest使用上更加方便.效率更高,同时功能 ...

  3. iOS: 学习笔记, 使用FMDatabase操作sqlite3

    使用FMDatabase操作sqlite3数据库非常简单和方便 // // main.m // iOSDemo0602_sqlite3 // // Created by yao_yu on 14-6- ...

  4. 原 iOS深入学习(Block全面分析)http://my.oschina.net/leejan97/blog/268536

    原 iOS深入学习(Block全面分析) 发表于1年前(2014-05-24 16:45)   阅读(26949) | 评论(14) 39人收藏此文章, 我要收藏 赞21 12月12日北京OSC源创会 ...

  5. 【原】iOS学习47之第三方-FMDB

    将 CocoaPods 安装后,按照 CocoaPods 的使用说明就可以将 FMDB 第三方集成到工程中,具体请看博客iOS学习46之第三方CocoaPods的安装和使用(通用方法) 1. FMDB ...

  6. 【原】iOS学习之SQLite和CoreData数据库的比较

    1. SQLite数据库 sqlite数据库操作的基本流程是, 创建数据库, 再通过定义一些字段来定义表格结构, 可以利用sql语句向表格中插入记录, 删除记录, 修改记录, 表格之间也可以建立联系. ...

  7. IOS学习之IOS沙盒(sandbox)机制和文件操作

    IOS学习之IOS沙盒(sandbox)机制和文件操作(一) 1.IOS沙盒机制 IOS应用程序只能在为该改程序创建的文件系统中读取文件,不可以去其它地方访问,此区域被成为沙盒,所以所有的非代码文件都 ...

  8. iOS学习之UITableView中Cell的操作

    接着iOS学习之Table View的简单使用 这篇,这里主要讲UITableView 中的Cell的操作,包括标记.移动.删除.插入. 为了简单快捷,直接从原来那篇的代码开始,代码下载地址:http ...

  9. iOS学习之iOS沙盒(sandbox)机制和文件操作1

    iOS学习之iOS沙盒(sandbox)机制和文件操作 接上篇 iOS学习之iOS沙盒(sandbox)机制和文件操作(一) 我们看看如何获取应用程序沙盒目录.包括真机的沙盒的目录. 1.获取程序的H ...

随机推荐

  1. IIS6与IIS7中如何设置文件过期

    在IIS6中:一. 打开IIS管理器 二. 选中要设置的网站单击属性,打开站点属性菜单 三. 单击HTTP头选项卡 四. 单击 启用内容过期 如:设置30分钟后过期,此时间段后过期项中填30,单位选择 ...

  2. ios添加百度地图方法

    Hello BaiduMapiOS SDK 引入头文件 引入静态库文件 引入系统framework 引入mapapi.bundle资源文件 初始化BMKMapManager 创建BMKMapView ...

  3. OkHttp学习总结

    This paper mainly includes the following contents okhttp ordinary operation. okhttp interceptors. Re ...

  4. Ubuntu 14.04 Trusty安装java环境

    原文:Install Oracle Java 6, 7, or 8 in Ubuntu 14.04 Trusty 命令如下: sudo add-apt-repository ppa:webupd8te ...

  5. poj 1006:Biorhythms(水题,经典题,中国剩余定理)

    Biorhythms Time Limit: 1000MS   Memory Limit: 10000K Total Submissions: 110991   Accepted: 34541 Des ...

  6. Solr auto commit 配置

    为了解决写索引时频繁提交带来的效率问题,考虑使用自动提交. 在solrconfig.xml中增加以下代码: <updateHandler class="solr.DirectUpdat ...

  7. VS2010下配置OpenMesh

    从www.openmesh.org下载最新版的安装包或者源代码,注意下载与自己系统匹配的版本,我下的是VS2010预编译版的,下载源码自己编译是一样的.安装好Visual Studio. 安装Open ...

  8. mathematica练习程序(图像取反)

    代码很简单,就四行,我想到可以用mathematica干点什么了. 有人通过mathematica编程研究过视频编解码算法么,挺有意思,可以尝试一下. img=Import["f:/lena ...

  9. BPEL是个什么东东

    研究团队有个做智能服务组合的,其中用到叫BPEL的东西,因为全称是Business Process Execution Language,译成中文就是商业执行过程语言,这个东东的是整合SOA的一个执行 ...

  10. Arduino101学习笔记(四)—— 数字IO

    1.设置管脚模式 //***************************************************************************************** ...