我和我的团队有一个问题我们几个星期都解决不了。
当我们在AVComposition中寻找两个视频之间的转发-预览冻结(AVPlayer与AVPlayerLayer用于播放)。它被卡在第一段视频的最后一帧上。如果它是一个简单的回放(不是一个寻求),它不会冻结,如果查找是快速的。
下面是正在发生的事情的屏幕记录:https://www.dropbox.com/s/hxk33u3id7eug2i/AVCompositionFreezeScreenRecording.mov?dl=0
感觉好像我们什么都试过了,什么都帮不上忙。当添加第二个视频时,我们要求AVMutableComposition提供一个兼容的音轨,它会返回我们现有的音轨,因此我们得出结论,这两个assetTrack是兼容的。
所有的范围和持续时间检查了多次。
无论是在videoComposition上设置playerItem时还是在没有设置时,它都会失败。
我目前的理论甚至是composition说现有的compositionTrack与第二个视频兼容,我们不能因为某种原因就把第二个视频放进去,也许转换是不兼容的,或者我不知道。还有一个注意事项--如果我们使用的是持续时间比videoAssetTrack.timeRange.duration短的源videoAssetTrack.timeRange.duration范围,那么一切都能工作。也许是段时间映射的一些问题,但是我们尝试过的任何东西都失败了。
我试图将演示问题所需的代码量降到最低,因此希望能够很容易地理解我正在谈论的内容。只要慢慢地从video1的末尾到video2的开始,它就会陷入困境。https://www.dropbox.com/s/c6guzplt5mq4zpi/AVCompositionFreezeDemo.zip?dl=0
非常感谢提前,任何帮助都将不胜感激!
发布于 2022-11-19 08:43:37
在创建AVComposition时,我发现了如何用技巧来解决这个问题。也就是说,在创建AVComposition时,我开始在棋盘模式中使用两个而不是一个AVCompositionTrack。这不仅解决了相邻视频的不同fps的问题,而且解决了应用不同的变换的问题。
let videoTracks = [
composition.addMutableTrack(withMediaType: .video, preferredTrackID: kCMPersistentTrackID_Invalid)!,
composition.addMutableTrack(withMediaType: .video, preferredTrackID: kCMPersistentTrackID_Invalid)!
]
let timeRangeStart: CMTime = .zero
for (index, asset) in assets.enumerated() {
let videoTrack = videoTracks[index % 2]
let assetTrack = asset.tracks(withMediaType: .video).first
let timeRange = CMTimeRange(start: .zero, duration: asset.duration)
do {
try videoTrack.insertTimeRange(
timeRange,
of: assetTrack,
at: timeRangeStart
)
timeRangeStart = timeRangeStart + timeRange.duration
} catch {
logError()
}
}https://stackoverflow.com/questions/63385028
复制相似问题