尝试将AVComposition的TimeRange插入AVMutableComposition时出现错误-11800

时间:2014-03-05 23:02:20

标签: ios iphone audio avfoundation avcomposition

我正在使用AVFoundation仅使用音频 - 即没有视频 - 并且尝试将多个AVComposition一个接一个地加入到一起,最终得到一个AVComposition

示例案例:只有两个AVComposition。通过创建一个AVPlayer,它们中的每一个都可以正常运行:

_player = [AVPlayer playerWithPlayerItem:[AVPlayerItem playerItemWithAsset:comp]]

其中compAVMutableComposition的实例。 (顺便提一下,值得注意的是_player必须是一个ivar,否则ARC会在播放之前过早地释放它 - 需要一段时间才能跟踪它。)

那很好 - 正在执行

[_player play]

导致comp成功播放。

然而,这失败了:

self.segmentsNSMutableArray个包含AVMutableComposition自定义子类的元素

AVMutableComposition *comp = [AVMutableComposition composition];
NSError *err;
for (AVMutableComposition* c in self.segments) {
    [comp insertTimeRange:CMTimeRangeMake(kCMTimeZero, segment.duration)      
                  ofAsset:segment atTime:comp.duration error:&err];
    DLog(@"Error was %@", segment, err);
}

对于此代码执行时self.segments的每个元素,在调用insertTimeRange::::方法时出现此错误:

Error was Error Domain=AVFoundationErrorDomain Code=-11800 "The operation could not
be completed" UserInfo=0x14e8e7f0 {NSLocalizedDescription=The operation could not be 
completed, NSUnderlyingError=0x14d7f580 "The operation couldn’t be completed. (OSStatus 
error -12780.)", NSLocalizedFailureReason=An unknown error occurred (-12780)}

我找不到任何关于这个错误表明的信息 - 似乎只是一个全能 - 而且我看不出我做错了什么。有什么想法吗?

3 个答案:

答案 0 :(得分:2)

此代码错误对应于 AVErrorUnknown = -11800,因此没有太多关于问题原因的解释。 https://developer.apple.com/documentation/avfoundation/averror/averrorunknown?language=objc

以防万一它可能对其他人有帮助,我会在这里指出我的原因。

背景

就我而言,我在尝试连接 Airplay 时遇到错误。

原因

原因是我有 2 个 AVPlayer 实例。一个用于电影类型的视频,另一个用于预览。然后,当我尝试投射电影时... AVFoundation 感到困惑,并且出现了此错误。

解决方案

moviePlayback 实例上:

allowsExternalPlayback = true
usesExternalPlaybackWhileExternalScreenIsActive = true

default 实例上:

allowsExternalPlayback = false
usesExternalPlaybackWhileExternalScreenIsActive = false

答案 1 :(得分:0)

就我而言,CMTimeRange错误,持续时间== 0.这是因为CMTimeMake会将输入转换为整数,并且会失去精确度。

为了解决这个问题,我使用了更大的时间尺度。

问题代码:

CMTime startTime = CMTimeMake(timeStamp.begin, 1);
CMTime duration = CMTimeMake(timeStamp.duration, 1);

正确的代码:

CMTime startTime = CMTimeMake(timeStamp.begin*1000, 1000);
CMTime duration = CMTimeMake(timeStamp.duration*1000, 1000);

然后它正常工作。

[videoTrack insertTimeRange:CMTimeRangeMake(startTime, duration) ofTrack:videoTracks.firstObject atTime:kCMTimeZero error:&error];

答案 2 :(得分:-1)

确保未释放segment.asset。因此,如果条件segment.asset == nil为真,则后面的媒体数据消失,因此插入操作失败。

参考:https://www.jianshu.com/p/089f6691dbdb(在文章的底部)