使用 AVMutableCompositionTrack 而不是 AVVideoCompositionCoreAnimationTool 在 AVMutableComposition 中合并视频和图像?
Merge videos & images in AVMutableComposition using AVMutableCompositionTrack, not AVVideoCompositionCoreAnimationTool?
下面的代码使用 AVMutableComposition
导出视频。但是在导出的视频中,如果你想让一个图像在源视频结束后显示 3 秒,有没有办法用 AVMutableCompositionTrack
来做到这一点,或者你是否需要添加一个图像层并在结束后为其外观设置动画视频结束了吗?
最终,目标是将任意数量的图像和视频合并到一个主视频中。
不幸的是,在测试期间似乎 AVVideoCompositionCoreAnimationTool
严重减慢了导出过程(从 < 1 秒到 10-20 秒),因此我们的目标是尽可能避免 AVVideoCompositionCoreAnimationTool
。
// Create composition object
let composition = AVMutableComposition()
let compositionVideoTrack = composition.addMutableTrackWithMediaType(AVMediaTypeVideo, preferredTrackID: CMPersistentTrackID(kCMPersistentTrackID_Invalid))
let compositionAudioTrack = composition.addMutableTrackWithMediaType(AVMediaTypeAudio, preferredTrackID: CMPersistentTrackID(kCMPersistentTrackID_Invalid))
var insertTime = kCMTimeZero
// Extract tracks from slice video
let videoURL = NSURL(fileURLWithPath: videoPath)
let videoAsset = AVURLAsset(URL: videoURL, options: nil)
let sourceVideoTrack = videoAsset.tracksWithMediaType(AVMediaTypeVideo)[0]
let sourceAudioTrack = videoAsset.tracksWithMediaType(AVMediaTypeAudio)[0]
do {
try compositionVideoTrack.insertTimeRange(CMTimeRangeMake(kCMTimeZero, videoAsset.duration), ofTrack: sourceVideoTrack, atTime: kCMTimeZero)
try compositionAudioTrack.insertTimeRange(CMTimeRangeMake(kCMTimeZero, videoAsset.duration), ofTrack: sourceAudioTrack, atTime: kCMTimeZero)
} catch {
print("Error with insertTimeRange while exporting video: \(error)")
}
// Export composition to video
let outputURL = getFilePath(getUniqueFilename(gMP4File))
let exporter = AVAssetExportSession(asset: composition, presetName: AVAssetExportPresetHighestQuality)
exporter!.outputURL = NSURL(fileURLWithPath: outputURL)
exporter!.outputFileType = AVFileTypeMPEG4
exporter!.exportAsynchronouslyWithCompletionHandler({
self.exportDidFinish(exporter!)
})
在就 SO 咨询其他人并进行更多网络研究后,这似乎是不可能的。将带有视频的图像合并到可在应用程序外播放的主视频中似乎需要 AVVideoCompositionCoreAnimationTool。
下面的代码使用 AVMutableComposition
导出视频。但是在导出的视频中,如果你想让一个图像在源视频结束后显示 3 秒,有没有办法用 AVMutableCompositionTrack
来做到这一点,或者你是否需要添加一个图像层并在结束后为其外观设置动画视频结束了吗?
最终,目标是将任意数量的图像和视频合并到一个主视频中。
不幸的是,在测试期间似乎 AVVideoCompositionCoreAnimationTool
严重减慢了导出过程(从 < 1 秒到 10-20 秒),因此我们的目标是尽可能避免 AVVideoCompositionCoreAnimationTool
。
// Create composition object
let composition = AVMutableComposition()
let compositionVideoTrack = composition.addMutableTrackWithMediaType(AVMediaTypeVideo, preferredTrackID: CMPersistentTrackID(kCMPersistentTrackID_Invalid))
let compositionAudioTrack = composition.addMutableTrackWithMediaType(AVMediaTypeAudio, preferredTrackID: CMPersistentTrackID(kCMPersistentTrackID_Invalid))
var insertTime = kCMTimeZero
// Extract tracks from slice video
let videoURL = NSURL(fileURLWithPath: videoPath)
let videoAsset = AVURLAsset(URL: videoURL, options: nil)
let sourceVideoTrack = videoAsset.tracksWithMediaType(AVMediaTypeVideo)[0]
let sourceAudioTrack = videoAsset.tracksWithMediaType(AVMediaTypeAudio)[0]
do {
try compositionVideoTrack.insertTimeRange(CMTimeRangeMake(kCMTimeZero, videoAsset.duration), ofTrack: sourceVideoTrack, atTime: kCMTimeZero)
try compositionAudioTrack.insertTimeRange(CMTimeRangeMake(kCMTimeZero, videoAsset.duration), ofTrack: sourceAudioTrack, atTime: kCMTimeZero)
} catch {
print("Error with insertTimeRange while exporting video: \(error)")
}
// Export composition to video
let outputURL = getFilePath(getUniqueFilename(gMP4File))
let exporter = AVAssetExportSession(asset: composition, presetName: AVAssetExportPresetHighestQuality)
exporter!.outputURL = NSURL(fileURLWithPath: outputURL)
exporter!.outputFileType = AVFileTypeMPEG4
exporter!.exportAsynchronouslyWithCompletionHandler({
self.exportDidFinish(exporter!)
})
在就 SO 咨询其他人并进行更多网络研究后,这似乎是不可能的。将带有视频的图像合并到可在应用程序外播放的主视频中似乎需要 AVVideoCompositionCoreAnimationTool。