我在这里再次寻求AVFoundation的帮助。对不起我不完美的英语。
我现在正在编写视频编辑器。首先,我从库加载视频并将其放到AVAsset实例。然后,每当用户选择一些视频区域并在那里设置速度参数时,我会这样做:
AVMutableComposition *mixComposition = [[AVMutableComposition alloc] init];
AVMutableCompositionTrack *track = [mixComposition addMutableTrackWithMediaType:AVMediaTypeVideo
preferredTrackID:kCMPersistentTrackID_Invalid];
[track insertTimeRange:CMTimeRangeMake(kCMTimeZero, CMTimeMakeWithSeconds(startOfEditedFrame, 600))
ofTrack:[self.videoAsset tracksWithMediaType:AVMediaTypeVideo][0] atTime:mixComposition.duration error:&error];
[track insertTimeRange:CMTimeRangeFromTimeToTime(CMTimeMakeWithSeconds(startOfEditedFrame, 600), CMTimeMakeWithSeconds(endOfEditedFrame, 600))
ofTrack:[self.videoAsset tracksWithMediaType:AVMediaTypeVideo][0] atTime:mixComposition.duration error:nil];
[track scaleTimeRange:CMTimeRangeFromTimeToTime(CMTimeMakeWithSeconds(startOfEditedFrame, 600), CMTimeMakeWithSeconds(endOfEditedFrame, 600))
toDuration:CMTimeMultiplyByFloat64(CMTimeMakeWithSeconds(endOfEditedFrame - startOfEditedFrame, 600), 1/[self.speeds[self.currentFrameStartIndex] floatValue])];
[track insertTimeRange:CMTimeRangeFromTimeToTime(CMTimeMakeWithSeconds(endOfEditedFrame, 600), self.videoAsset.duration)
ofTrack:[self.videoAsset tracksWithMediaType:AVMediaTypeVideo][0] atTime:mixComposition.duration error:nil];
self.videoAsset = mixComposition;
第一次工作正常,但第二次我有" insertTimeRange"错误和组成的零持续时间。如果您有任何想法,请告诉我这里有什么问题或任何建议如何以不同/更正确的方式做到这一点。
答案 0 :(得分:1)
看起来我已经找到了解决这个问题的方法。你不能像你一直想的那样多次编辑AVMutableComposition。
它第一次运行正常,因为它现在是你用url(任何url)创建的AVAsset。所以在你第一次进行编辑之后,资产会改变它的形式。它的名字仍然是< b> AVAsset 但现在它是 AVMutableComposition 。因此,您需要使用新的URL导出合成,然后使用该URL创建一个新的AVAsset,然后在该资产上执行此代码肯定会有用。
阐述理由:
以下是一些建议,可以帮助您理解每一点。
1.当您尝试多次编辑资产而不导出时
这是第一次对其进行编辑时资产的样子。
<AVURLAsset: 0x7ff6404736c0, URL = file:///Users/puneetgurtoo/Library/Developer/CoreSimulator/Devices/8CC36C99-62B4-47F4-82BB-205DFE93FD96/data/Containers/Data/Application/26EFAB87-EA98-47DD-B7D9-A28CEE0DA043/Documents/28DBF785-58A4-4F3D-9AF0-77E300D89658-1595-000008AB6974EF7A.mov>
但是当你对它进行了编辑操作之后,它会变成这样:
AVMutableComposition: 0x7ff640403e50 tracks = (
"<AVMutableCompositionTrack: 0x7ff64046bb90 trackID = 1, mediaType = vide, editCount = 1>",
"<AVMutableCompositionTrack: 0x7ff64046c490 trackID = 2, mediaType = soun, editCount = 1>"
)>
这就是问题发生的地方。
2.因此,当您使用newURL导出AVMutableComposition时,只需使用该URL创建一个新的AVAsset实例,问题就会解决。
我将在今天晚些时候发布相同演示版本的链接。然后你可以通过这个概念。
答案 1 :(得分:0)
我可以给你的一个指针是查看AVMutableComposition的头文件。
insertTimeRange方法的注释讨论了tracks参数:
&#34;指定包含要插入的曲目的资源。仅支持AVURLAsset实例。&#34;
因此,您从曲目插入的曲目必须是&#34; AVURLAsset&#34; class和这个类。
希望这会有所帮助。