九.音视频编辑 - 视频截取

引言

视频截取中的UI小组件-CSDN博客

在之前的博客中,我们已经实现了一个简单易用的视频截取UI组件。本篇博客将带领大家使用这个组件来构建一个完整的视频截取功能模块。除了视频截取外,这个模块还涉及到视频播放和视频缩略图的获取等功能。由于我们在之前的音视频系列博客中已经详细介绍过这些内容,因此这里我们不再赘述,而是将全部焦点集中在视频截取功能的实现上。

视频截取

在视频截取中,首先我们需要导入AVFoundation框架。前面已经提到,该框架为开发者提供了强大的音视频播放和编辑功能。在视频截取过程中,我们主要使用AVAsset来加载视频媒体资源,并利用AVAssetExportSesstion将新的视频资源导出。此外,处理时间也是一个重要方面。在AVFoundation中,为了更精确地描述时间,我们使用CMTime和CMTimeRange结构体来表示时间和时间段。

准备工作

在开始实现视频截取之前,我们需要确保环境设置正确并进行一些准备工作。首先确保项目已经引入了AVFoundation框架:

import AVFoundation

接下来,我们需要获取带截取的视频文件的URL。这可以是本地的文件路径也可以是网络视频的URL。例如,若是是从本地文件中获取:

let videoURL = Bundle.main.url(forResource: "videoFileName", withExtension: "mp4")!

获取到视频之后我们需要定义视频截取的开始时间及市场,定义截取的范围:

let startTime = CMTime(seconds: 10, preferredTimescale: 600)
let duration = CMTime(seconds: 5, preferredTimescale: 600)
let timeRange = CMTimeRange(start: startTime, duration: duration)

代码中定义从1分钟处开始截取,截取时长为2分钟。

还需要定义好视频导出后的输出位置,我们在document下创建一个视频文件,并通过UUID()生成唯一的文件名,避免资源覆盖:

func generateOutputURL() -> URL? {
    let fileManager = FileManager.default
    let documentsDirectory = fileManager.urls(for: .documentDirectory, in: .userDomainMask).first
    
    let outputFileName = "outputVideo-\(UUID().uuidString).mp4"
    let outputURL = documentsDirectory?.appendingPathComponent(outputFileName)
    
    // 确保不存在同名文件
    if let url = outputURL, fileManager.fileExists(atPath: url.path) {
        try? fileManager.removeItem(at: url)
    }
    
    return outputURL
}

开始截取

接下来我们使用AVAssetExportSession类直接导出截取后的视频,传入媒体资源,并指定导出文件质量级别,视频格式,视频输出地址,以及视频的时间范围:

guard let exportSession = AVAssetExportSession(asset: asset, presetName: AVAssetExportPresetHighestQuality) else { return }
exportSession.timeRange = timeRange
exportSession.outputURL = outputURL
exportSession.outputFileType = .mp4

exportSession.exportAsynchronously {
    switch exportSession.status {
    case .completed:
        print("Video截取完成")
    case .failed:
        print("截取失败: \(String(describing: exportSession.error))")
    default:
        break
    }
}

这个过程就可以帮助我们截取指定时间短的视频,我们还可以配合上一篇的截取视频UI来随意调整视频的截取范围,以及通过AVAssetImageGenerator来获取视频的预览图片,来丰富它的功能。

结语

通过本文的介绍,我们探索了如何使用AVFoundation框架实现视频截取。掌握了使用AVAsset加载视频、定义时间范围以及导出新视频的基本步骤后,你可以轻松地在自己的应用中添加这一功能。视频截取不仅可以提升用户体验,还能为用户创造更多分享和创造的可能性。希望这篇博客能够帮助你在音视频编辑的旅程中迈出坚实的一步,也希望大家能够进一步探索AVFoundation的强大功能!

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值