零基础 Object-C 学习路线推荐 : Object-C 学习目录 >> Object-C 基础
零基础 Object-C 学习路线推荐 : Object-C 学习目录 >> Object-C 线程
零基础 Object-C 学习路线推荐 : Object-C 学习目录 >> OpenGL ES
零基础 Object-C 学习路线推荐 : Object-C 学习目录 >> GPUImage
零基础 Object-C 学习路线推荐 : Object-C 学习目录 >> AVFoundation
零基础 Object-C 学习路线推荐 : Object-C 学习目录 >> CocoaPods
一.前言
1.AVAsset
Assets 可以来自一个文件或用户的相册,可以理解为多媒体资源,通过 URL 作为一个 asset 对象的标识. 这个 URL 可以是本地文件路径或网络流;
2.AVAssetTrack
AVAsset 包含很多轨道 AVAssetTrack 的结合,如 audio, video, text, closed captions, subtitles…
3.AVComposition / AVMutableComposition
使用 AVMutableComposition 类可以增删 AVAsset 来将单个或者多个 AVAsset 集合到一起,用来合成新视频。除此之外,若想将集合到一起的视听资源以自定义的方式进行播放,需要使用 AVMutableAudioMix 和 AVMutableVideoComposition 类对其中的资源进行协调管理;
4.AVMutableVideoComposition
AVFoundation 类 API 中最核心的类是 AVVideoComposition / AVMutableVideoComposition 。
AVVideoComposition / AVMutableVideoComposition 对两个或多个视频轨道组合在一起的方法给出了一个总体描述。它由一组时间范围和描述组合行为的介绍内容组成。这些信息出现在组合资源内的任意时间点。
AVVideoComposition / AVMutableVideoComposition 管理所有视频轨道,可以决定最终视频的尺寸,裁剪需要在这里进行;
5.AVMutableCompositionTrack
将多个 AVAsset 集合到一起合成新视频中轨道信息,有音频轨、视频轨等,里面可以插入各种对应的素材(画中画,水印等);
6.AVMutableVideoCompositionLayerInstruction
AVMutableVideoCompositionLayerInstruction 主要用于对视频轨道中的一个视频处理缩放、模糊、裁剪、旋转等;
7.AVMutableVideoCompositionInstruction
表示一个指令,决定一个 timeRange 内每个轨道的状态,每一个指令包含多个 AVMutableVideoCompositionLayerInstruction ;而 AVVideoComposition 由多个 AVVideoCompositionInstruction 构成;
AVVideoCompositionInstruction 所提供的最关键的一段数据是组合对象时间轴内的时间范围信息。这一时间范围是在某一组合形式出现时的时间范围。要执行的组全特质是通过其 AVMutableVideoCompositionLayerInstruction 集合定义的。
8.AVAssetExportSession
AVAssetExportSession 主要用于导出视频;
二.AVPlayer 简介
首先在 iOS 平台使用播放视频,可用的选项一般有这四个,他们各自的作用和功能如下:
由此可以看出,如果我们不做直播功能 AVPlayer 就是一个最优的选择。在创建一个播放器之前我们需要先了解一些播放器相关的类
1.AVPlayer
AVPlayer 控制播放器的播放,暂停,播放速度;
/*创建AVPlayer播放器*/
+ (instancetype)playerWithURL:(NSURL *)URL;
+ (instancetype)playerWithPlayerItem:(nullable AVPlayerItem *)item;
- (instancetype)initWithURL:(NSURL *)URL;
- (instancetype)initWithPlayerItem:(nullable AVPlayerItem *)item;
/*当前播放器播放的时间*/
- (CMTime)currentTime;
/*播放速度
rate = 0.5; // 慢放
rate = 1.0; // 正常播放
rate = 0.0; // 暂停
rate = -0.5; // 倒放
*/
@property (nonatomic) float rate;
/*播放 默认 rate = 1.0*/
- (void)play;
/*暂停播放 rate = 0.0*/
- (void)pause;
注意更改播放速度要在视频开始播放之后才会生效;
2.AVURLAsset
前面文章有对 AVAsset 介绍,AVURLAsset 是 AVAsset 的一个子类,使用 URL 进行实例化,实例化对象包换 URL 对应视频资源的所有信息;
NSURL *url = <#A URL that identifies an audiovisual asset such as a movie file#>;
AVURLAsset *anAsset = [[AVURLAsset alloc] initWithURL:url options:nil];
注意 NSURL 的使用:
[NSURL URLWithString:@"网络路径"]
[NSURL fileURLWithPath:@"本地路径"]
如果读取的是本地文件,那么请用第二个方法,第一个会出错,读取不到URL.
3.AVPlayerItem
AVPlayerItem 管理资源对象,提供播放数据源;
4.AVPlayerLayer
AVPlayerLayer 负责显示视频,如果没有添加该类,只有声音没有画面;
三.AVPlayerLayer简介
AVPlayerLayer 构建于 Core Animation 之上,是 AVFoundation 中位数不多的可见组件。AVPlayerLayer 扩展了 Core Animation 的 CALayer 类,通过框架在屏幕上显示视频内容。
AVPlayerLayer 可以通过 videoGravity 设置视频的拉伸或者缩放,简单说明如下:
AVLayerVideoGravityResizeAspect – 在承载层范围内缩放视频大小来保持视频原始宽高比,默认值,适用于大部分情况;
AVLayerVideoGravityResizeAspectFill – 保留视频宽高比,通过缩放填满层的范围区域,会导致视频图片被部分裁剪;
AVLayerVideoGravityResize – 拉伸视频内容拼配承载层的范围,会导致图片扭曲,funhouse effect效应;
1.AVLayerVideoGravityResizeAspect
2.AVLayerVideoGravityResizeAspectFill
3.AVLayerVideoGravityResize
四.完整的播放器demo
完整的播放器 demo ,请参考《AVPlayerItem》有详细介绍;
/******************************************************************************************/
//@Author:猿说编程
//@Blog(个人博客地址): www.codersrc.com
//@File:AVFoundation - AVPlayerLayer 显示视频
//@Time:2021/08/05 07:30
//@Motto:不积跬步无以至千里,不积小流无以成江海,程序人生的精彩需要坚持不懈地积累!
/******************************************************************************************/
#import "ViewController.h"
#import <AVFoundation/AVFoundation.h>
@interface ViewController ()
{
AVPlayerItem* _item ; //用于加载媒体
AVPlayer* _player; //控制播放器的播放,暂停,播放速度
AVPlayerLayer* _playerLayer; //用于显示画面
float _duration; //媒体的时间
}
@end
@implementation ViewController
#pragma mark - create UISlider
- (UISlider*)createSlider {
/// 创建Slider 设置Frame
UISlider *slider = [[UISlider alloc] initWithFrame:CGRectMake(0, 100, 247, 50)];
/// 属性配置
// minimumValue : 当值可以改变时,滑块可以滑动到最小位置的值,默认为0.0
slider.minimumValue = 0.0;
// maximumValue : 当值可以改变时,滑块可以滑动到最大位置的值,默认为1.0
slider.maximumValue = 1.0;
// 当前值,这个值是介于滑块的最大值和最小值之间的,如果没有设置边界值,默认为0-1;
slider.value = 0;
// continuous : 如果设置YES,在拖动滑块的任何时候,滑块的值都会改变。默认设置为YES
[slider setContinuous:YES];
// minimumTrackTintColor : 小于滑块当前值滑块条的颜色,默认为蓝色
slider.minimumTrackTintColor = [UIColor redColor];
// maximumTrackTintColor: 大于滑块当前值滑块条的颜色,默认为白色
slider.maximumTrackTintColor = [UIColor blueColor];
// thumbTintColor : 当前滑块的颜色,默认为白色
slider.thumbTintColor = [UIColor yellowColor];
// minimumTrackTintColor : 小于滑块当前值滑块条的颜色,默认为蓝色
slider.minimumTrackTintColor = [UIColor redColor];
// maximumTrackTintColor: 大于滑块当前值滑块条的颜色,默认为白色
slider.maximumTrackTintColor = [UIColor blueColor];
// thumbTintColor : 当前滑块的颜色,默认为白色
slider.thumbTintColor = [UIColor yellowColor];
return slider;
}
#pragma mark - seek
- (void)_sliderValueDidChanged:(id)sender {
UISlider *slider = (UISlider*)sender;
NSLog(@"slider:%f _player.currentTime:%f",slider.value,CMTimeGetSeconds(_player.currentTime));
//seek
[_player seekToTime:CMTimeMake(slider.value*_duration*60, 60) toleranceBefore:CMTimeMake(1, 1000) toleranceAfter:CMTimeMake(1, 1000)];
//play
[_player play];
;
}
- (void)viewDidLoad
{
[super viewDidLoad];
//创建滑块
UISlider *slider = [self createSlider];
// 事件监听
[slider addTarget:self action:@selector(_sliderValueDidChanged:) forControlEvents:UIControlEventValueChanged];
[self.view addSubview:slider];
//创建label用于显示时间
UILabel* label = [[UILabel alloc] initWithFrame:CGRectMake(0, 0, 100, 100)];
[self.view addSubview:label];
//创建一个资源实例
NSURL* url = [NSURL fileURLWithPath:[[NSBundle mainBundle] pathForResource:@"123.mp4" ofType:nil]];
AVURLAsset* asset = [[AVURLAsset alloc] initWithURL:url options:nil];
//获取总时间
_duration = CMTimeGetSeconds(asset.duration);
//AVPlayerItem关联播放资源
_item = [[AVPlayerItem alloc] initWithAsset:asset];
//添加观察者,对该状态进行监控,以决定何时可以进行播放
[_item addObserver:self forKeyPath:@"status" options:NSKeyValueObservingOptionNew context:nil];
//监听播放结束通知
[[NSNotificationCenter defaultCenter] addObserver:self
selector:@selector(playFinishNotification:) name:AVPlayerItemDidPlayToEndTimeNotification object:_item];
//创建AVPlayer
_player = [AVPlayer playerWithPlayerItem:_item];
//每隔1秒在主队列中触发block回调,刷新滑块,显示时间
[_player addPeriodicTimeObserverForInterval:CMTimeMake(1, 1) queue:dispatch_get_main_queue() usingBlock:^(CMTime time) {
float currentTime = CMTimeGetSeconds(time); //当前时间,以秒为单位
slider.value = currentTime/_duration; //当前时间百分比
label.text = [NSString stringWithFormat:@"%.0f:%.0f",currentTime,_duration];//显示当前时间,秒为单位
}];
//设置边界时间
NSValue* value1 = [NSValue valueWithCMTime:CMTimeMake(10, 1)]; //第10秒
NSValue* value2 = [NSValue valueWithCMTime:CMTimeMake(20, 1)]; //第20秒
NSArray* times = [NSArray arrayWithObjects:value1, value2, nil];
//当播放器播放到边界时间,会自动触发black回调
[_player addBoundaryTimeObserverForTimes:times queue:dispatch_get_main_queue() usingBlock:^{
NSLog(@"边界时间:%@ 播放器当前时间:%f",times,CMTimeGetSeconds(_player.currentTime) );
}];
//创建AVPlayerLayer用来显示资源内容
_playerLayer = [AVPlayerLayer playerLayerWithPlayer:_player];
//设置frame
_playerLayer.frame = self.view.frame;
//添加到当前的view,否则无法显示
[self.view.layer addSublayer:_playerLayer];
}
- (void)playFinishNotification:(NSNotification *)notification {
//播放结束,并seek到文件开始位置
[_player seekToTime:kCMTimeZero completionHandler:^(BOOL finished) {
NSLog(@"播放结束啦....");
}];
}
- (void)observeValueForKeyPath:(NSString *)keyPath ofObject:(id)object change:(NSDictionary<NSKeyValueChangeKey,id> *)change context:(void *)context {
if ([object isKindOfClass:[AVPlayerItem class]]) {
if([keyPath isEqualToString:@"status"])
{
switch(_item.status)
{
case AVPlayerItemStatusReadyToPlay:
[_player play];
NSLog(@"AVPlayerItemStatusReadyToPlay");
break;
case AVPlayerItemStatusUnknown:
NSLog(@"AVPlayerItemStatusUnknown");
break;
case AVPlayerItemStatusFailed:
NSLog(@"AVPlayerItemStatusFailed");
break;
default:break;
}
}
}
}
- (void)dealloc
{
//删除观察者
[self removeObserver:self forKeyPath:@"status"];
//删除监听
[[NSNotificationCenter defaultCenter] removeObserver:self];
}
@end
/*
2021-07-31 11:29:41.023583+0800 LearnAVFoundation[2411:143670] AVPlayerItemStatusReadyToPlay
2021-07-31 11:29:51.108482+0800 LearnAVFoundation[2411:143670] 边界时间:(
"CMTime: {10/1 = 10.000}",
"CMTime: {20/1 = 20.000}"
) 播放器当前时间:10.001048
2021-07-31 11:30:01.107947+0800 LearnAVFoundation[2411:143670] 边界时间:(
"CMTime: {10/1 = 10.000}",
"CMTime: {20/1 = 20.000}"
) 播放器当前时间:20.000597
*/
五.猜你喜欢
- AVAsset 加载媒体
- AVAssetTrack 获取视频 音频信息
- AVMetadataItem 获取媒体属性元数据
- AVAssetImageGenerator 截图
- AVAssetImageGenerator 获取多帧图片
- AVAssetExportSession 裁剪/转码
- AVPlayer 播放视频
- AVPlayerItem 管理资源对象
- AVPlayerLayer 显示视频
- AVQueuePlayer 播放多个媒体文件
- AVComposition AVMutableComposition 将多个媒体合并
- AVVideoComposition AVMutableVideoComposition 管理所有视频轨道
ChatGPT 3.5 国内中文镜像站免费使用啦
暂无评论内容