【问题标题】:AVPlayer - play network video with separate audio URL without downloading the files firstAVPlayer - 使用单独的音频 URL 播放网络视频,无需先下载文件
【发布时间】: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,因为它似乎有助于在不阻塞主线程的情况下加载资产。

标签: ios swift video tvos


【解决方案1】:

这是因为 MP4 格式。您应该考虑使用另一种更稳定的流媒体格式。

【讨论】:

  • 很遗憾,这不是我的流,而是 YouTube 的 DASH 流格式,具有单独的视频和音频。
【解决方案2】:

我从未找到使用AVPlayer 来实现此目的的方法。相反,我使用了VLCKit,它支持来自不同来源的播放从属设备。

【讨论】:

  • 您能否向我提供一个关于您如何将音频和视频流 URL 提供给 VLCKit 的小要点?我正在做类似的事情,想获取一些 1080p / 720p YT 视频。
  • 在您的VLCMediaPlayer 实例中,调用addPlaybackSlaveplayer.addPlaybackSlave(audioURL, type: .audio, enforce: true)
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2017-10-30
  • 2018-02-19
  • 1970-01-01
  • 2011-08-30
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多