首先,我要说我喜欢这个论坛,它帮助了我这么多时间。 我有一个问题,我无法在任何地方找到答案,所以这是我的第一个问题。
我的问题是:
我有一个由AVPlayerItem代表的视频,用户可以使用cutBefore按钮编辑视频开始时间,该按钮可以切割滑块左侧的视频
负责剪切视频的方法如下:
- (void)CutBeforeAction {
AVMutableComposition *composition = [AVMutableComposition composition];
// Get the audio and video tracks of the video
AVMutableCompositionTrack *compositionVideoTrack = [composition addMutableTrackWithMediaType:AVMediaTypeVideo preferredTrackID:kCMPersistentTrackID_Invalid];
AVMutableCompositionTrack *compositionAudioTrack = [composition addMutableTrackWithMediaType:AVMediaTypeAudio preferredTrackID:kCMPersistentTrackID_Invalid];
// Calculate the new duration
CMTime currStartTime = _player.currentItem.currentTime;
CMTime endTime = _player.currentItem.duration;
CMTimeRange range = CMTimeRangeFromTimeToTime(currStartTime, endTime);
// Insert the new duration to the tracks
NSError *error = nil;
[compositionVideoTrack insertTimeRange:range
ofTrack:[[_player.currentItem.asset tracksWithMediaType:AVMediaTypeVideo] objectAtIndex:0]
atTime:kCMTimeZero
error:&error];
[compositionAudioTrack insertTimeRange:range
ofTrack:[[_player.currentItem.asset tracksWithMediaType:AVMediaTypeAudio] objectAtIndex:0]
atTime:kCMTimeZero
error:&error];
// Create a new AVPlayerItem with the new composition
AVPlayerItem *item = [AVPlayerItem playerItemWithAsset:composition];
[self setPlayerItem:item];
[_player replaceCurrentItemWithPlayerItem:item];
// change the player location to the beginning of the video
[_player seekToTime:CMTimeMakeWithSeconds(0, 1)];
[self syncTimeLabel];
[self syncScrubber];
}
当第一次运行- (void)cutBefore
方法时它工作正常,当我第二次运行它时(视频已经编辑过一次)
[compositionVideoTrack insertTimeRange:range
ofTrack:[[_player.currentItem.asset tracksWithMediaType:AVMediaTypeVideo] objectAtIndex:0]
atTime:kCMTimeZero
error:&error];
和
[compositionAudioTrack insertTimeRange:range
ofTrack:[[_player.currentItem.asset tracksWithMediaType:AVMediaTypeAudio] objectAtIndex:0]
atTime:kCMTimeZero
error:&error];
方法返回时出现以下错误:
操作无法完成。 (OSStatus错误-12780。)
我试图查找错误代码的含义,但实际上什么都没找到。
感谢您的帮助
答案 0 :(得分:0)
我找到了解决此问题的方法,似乎使用方法insertTimeRange:ofTrack:atTime:error:
将AVMutableComposition的轨道作为导致错误的输入轨道,所以我所做的就是保存初始资产(这不是一个实例AVMutableComposition但是AVAsset的一个实例,并使用它跟踪作为insertTimeRange:ofTrack:atTime:error:
的输入
答案 1 :(得分:0)
我也遇到了这个问题并通过创建组合的可变副本然后删除组合的第一部分来解决它。
AVMutableComposition *newShortComposition = [oldComposition mutableCopy];
[newShortComposition removeTimeRange:CMTimeRangeMake(kCMTimeZero, <your clip time>)];
答案 2 :(得分:0)
我遇到了这个问题,问题在于我对此方法的timeRange
和startTime
参数的计算。 timeRange.start.value
和startTime.value
必须是正面的。也许我迟到的回答会帮助别人。
答案 3 :(得分:0)
我遇到了同样的问题并得到了解决,以上麋鹿的回答对你有帮助。
“OSStatus错误 - 12780,操作无法完成”可能因应用程序内存不足而发生,因为我在模拟器上运行应用程序时没有遇到问题。
在我的情况下,当我在AVMutableCompositionTracks中插入多个AVAssetTrack实例之前创建了多个AVAssetTrack实例时,错误被重现了。我改变了只在AVAssetTrack实例插入AVMutableCompositionTrack之前创建它然后我解决了它。
答案 4 :(得分:0)
如果音频的时长为CMTime.zero,insertTimeRange会抛出异常
if audioAsset.duration == CMTime.zero {
return
}