【发布时间】:2017-12-23 15:16:07
【问题描述】:
我目前正在尝试使用 AVPlayer 播放视频和音频,因此我将它们组合成一个 AVPlayerItem,如下所示:
let videoAsset = AVURLAsset(url: videoURL)
let audioAsset = AVURLAsset(url: audioURL)
let duration = videoAsset.duration
let composition = AVMutableComposition()
let videoTrack = composition.addMutableTrack(withMediaType: AVMediaType.video, preferredTrackID: kCMPersistentTrackID_Invalid)
try? videoTrack?.insertTimeRange(CMTimeRange(start: kCMTimeZero, duration: duration), of: videoAsset.tracks(withMediaType: .video)[0], at: kCMTimeZero)
let audioTrack = composition.addMutableTrack(withMediaType: .audio, preferredTrackID: kCMPersistentTrackID_Invalid)
try? audioTrack?.insertTimeRange(CMTimeRange(start: kCMTimeZero, duration: duration), of: audioAsset.tracks(withMediaType: .audio)[0], at: kCMTimeZero)
let playerItem = AVPlayerItem(asset: composition)
但问题在于,此代码在完成之前通过网络获取视频和音频的整个源。调用“videoAsset.duration”或videoTrack.insertTimeRange 都会触发此网络请求。
有没有办法使用AVPlayer 一起播放这些单独的视频和音频 URL(MP4 视频和 AAC 音频),而无需先下载整个文件?
我注意到,在我的 Mac 上,Quicktime Player 还会在源文件开始播放之前获取它。但是使用 VLC 或 IINA 之类的东西不会,并且可以立即开始播放。
谢谢。
【问题讨论】:
-
你有没有发现如何解决这个问题?我认为使用 loadValuesAsynchronously 可能会奏效,但我还没有时间尝试。
-
@galileo 请参阅下面的答案以了解我所做的事情。我没有查看
loadValuesAsynchronously,因为它似乎有助于在不阻塞主线程的情况下加载资产。