面试题答案
一键面试主要类及方法
- AVAsset类:用于表示要处理的视频资源。
+assetWithURL:
方法可通过视频文件的URL创建AVAsset实例,如AVAsset *asset = [AVAsset assetWithURL:videoURL];
。
- AVAssetExportSession类:负责将处理后的视频数据导出为新的文件。
+exportSessionWithAsset:presetName:
用于创建导出会话实例,presetName
决定输出视频的质量预设,例如AVAssetExportPresetHighestQuality
。outputURL
设置导出视频的保存路径。outputFileType
设置导出视频的文件类型,如AVFileTypeMPEG4
。timeRange
设置要裁剪的时间范围。exportAsynchronouslyWithCompletionHandler:
异步执行导出操作,并在完成时执行指定的完成处理程序。
- CMTime类:表示时间,用于指定裁剪的起始和结束时间。
CMTimeMake
函数用于创建CMTime实例,第一个参数是时间值,第二个参数是时间尺度。例如,要表示10秒,可写为CMTime startTime = CMTimeMake(10 * timeScale, timeScale);
,其中timeScale
可通过asset.duration.timescale
获取。
实现步骤
- 创建AVAsset实例获取视频资源。
- 创建AVAssetExportSession实例,并设置输出路径、文件类型、质量预设等属性。
- 根据时间点A和B创建CMTime实例,设置AVAssetExportSession的
timeRange
属性。 - 调用
exportAsynchronouslyWithCompletionHandler:
方法执行导出操作,在完成处理程序中检查导出状态并处理结果。
可能遇到的难点及解决方案
- 时间尺度问题:不同视频的时间尺度可能不同,获取时间尺度并正确使用CMTimeMake创建时间实例很关键。通过
asset.duration.timescale
获取时间尺度,并一致应用于起始和结束时间的创建。 - 文件格式兼容性:某些输出文件格式可能不支持特定的视频编解码格式。确保选择的输出文件类型(
outputFileType
)与原始视频的编解码格式兼容,或在导出前进行转码操作。 - 内存管理:处理大视频文件时可能导致内存问题。异步导出(
exportAsynchronouslyWithCompletionHandler:
)有助于避免主线程阻塞,同时在导出完成后及时释放相关资源,如AVAsset和AVAssetExportSession实例。