AVPlayer无间隙播放和寻找多个视频文件

时间:2014-01-01 17:45:56

标签: cocoa avfoundation avplayer

我目前正在编写一个小应用程序,它包含一个包含许多短视频文件的文件夹(每个约1百万个)并播放它们就像是一个长视频文件。

我一直在使用AVQueuePlayer一个接一个地播放它们,但我想知道是否有替代方案,因为我遇到了一些问题:

  • 当播放器切换到下一个文件时,存在一个小但明显的差距
  • 我不能回到上一个视频文件而不必删除队列中的所有项目并将它们放回去

我希望能够转到视频中的任何一点,就好像它是一个视频文件一样。 AVPlayer是最好的方法吗?

1 个答案:

答案 0 :(得分:1)

我意识到距提出这个问题已经有6年了,但是我在看到这个问题后不久就找到了解决方案,也许对其他人会有帮助。

我没有使用AVQueuePlayer,而是将剪辑组合到AVMutableCompositionAVAsset的子类)中,然后可以在普通AVPlayer中播放。 / p>

let assets: [AVAsset] = urlsOfVideos.map(AVAsset.init)
let composition = AVMutableComposition()
let compositionVideoTrack = composition.addMutableTrack(withMediaType: .video, preferredTrackID: kCMPersistentTrackID_Invalid)
let compositionAudioTrack = composition.addMutableTrack(withMediaType: .audio, preferredTrackID: kCMPersistentTrackID_Invalid)

var insertTime = CMTime.zero
for asset in assets {
    let range = CMTimeRange(start: .zero, duration: asset.duration)
    guard let videoTrack = asset.tracks(withMediaType: .video).first,
        let audioTrack = asset.tracks(withMediaType: .audio).first else {
            continue
    }

    compositionVideoTrack?.preferredTransform = orientation!
    try? compositionVideoTrack?.insertTimeRange(range, of: videoTrack, at: insertTime)
    try? compositionAudioTrack?.insertTimeRange(range, of: audioTrack, at: insertTime)

    insertTime = CMTimeAdd(insertTime, asset.duration)
}

然后您像这样创建播放器

let player = AVPlayer(playerItem: AVPlayerItem(asset: composition))