我正在开发一个系统,该系统应播放以前下载的视频块。
首先,我创建一个全局AVMutableComposition
,一个带有addMutableTrack
的本地轨道,下载3个块并将它们通过insertTimeRange
添加到先前创建的轨道中。
然后,用AVPlayerItem
创建一个AVMutableComposition
。好吧。
我会演奏,并且工作无懈可击。我每0.5秒控制一次视频的进度,当剩余时间少于10秒时,它会准备并下载新的视频块。
重复前面的步骤,创建一个新轨道并将其添加到全局乐曲中。它已正确添加,但没有添加到当前的播放项目中,即使有新的组成部分也可以完成。
合成是作为全局变量创建的
self.composition = AVMutableComposition()
guard let composition = self.composition else { return } // Always succeeded, for check if is OK.
guard let track = composition.addMutableTrack(withMediaType: .video, preferredTrackID: kCMPersistentTrackID_Invalid) else { return }
self.downloadStuff(track: track) { (_) in
let item = AVPlayerItem(asset: composition)
self.playVideo(item: item)
}
检查轨道是否存在,或创建一个新轨道
guard let composition = self.composition else { return }
var usableTrack = track
if usableTrack == nil {
guard let ltrack = composition.addMutableTrack(withMediaType: .video, preferredTrackID: kCMPersistentTrackID_Invalid) else { return }
usableTrack = ltrack
}
下载并保存在pathURL中,文件地址为
do {
let asset = AVURLAsset(url: pathURL)
let assetTrack = asset.tracks(withMediaType: .video)[0]
try usableTrack!.insertTimeRange(assetTrack.timeRange, of: assetTrack, at: CMTime(seconds: offset, preferredTimescale: CMTimeScale.zero))
self.helper.totalLenght! += duration
handleFinish(true)
} catch {
print("Error")
handleFinish(false)
}
我现在还没有任何想法。我试图将它们全部添加到同一轨道,但是仍然具有相同的行为。有什么想法吗?