1

我再次在这里寻求 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”错误和零持续时间。请让我知道您是否有任何想法这里出了什么问题或有任何建议如何以不同/更正确的方式进行操作。

4

2 回答 2

1

看起来我有一个解决这个问题的方法。你不能像你一直在尝试的那样多次编辑 AVMutableComposition。

它第一次可以正常工作,因为现在它是您从 url(任何 url)制作的 AVAsset。因此,在您第一次进行编辑后,资产会更改其形式。它不再是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 实例,问题就会解决。

我将在今天晚些时候发布相同的演示版本的链接。到那时你可以了解这个概念。

于 2016-08-13T10:18:13.850 回答
0

我可以给你的一个指针是查看AVMutableComposition.

insertTimeRange 方法的注释讨论了轨道参数:

指定包含要插入的轨道的资产。仅支持 的实例AVURLAsset

因此,您从曲目中插入的曲目必须属于AVURLAsset该类且仅属于此类。

于 2014-04-02T16:59:47.237 回答