程序员iOS音视频开发音视频

AVFoundation开发秘籍笔记-01AVFoundatio

2018-05-25  本文已影响428人  竹与豆

一、概述

AVFoundation是可以用它来播放和创建基于时间的视听媒体的几个框架之一,它提供了基于时间的视听数据的详细界别上的OC接口。可以用它来检查、创建、编辑、重新编码媒体文件。也可以从设备得到输入流和实时捕捉回放过程中操控视频

用于处理基于时间的媒体数据的高级OC框架。充分利用了多核硬件的优势并大量使用block和Grand Central Dispatch(GCD)机制将复杂的计算进程放在后台线程运行。自动提供硬件加速操作,确保在大部分设备上应用程序能以最佳性能运行。

二、适用范围

AVFoundtion_iOS.png AVFoundation_OSX.png

AV Foundation的几个最主要的支撑框架及其提供的功能:

AV处于高层级框架和低层级框架之间,提供了很多低层级框架才能实现的功能和性能,并且是以更简单的OC接口方式实现,同时也可以和高层级框架无缝连接。

三、AV功能分解

四、了解数字媒体

了解信号的数字化过程。

视频文件一秒内所能展现的帧数成为视频的帧率,用FPS作为单位进行测量。常见的帧率是24FPS、25FPS、30FPS。

目前视频最流行的宽高比是16:9,意思是没16个水平像素对应9个垂直像素。常见视频尺寸为1280*720,1920*1080。

如果每个像素点使用8位RGB色彩空间,这意味着红色8位,绿色8位,蓝色8位。

现在问题来了,一个帧率为30FPS,分辨率是1920*1080的视频存储需求就是:1920*1080 * 30 * 24 (b/s)

五、数字媒体压缩

为缩小数字媒体文件大小,需要对齐使用压缩技术。

1、色彩二次抽样

视频数据是使用YCbCr颜色模式的典型案例,也常称为YUV。

对RGB模式来说,每个像素是由红、绿、蓝三种颜色组合而成,而YUV使用的是色彩通道UV(颜色)替换了像素的亮度通道Y(亮度)。眼睛对于亮度的敏感度要高于颜色,所以可以大幅度减少存储在每个像素中的颜色信息,不至于是图片质量严重受损,减少颜色数据的过程就成为色彩二次抽样。

2、编解码器压缩。

大部分音频和视频都是使用编解码器(codec)来压缩的,即编码器和解码器(encoder/decoder)。编解码器使用高级压缩算法对需要保存或发送的音频或视频数据进行压缩和编码,同时还可以将压缩文件解码成为适合播放和编辑的媒体资源。编解码器可以进行无损压缩也可以机型有损压缩。

3、视频编解码器。

对于视频编辑码而言,AV提供有限的编解码器集合,只提供苹果公司认定的最主流的几种媒体类型的支持。对视频文件主要可以归结为H.264Apple ProRes

3.1、H.264

H.264规范是Motion Picture Experts Group(MPEG)所定义的MPEG-4的一部分,H.264遵循早期的MPEG-1MPEG-2标准,但在以更低比特率得到更高图片质量方面有了长足进步,使其更好地使用与流媒体文件和移动设备及视频摄像头。

H.264与其他形式的MPEG压缩一样,通过以下两个纬度缩小了视频文件的大小:

帧内压缩,通过消除包含在每个独立视频帧内的色彩及结构中的冗余信息来进行压缩,因此可在不降低图片质量的情况小尽可能缩小尺寸。这类压缩类似JEPG压缩,帧内压缩可以作为有损压缩算法,通常用于对原始图片的一部分进行处理以生成极高质量的照片,通过这一过程创建的帧成为I-frames

帧间压缩,很多帧被组合在一起成为一组图片(简称GOP),对于GOP所存在的时间维度的冗余可以被消除。在一个时间维度上的冗余,如视频的固定背景环境,就可以通过压缩的方式进行消除。

GOP中三种不同的帧:

H.264还支持编码视图,用于确定在整个编码过程中所使用的算法定义三个高级标准:

3.2、Apple ProRes

ProRes编解码器只在OSX上使用,针对iOS进行开发,只能使用H.264

H.264Apple ProRes来说,AV还支持很多摄像头设备的编解码器,如MPEG-1MPEG-2MPEG-4H.263DV,允许用户以多种不同的视频捕捉设备导入内容资源。

4、音频编解码器

只要是Core Audio框架支持的音频编解码,AV都可以支持。意味着AV可以支持大量不同格式的资源,然而在不适用线性PCM音频的情况下,更多的只能使用AAC。

