我正在使用AVFoundation
仅使用音频 - 即没有视频 - 并且尝试将多个AVComposition
一个接一个地加入到一起,最终得到一个AVComposition
示例案例:只有两个AVComposition
。通过创建一个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)}
我找不到任何关于这个错误表明的信息 - 似乎只是一个全能 - 而且我看不出我做错了什么。有什么想法吗?
答案 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(在文章的底部)