一.AVFoundation含义
AVFoundation是苹果OS X 系统和iOS系统中用于处理基于时间的媒体数据的高级OC框架。构建考虑到目前的硬件环境和应用程序,其设计过程高度依赖多线程机制。充分利用多核硬件和优势并大量使用block和GCD机制讲复杂的计算进程放在后台线程运行。针对64位处理器设计的,可以发挥64位处理器的所有优势。
2.AVFoundation的试用范围。
Core Audio
Core Audio是处理音频的框架,为音频提供录制、播放和处理提供相应接口。Core Audio也提供高级层级接口,比如通过Audio Queue Services框架锁提供的接口。只要处理基本的音频播放和录音相关功能。同时还会提供相对低级层级接口,尤其是Audio Units接口,提供了针对音频信号进行完全控制的功能。并通过Audio Units让你能够构建一些复杂的音频处理模式。
Core Video
Core Video是OS X和iOS系统上针对数字视频所提供的管道模式。Core Video为其相对的Core Media提供图片缓存和缓存池支持。提供了一个能够对数字视频逐帧访问的接口。该框架通过像素格式之间的转换并管理视频同步事项使得复杂的工作得到了有效化。
Core Media
Core Media是AVFoundation所用到的低层级媒体管道的一部分。Core Media提供了AVFoundation 用到的基于CMTime数据类型的时基模型。CMTime及其相关数据类型一般在AVFoundation处理基于时间的操作。
Core Animation
Core Animation提供了iOS合成及动画相关的框架。提供苹果平台所具有的美观、流畅的动画效果。提供一个简单、声明性的编程模式,并已经封装了支持OpenGL和OpenGL ES功能的基于OC的各种类。使用Core Animation时,对于视频的播放和视频捕获这2个动作,AVFoundation提供了硬件加速机制来对整个流程进行优化。AVFoundation还可以利用Core Animation让开发者能够在视频编辑和播放过程中添加动画标题和图片效果。
处于高层级框架和低层级框架之间的就是AVFoundation。整体媒体分类图中AVFoundation地位举足轻重,提供很多低级框架才能完成的功能和性能。
解析AV Foundation
AVFoundation下功能类。
1>音频播放记录-->AVAudioPLayer和AVAudioRecorder可以在应用程序提供一种更简单的整合音频播放和记录的功能。
2>媒体文件检查-->提供检查正在使用的媒体文件功能。可以查看这些媒体资源来确定是否适合一些特定任务。如是否可回放或者是编辑导出。还可以获取资源相关的技术参数(内容持续时间、创建日期、首选播放音量)还基于AVMetadataItem类提供功能强大的元数据支持。允许开发者读写关于媒体资源的描述信息,比如唱片薄和艺术家信息。
3>视频播放-->AVFoundation可以播放本地文件或远程流中获取视频资源,并对视频播放和内容的展示进行控制。核心类是AVPlayer和AVPlayerItem.
4>媒体捕获-->摄像头捕获核心类AVCaptureSession,其作为所有活动个的汇集点来接受摄像头设备由各路流发过来的电影和图片。
5>媒体处理-->执行更高级的媒体处理时,可以使用AVAssetReader和AVAssetWriter类实现这些功能。这些类直接提供访问视频和音频样本的功能,可对任何媒体资源进行更高级别的处理。
二、了解数字媒体
1>数字媒体采样:主要有2种方式进行。第一种为时间采样:捕获一个信号周期内变化。第二种采样方式为空间采样:用于图片数字化和其他可视化媒体内容数字化的过程。
音频数字化过程包含一个编码方法,称为线性脉冲编码调制,比较常见的说法是linear PCM或LPCM.
2>数字媒体压缩:为缩小媒体文件大小,需要对其使用压缩技术。
色彩二次抽样:减少存储在每个像素中的颜色信息,而不至于图片质量严重受损。这个减少颜色数据的过程称为色彩二次抽样。
3>编解码器压缩
视频编解码器:H.264 规范是Motion Picture Experts Group(MPEG)所定义的MPEG-4一部分。和其他MPEG压缩一样,通过2个维度缩小视频文件尺寸:
空间:压缩独立视频帧,帧内压缩。
时间:通过组为单位的视频帧压缩冗余数据,为帧间压缩。
帧内压缩:通过消除包含在每个独立视频帧内的色彩及结构中的冗余信息来压缩,可以在不降低图片质量情况下尽可能缩小图片尺寸。
帧间压缩:分为I-Frame 独立帧或关键帧,尺寸最大,解压最快。P-frame:预测帧,基于I-frame或p-frame预测的图片进行编码得到的。B-frame:双向帧,是基于使用之前和之后的帧信息进行编码得到的帧。解压耗时,因为依赖周围的帧。
H.264编码高级标准:
baseLine Main High.
音频编解码: 只要是Core Audio框架支持的音频编解码,AVFoundation都可以支持,意味着AVFoundation能够支持大量不同格式的资源。在不用线性PCM音频下,更多是用AAC.
AVFoundation和 Core Audio提供对MP3数据解码的支持,但是不支持对其进行编码。
4>容器格式:如.mov、.m4v、.mpg、.m4a.通常都称为容器格式。
三、AVFoundation下AVSpeedSynthesizer播放语音.
//播放语音..
AVSpeechSynthesizer * synthesizer = [[AVSpeechSynthesizer alloc] init];
//英文格式读出
AVSpeechUtterance * utterance =[[AVSpeechUtterance alloc] initWithString:@"Hello Word"];
[synthesizer speakUtterance:utterance];
运行代码之后,会按照默认的区域设置声音读出。
接下来封装到一个工具类中。
#import
#import
NS_ASSUME_NONNULL_BEGIN
@interface THSpeechController : NSObject
@property(strong,nonatomic,readonly)AVSpeechSynthesizer * synthesizer;
+(instancetype)speechController;
//外部调用开始读--也可以构造一个方法 传入要读取的信息
-(void)beginConverSation;
@end
NS_ASSUME_NONNULL_END
在类的实现文件中。
#import "THSpeechController.h"
@interface THSpeechController ()
@property(nonatomic,strong)AVSpeechSynthesizer * synthesizer;
@property(nonatomic,strong)NSArray * voices;
@property(nonatomic,strong)NSArray *speechStrings;
@end
@implementation THSpeechController
+(instancetype)speechController {
return [[self alloc] init];
}
-(instancetype)init {
self =[super init];
if (self) {
_synthesizer =[[AVSpeechSynthesizer alloc] init];
_synthesizer.delegate = self;
_voices =@[[AVSpeechSynthesisVoice voiceWithLanguage:@"en-US"]
,[AVSpeechSynthesisVoice voiceWithLanguage:@"en-GB"]];
_speechStrings =[self buildSpeechStrings];
}
return self;
}
-(NSArray *)buildSpeechStrings {
return @[@"Hello AV Foundation. How are you?",@"I am well! Thanks for asking.",@"Are you excited about the book?",@"Very! I have always felt so misunderstood",@"what is you favorite feature?",@"Oh,they are all my babies. I could not possibly choose.",@"It was great to speak with you!",@"The pleasure was all mine! Have fun!"];
}
-(void)beginConverSation {
for (NSUInteger i =0; i
注意这里如果不写代理方法实现的话,是不会连续播放的。只读第一句。
//代理方法.....
- (void)speechSynthesizer:(AVSpeechSynthesizer *)synthesizer didStartSpeechUtterance:(AVSpeechUtterance *)utterance API_AVAILABLE(ios(7.0), watchos(1.0), tvos(7.0), macos(10.14)) {
//开始读
}
- (void)speechSynthesizer:(AVSpeechSynthesizer *)synthesizer didFinishSpeechUtterance:(AVSpeechUtterance *)utterance API_AVAILABLE(ios(7.0), watchos(1.0), tvos(7.0), macos(10.14)){
//结束读
}
- (void)speechSynthesizer:(AVSpeechSynthesizer *)synthesizer didPauseSpeechUtterance:(AVSpeechUtterance *)utterance API_AVAILABLE(ios(7.0), watchos(1.0), tvos(7.0), macos(10.14)){
//暂停读
}
- (void)speechSynthesizer:(AVSpeechSynthesizer *)synthesizer didContinueSpeechUtterance:(AVSpeechUtterance *)utterance API_AVAILABLE(ios(7.0), watchos(1.0), tvos(7.0), macos(10.14)){
//暂停后的继续
}
- (void)speechSynthesizer:(AVSpeechSynthesizer *)synthesizer didCancelSpeechUtterance:(AVSpeechUtterance *)utterance API_AVAILABLE(ios(7.0), watchos(1.0), tvos(7.0), macos(10.14)){
//取消
}
- (void)speechSynthesizer:(AVSpeechSynthesizer *)synthesizer willSpeakRangeOfSpeechString:(NSRange)characterRange utterance:(AVSpeechUtterance *)utterance API_AVAILABLE(ios(7.0), watchos(1.0), tvos(7.0), macos(10.14)){
//去取的内容 部分
}