AAC,高级音频编码是H.264标准相应的音频处理方式,目前已成为音频流和下载的音频资源中最主流的编码方式。这种格式比MP3格式有显著的提升,可以在低比特率的前提下提供更高质量的音频,在web上发布和传播的音频格式中最为理想的。AAC没有来自证书和许可方面的限制。

AVCore Audio提供对MP3数据解码的支持,但不支持对齐进行编码。

六、容器格式

容器格式(container fromat)就是文件类型,或者说文件格式,比如.mov.mp4.mpgavi等。

容器格式被认为是元文件格式,可以将容器格式视为包含一种或者更多种媒体类型(以及描述其内容的元数据)的目录。

每种格式都有一个规范用于确定文件的机构,所谓的结构并不仅是其包含的媒体资源技术领域的问题,比如媒体的周期、编码和时间信息,还定义了默哀属性还原数据,比如电影标题或一首歌的作者信息等。这些元数据可以通过工具进行呈现。

使用AV是,将遇到两种主要的容器格式:

七、AVFoundation文本到语音功能

通过AVSpeechSynthesizer实现文本到语音功能。这个类用来播放一个或多个语音内容,这些语音内容为AVSpeechUtterance的类的实例。

e.g.

#import "LFSpeechViewController.h"
#import <AVFoundation/AVFoundation.h>
@interface LFSpeechViewController ()

//执行具体的“文本到语音”回话。对于一个或多个AVSpeechUtterance实例,
//该对象起到队列的作用,提供了接口供控制和见识正在进行的语音播放。
@property (nonatomic,strong) AVSpeechSynthesizer *synthesizer;

@property (nonatomic,strong) NSArray *voicesArray;

@property (nonatomic,strong) NSArray *speechStringsArray;

@end

@implementation LFSpeechViewController

- (void)viewDidLoad {
    [super viewDidLoad];
    
    _synthesizer = [[AVSpeechSynthesizer alloc] init];
    
    _voicesArray = @[[AVSpeechSynthesisVoice voiceWithLanguage:@"en-US"],[AVSpeechSynthesisVoice voiceWithLanguage:@"zh-CN"],];
//    AVSpeechSynthesisVoice 设置语音支持。
//    [AVSpeechSynthesisVoice speechVoices]获取所有支持的语音类型。
    
    _speechStringsArray = [self buildSpeechStrings];
    
    NSLog(@"%@",[AVSpeechSynthesisVoice speechVoices]);
}
- (IBAction)beginButtonClicked:(UIButton *)sender {
    [self beginConversation];
}

- (void)beginConversation {
    for (int i = 0; i < self.speechStringsArray.count; i++) {
        AVSpeechUtterance *utterance = [[AVSpeechUtterance alloc] initWithString:self.speechStringsArray[i]];
        utterance.voice = self.voicesArray[i%2];//语音
        utterance.rate = 0.4f;
        //播放语音内容的速率,默认值AVSpeechUtteranceDefaultSpeechRate=0.5。
        //这个值介于AVSpeechUtteranceMinimumSpeechRate和AVSpeechUtteranceMaximumSpeechRate之间(目前是0.0-1.0)
        //这两个值是常量,在以后iOS版本中可能会发生变化,可以按照最小值和最大值的范围百分比进行计算。
        NSLog(@"min:%f-max:%f-default:%f",AVSpeechUtteranceMinimumSpeechRate,AVSpeechUtteranceMaximumSpeechRate,AVSpeechUtteranceDefaultSpeechRate);
        utterance.pitchMultiplier = 0.8f; //在播放特定语句是改变声音的音调,允许值介于0.5-2.0之间。
        utterance.postUtteranceDelay = 0.1f; //语音合成器在播放下一语句之前有段时间的暂停。
        [self.synthesizer speakUtterance:utterance];
    }
}

- (NSArray *)buildSpeechStrings {
    return  @[@"Hello,How are you ?",
              @"I'm fine ,Thank you. And you ?",
              @"I'm fine too.",
              @"人之初,性本善。性相近,习相远。苟不教,性乃迁。教之道,贵以专。昔孟母,择邻处。子不学,断机杼。窦燕山,有义方。教五子,名俱扬。养不教,父之过。教不严,师之惰。子不学,非所宜。幼不学,老何为。玉不琢,不成器。人不学,不知义。为人子,方少时。亲师友,习礼仪。香九龄,能温席。孝于亲,所当执。融四岁,能让梨。弟于长,宜先知。",
             ];
}

@end

八、任务:阅读AVFoundation文档

上一篇下一篇

猜你喜欢

热点阅读