前言

从本文开始逐渐学习iOS自带的多媒体处理框架,例如AVFoundation,VideoToolbox,CoreMedia,CoreVideo实现多媒体的处理,并且将实现方式以及效果和ffmpeg的方式做对比

截取一个音视频文件中的某个时间段的音视频然后保存是很常见的需求,AVFoundation就提供了这样的接口,它其实也是利用AVMutableComposition来实现的

本文的目的:
截取一个音视频文件中的某个时间段的音视频然后保存到本地

音视频截取相关流程

image.png

上图介绍了AVFoundation框架中关于音视频截取的相关的对象关系图,可以看到使用AVFoundation截取音视频中某一段还是相对比较简单的。

相关对象及函数介绍

  • 1、AVURLAsset
    容器对象,代表了要操作的容器。封装,解封装,音视频播放,以及音视频合并等等操作的基础都涉及到这个对象。

  • 2、AVAssetTrack
    音视频轨道对象,代表了文件中的一路音频流或者一路视频流,它作为每一个要被合并的音频或者视频流被添加到组合对象中最终进行合并

  • 3、AVMutableCompositionTrack
    组合轨道对象,它作为音视频合并的基础,通过它添加要合并的音频流或者视频流,分为两种类型:音频组合轨道对象和视频组合轨道对象,音频组合轨道对象只能添加音频流,视频组合轨道对象只能添加视频流
    通过此对象定义要截取的时间段即可实现音视频内容的截取

  • 4、AVMutableComposition
    组合对象,通过它构建组合轨道对象

  • 5、AVAssetExportSession
    执行合并操作并导出为文件对象,该对象内部应该是封装了合并多个音频流或者视频流的操作和封装操作

实现代码

这里例子中为截取源音视频中中5-15秒的内容然后保存为MP4

#import <Foundation/Foundation.h>@interface AVVideoCut : NSObject/** 实现功能:截取音视频文件中指定范围段的内容*/
- (void)cutVideo:(NSURL*)srcURL dst:(NSURL*)dstURL;
@end
#import "AVVideoCut.h"
#import <AVFoundation/AVFoundation.h>@implementation AVVideoCut
{dispatch_semaphore_t processSemaphore;
}- (void)cutVideo:(NSURL*)srcURL dst:(NSURL*)dstURL
{processSemaphore = dispatch_semaphore_create(0);AVURLAsset *asset = [[AVURLAsset alloc] initWithURL:srcURL options:nil];[asset loadValuesAsynchronouslyForKeys:@[@"tracks"] completionHandler:^{NSError *error = nil;AVKeyValueStatus status = [asset statusOfValueForKey:@"tracks" error:&error];if (status != AVKeyValueStatusLoaded) {NSLog(@"loaded error %@",error);return;}[self processAsset:asset dst:dstURL];}];dispatch_semaphore_wait(processSemaphore, DISPATCH_TIME_FOREVER);NSLog(@"结束了");
}- (void)processAsset:(AVAsset*)asset dst:(NSURL*)dstURL
{// 获取容器中的音视频轨道对象NSArray *videotracks = [asset tracksWithMediaType:AVMediaTypeVideo];NSArray *audiotracks = [asset tracksWithMediaType:AVMediaTypeAudio];AVAssetTrack *videoTrack = videotracks?videotracks[0]:nil;AVAssetTrack *audioTrack = audiotracks?audiotracks[0]:nil;// 划定要截取的时间;这里选择的时间为5-15秒的视频CMTime start = CMTimeMake(5*1000, 1000);CMTime time = CMTimeMake(10*1000, 1000);CMTimeRange range = CMTimeRangeMake(start, time);// 创建组合对象AVMutableComposition *compostion = [AVMutableComposition composition];if (audioTrack) {// 添加组合音频轨道AVMutableCompositionTrack *audiocomtrack = [compostion addMutableTrackWithMediaType:AVMediaTypeAudio preferredTrackID:kCMPersistentTrackID_Invalid];NSError *error = nil;// 在音频轨道中选取指定的时间范围的音频插入到组合音频轨道中[audiocomtrack insertTimeRange:range ofTrack:audioTrack atTime:kCMTimeZero error:&error];}if (videoTrack) {AVMutableCompositionTrack *videocomtrack = [compostion addMutableTrackWithMediaType:AVMediaTypeVideo preferredTrackID:kCMPersistentTrackID_Invalid];NSError *error = nil;[videocomtrack insertTimeRange:range ofTrack:videoTrack atTime:kCMTimeZero error:&error];}// 执行合并if ([[NSFileManager defaultManager] fileExistsAtPath:dstURL.path]) {[[NSFileManager defaultManager] removeItemAtURL:dstURL error:nil];}// 执行组合对象中组合轨道的编辑任务AVAssetExportSession *extSession = [[AVAssetExportSession alloc] initWithAsset:compostion presetName:AVAssetExportPresetHighestQuality];extSession.outputURL = dstURL;extSession.outputFileType = AVFileTypeMPEG4;NSLog(@"开始编辑");[extSession exportAsynchronouslyWithCompletionHandler:^{if (extSession.status != AVAssetExportSessionStatusCompleted) {NSLog(@"编辑 error %@",extSession.error);}NSLog(@"编辑完毕");dispatch_semaphore_signal(self->processSemaphore);}];
}
@end

