数字夜话的博客

开始好好写博客.

明白AVFoundation

AVFoundation 基本函括了基本的音频操作,信息捕获、编辑基本信息与影片读写。这里只说简单的音频操作。

什么时候使用AVFoundation

1.获取媒体属性
2.自定义播放UI和行为
3.组成与组合媒体
4.重定义媒体信息
5.控制相机特性

AVFoundation位置

AVFoundation 位于核心层上层,在UIKit下层。 "工程目录结构"

AVFoundation类分组

AVFoundation类分组主要可以分成4部分:播放设置、信息捕获、编辑和读写4块。

播放(playback)

AVAsset

AVAsset是定时的视听媒体,它可以是视频、影片、歌曲、播客节目;可以是本地或者远程的;也可以是限定或者非限定的流;
获取一个AVAsset的方式有:程序捆绑;媒体库;图片库;获取网络地址;
AVAsset的组成:AVAssetTrackSegment->AVAssetTrack->AVAsset;
AVAssect信息获取会花费一定时间的原因:读取不同的文件格式、大文件文件信息读取,网络文件读取
异步键值加载协议:告诉我们媒体什么时候值有效,可以准备播放。

AVPlayer

AVPlayer是一个控制对象,它可以做的操作有:播放、停止和速率;不同AVAsset可以有不同的播放属性。

一个AVPlayer可以有多个AVAsset,OC通过AVPlayerItem来协调AVAsst和AVPlayer之间的关系。AVPlayerItem与AVAsset一样,同样有AVPlayerItemTrack对象。

AVPlayerLayer

播放对象与视图之间的实现需要通过AVPlayerLayer来控制。具体播放一个音频视频的步骤是:

播放步骤集合:

1.创建一个AVAsset
2.告诉asset的Track可以被加载了
3.一旦加载,为asset创建一个PlayerItem
4.把Item赋值给Player
5.把Player复制给PlayerLayer
6.等待直到Item准备好播放,然后开始播放。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
AVAsset *asset = [AVURLAsset URLAssetWithURL:fileURL options:nil];
NSArray *requestKeys = [NSArray arrayWithObjects:@“tracks,@”playable,nil];
[asset loadValuesAsynchoronouslyForKeys:requestKeys competionHandler:^{
  dispatch_async(dispatch_get_main_queue(),^{
      //complete block here
      NSError *err = nil;
      AVKeyValueStatus status =[asset statusOfValueForKey:@“tracks,error:&error];
      if(status == AVKeyValueStatusLoaded){
          self.PlayerItem = [AVPlayerItem playerItemWithAsset:asset];
          self.player = [AVPlayer playerWithPlayerItem:playerItem];
          [playerView  setPlayer:player];
      }else{
          //dont load ! need to do something~
      }
  });
}];
//等待加载完成
static void * playerItemStatueContext=&PlayerItemStatue;
//添加观察者
[playerItem addObserver:self forKeyPath:self options:0 context:playerItemStatueContext];

//显示到uiviewlayer层上
//添加结束通知
[[NSNotificationCenter defaultCenter]addObser:self selector:@selector(endMethod:) name:AVPlayerItemDidPlayEndTimeNotification];

添加滑动条:开始:暂停播放和移除通知。
更新播放时间:seekToTime:

关于播放要记住的:

1.Player 是一个控制器
2.player Item 控制当前状态
3.显示由一个player layer处理
4.注意你的播放队列。

编辑(Editing)

由asset集合组成小块作品:它可以是多个不同asset的组成;

AVCompositonTrackSegment->AVCompositionTrack->AVComposition

"工程目录结构" "工程目录结构"

时间控制需要注意的事项:

1.浮点数不允许精确的时间估算。
2.奇怪的时间尺度:29.97与30000/1001不相等。
3.混合的时间尺度:29.97fps视频和44.1kHz音频

OS中使用的时间: "工程目录结构" "工程目录结构" "工程目录结构"

音频混合:

1.临近的部分:AVCompostion;
2.合并音频轨迹:AVAudioMix;
3.合并视频轨迹:compositing;

音频混合对象:AVMutableAudioMixInputParameters –>AVMutableAudioMix
每一个音频混合输入参数:1.由一个音轨组成。2。描述了如何通过时间调整声音。
默认的声音不涉及混合。

视频复合:

1.临近的部分:AVComposition;
2.合并音频轨迹:AVAudioMix;
3.合并视频轨迹:AVVideoComposition;

AVComposition和AVVideoComposition "工程目录结构"

AVVideoComposition需要做的: 对于每一个时间范围的AVAsset:
1.创建一个对应时间范围的AVMutableVideoCompositionInstruction对象。
2.对于每一个轨迹,都是复合的一部分:为轨迹创建一个AVMutableVideoCompositionLayerInstruction对象。
3.明确指定透明度。明确指定开始与结束的矩阵转换。

音频VS视频
音频:1.对于每一个轨迹都是描述体积变化的时间范围。2.包含绝对的轨迹。
视频:1.对于每一个时间范围,在轨迹上描述指令组成信息。2.必须明确的包含轨迹

协调合并对象进行工作: AVAudioMix与AVVideoComposition:
1.他们都不是对象asset对象集合。
2.操作时使用对象Asset。
3.要使用行为时,将传递到控制对象。可以合并的控制对象有: "工程目录结构"

编辑要记住的:

1.composition是Asset的集合。他们由其他asset的segment对象组成。
2.他们通过轨迹进行音频混合。操作可能是不明显的。
3.视频Composition是一个合成的时间范围。它的操作要是显性的。

核心动画与媒体(Core animation and media)

1.所有的UIKit渲染都使用了核心动画。
2. 我们想对事物做的图形操作,如标题。
3.核心动画对于图形的渲染、投射和动画有极大的实用性。

核心动画与AV foundation
1. UIView使用CALayer 子类。
2. AVFoundation 提供CALayer子类:如,演示影片使用AVPlayerLayer。显示捕获的视频使用 AVCaptureVideoPreviewLayer。