AVFoundation – AVAssetExportSession 导出视频到沙盒目录

零基础 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


一.相关API简介


1.AVURLAsset

AVAsset 是 AVFoundation 框架中的核心的类,它提供了基于时间的音视频数据.(如电影文件,视频流),一个 asset 包含很多轨道的结合,如 audio , video , text , closed captions, subtitles …

AVAsset : 主要用于获取多媒体信息,是一个抽象类,不能直接使用。 

AVURLAsset : AVAsset 的子类,可以根据一个 URL 路径创建一个包含媒体信息的 AVURLAsset 对象;


2.AVAssetTrack

根据 AVAsset 获取 AVAssetTrack 检查视频是否自带旋转角度(比如相机拍摄的视频有可能带有旋转角度)

/******************************************************************************************/
//@Author:猿说编程
//@Blog(个人博客地址): www.codersrc.com
//@File:AVFoundation - AVAssetExportSession 导出视频到沙盒目录
//@Time:2021/08/08 07:30
//@Motto:不积跬步无以至千里,不积小流无以成江海,程序人生的精彩需要坚持不懈地积累!
/******************************************************************************************/ 


- (void)viewDidLoad
{
    [super viewDidLoad];
    self.view.backgroundColor = [UIColor redColor];
    
    //加载视频文件,检查是否有旋转角度
    NSURL* url = [NSURL fileURLWithPath:[[NSBundle mainBundle] pathForResource:@"123.mp4" ofType:nil]];
    AVURLAsset* asset = [[AVURLAsset alloc] initWithURL:url options:nil];
    NSLog(@"time:%f",CMTimeGetSeconds(asset.duration));
    NSLog(@"angle : %d",[self degressFromVideoFileWithURL:url]);
    
    //加载音频文件,检查是否有视频
    NSURL* url2 = [NSURL fileURLWithPath:[[NSBundle mainBundle] pathForResource:@"456.mp3" ofType:nil]];
    AVURLAsset* asset2 = [[AVURLAsset alloc] initWithURL:url options:nil];
    NSArray *videoTracks = [asset2 tracksWithMediaType:AVMediaTypeVideo]; // 检查是否有视频轨道
    NSArray *audioTracks = [asset2 tracksWithMediaType:AVMediaTypeAudio]; // 检查是否有音频轨道
    if([videoTracks count] > 0)
        NSLog(@"存在视频");
    if([audioTracks count] > 0)
        NSLog(@"存在音频");
}

-(NSUInteger)degressFromVideoFileWithURL:(NSURL *)url
{
    NSUInteger degress = 0;
    AVAsset *asset = [AVAsset assetWithURL:url];
    NSArray *tracks = [asset tracksWithMediaType:AVMediaTypeVideo]; // 检查是否有视频轨道
    if([tracks count] > 0) {
        AVAssetTrack *videoTrack = [tracks objectAtIndex:0];
        
        //获取视频轨道相关信息
        CGAffineTransform t = videoTrack.preferredTransform;
        if(t.a == 0 && t.b == 1.0 && t.c == -1.0 && t.d == 0){
            // Portrait
            degress = 90;
        }else if(t.a == 0 && t.b == -1.0 && t.c == 1.0 && t.d == 0){
            // PortraitUpsideDown
            degress = 270;
        }else if(t.a == 1.0 && t.b == 0 && t.c == 0 && t.d == 1.0){
            // LandscapeRight
            degress = 0;
        }else if(t.a == -1.0 && t.b == 0 && t.c == 0 && t.d == -1.0){
            // LandscapeLeft
            degress = 180;
        }
    }
    return degress;
}
/*
time:4249.883000
angle : 90
存在音频
*/

3.AVComposition/AVMutableComposition

AVFoundation 框架中提供了丰富的接口用于视听资源的编辑,其中的关键是 composition ,它将不同的 AVAsset 相结合并形成一个新的 AVAsset 。

使用 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 主要用于导出视频到本地;也是 AVFoundation 框架中非常重要的函数之一;


二.导出视频到沙盒实战

为了避免导出失败,解决方案是提取视频资源 AVURLAsset 音频轨道和视频轨道,重新构建 AVComposition ,然后在使用 AVAssetExportSession 导出,代码如下:

此处内容需要购买后查看,黄金会员可免费查看

支付19.9元查看


三.猜你喜欢


未经允许不得转载:猿说编程 » AVFoundation – AVAssetExportSession 导出视频到沙盒目录
喜欢(3) 打赏

评论抢沙发

评论前必须登录!

不积跬步无以至千里,不积小流无以成江海,程序人生的精彩需要坚持不懈地积累!!

开始学习

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

微信扫一扫打赏