项目地址

https://github.com/nldzsz/ffmpeg-demo

位于AVFoundation目录下文件AVVideoCut.h/AVVideoCut.m中

AVFoundation音视频精准截取(九)相关推荐

  1. Android音视频学习系列(九) — Android端实现rtmp推流

    系列文章 Android音视频学习系列(一) - JNI从入门到精通 Android音视频学习系列(二) - 交叉编译动态库.静态库的入门 Android音视频学习系列(三) - Shell脚本入门 ...

  2. ffmpeg-音视频精准截取

    前言 有时会碰到这样的需求场景,对一个视频中的某一段感兴趣,想要精确的截取这一段视频以及对应的音频.例如,有一个25fps的MP4的文件,时长20秒,我想要截取从5秒开始到15秒结束的视频以及对应的音 ...

  3. 抖音视频片段截取的简单方法

    手机视频片段截取的简单方法,首先在手机上安装并启动"王者剪辑app",进入一键剪辑中的"时长剪切"功能, 导入需要剪切的视频, 接着选择需要剪切的时长片段,然后 ...

  4. ffmpeg sdk 视频合成 音视频截取

    还是给自己 学习啊 大部分是 命令 或是android的~~  这边得用原生的 我也是刚学 到底什么区别也不太知道~~ 还请大神指点一二 需求场景1(视频中提取照片): 各大网站在线播放视频时,鼠标滑 ...

  5. 实时音视频聊天中超低延迟架构的思考与技术实践

    1.前言 从直播在线上抓娃娃,不断变化的是玩法的创新,始终不变的是对超低延迟的苛求.实时架构是超低延迟的基石,如何在信源编码.信道编码和实时传输整个链条来构建实时架构?在实时架构的基础之上,如果通过优 ...

  6. 实时音视频开发理论必备:如何省流量?视频高度压缩背后的预测技术

    本文引用了"拍乐云Pano"的"深入浅出理解视频编解码技术"和"揭秘视频千倍压缩背后的技术原理之本文引用了"拍乐云Pano"的&q ...

  7. 即时通讯音视频开发(0):零基础,史上最通俗视频编码技术入门

    [来源申明]本文引用了微信公众号"鲜枣课堂"的<视频编码零基础入门>文章内容.为了更好的内容呈现,即时通讯网在引用和收录时内容有改动,转载时请注明原文来源信息,尊重原作 ...

  8. Android音视频学习系列(六) — 掌握视频基础知识并使用OpenGL ES 2.0渲染YUV数据

    系列文章 Android音视频学习系列(一) - JNI从入门到精通 Android音视频学习系列(二) - 交叉编译动态库.静态库的入门 Android音视频学习系列(三) - Shell脚本入门 ...

  9. Android音视频学习系列(十) — 基于FFmpeg + OpenSL ES实现音频万能播放器

    系列文章 Android音视频学习系列(一) - JNI从入门到精通 Android音视频学习系列(二) - 交叉编译动态库.静态库的入门 Android音视频学习系列(三) - Shell脚本入门 ...

最新文章

  1. 【经验分享】鹅厂机器学习岗暑期实习面经总结
  2. date样式找不到_涡轮+国VI排放,顶配售价不到12万,家用轿车看它准没错
  3. python celery异步_【Python】Celery异步处理
  4. 转载:React Fiber架构(浅显易懂)
  5. android recyclerview 横向item 宽度,RecyclerView的item宽度不能全屏显示及线性布局与grid布局切换混乱解决方法...
  6. SIEM部署失败的五大原因
  7. 网络爬虫中的模拟登陆获取数据(实例教学1)
  8. Day4:html和css
  9. wait(), notify(), notifyAll()等方法介绍
  10. 虚拟化技术-KVM详解
  11. python 使用ThreadPool 创建线程,后台执行并check
  12. OpenCASCADE6.8.0 Reference Manual Serach Problem
  13. 彼得林奇PEG价值选股策略(附源码入口)
  14. 利用云服务器搭配宝塔面板解禁网易云
  15. L18-python语法基础-数据类型的基本操作(d5)
  16. 阿里一p7员工为了证明自己确实年入百万,晒出了他的工资
  17. 2018 ISCC re\web\misc WP
  18. 故障检测、故障识别领域(分类问题)的性能评价指标
  19. Android Studio 基础控件飘红 处理办法
  20. 中国人保为嘉德奥通承保产品责任险,为消费者保驾护航!

热门文章

  1. Zeppelin的使用
  2. 无码系列5.1 代码重构 消除重复代码
  3. zabbix——分布式监控系统
  4. python设计拼图小游戏_关于python:教你用Python自制拼图小游戏轻松搞定熊孩子
  5. 济南某外包公司java开发面试题整理
  6. UT-Exynos4412开发板三星ARM四核旗舰开发平台android4.0体验-12音频输入输出功能调试
  7. Avazu_ctr_prediction 数据集之Avazu_x4.zip介绍
  8. LFS : 制作分区和挂载分区
  9. GPS授时服务器在电厂视频监控系统中的应用
  10. 大学毕业小总结以及感想