如何多次编辑AVMutableComposition

时间:2014-02-05 21:37:04

标签: avfoundation avmutablecomposition avasset

我在这里再次寻求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"错误和组成的零持续时间。如果您有任何想法,请告诉我这里有什么问题或任何建议如何以不同/更正确的方式做到这一点。

2 个答案:

答案 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和这个类。

希望这会有所帮助。