6

我正在AVFoundation使用仅音频 - 即没有视频 - 并尝试将几个AVCompositions 一个接一个地连接在一起,最终得到一个 s AVComposition

示例案例:只有两个AVCompositions。他们每个人都通过创建一个 AVPlayer 玩得很好,因此:

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

comp的实例在哪里AVMutableComposition。(顺便说一句,值得注意的是,它_player必须是 ivar,否则 ARC 会在播放之前过早地释放它 - 需要一段时间才能找到它。)

这很好 - 执行

[_player play]

结果comp播放成功。

但是,这失败了:

self.segments是一个NSMutableArray包含元素的自定义子类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)}

我找不到有关此错误指示的任何信息 - 似乎只是一个包罗万象的信息 - 我看不出我做错了什么。有任何想法吗?

4

3 回答 3

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
于 2021-01-15T16:26:13.157 回答
1

在我的情况下,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];
于 2015-10-26T06:05:53.573 回答
-1

确保segment.asset没有被释放。所以如果条件segment.asset == nil为真,后面的媒体数据就没有了,那么插入动作就失败了。

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

于 2018-03-16T01:16:20.377 回答