小编Tom*_*out的帖子

使用 AVAssetDownloadTask 播放时缓存 HLS 视频

我正在尝试在播放 HLS 流时缓存它。我正在关注有关此的 Apple 文档(播放离线资源部分):

https://developer.apple.com/library/archive/documentation/AudioVideo/Conceptual/MediaPlaybackGuide/Contents/Resources/en.lproj/HTTPLiveStreaming/HTTPLiveStreaming.html#//apple_ref/doc/uid/TP40016757-CH11-SW1

我已经实现了以下方法 - 这应该使我的 HLS 流在播放时下载:

func downloadAndPlayAsset(_ asset: AVURLAsset) {
    // Create new AVAssetDownloadTask for the desired asset
    // Passing a nil options value indicates the highest available bitrate should be downloaded
    let downloadTask = downloadSession.makeAssetDownloadTask(asset: asset,
                                                             assetTitle: assetTitle,
                                                             assetArtworkData: nil,
                                                             options: nil)!
    // Start task
    downloadTask.resume()

    // Create standard playback items and begin playback
    let playerItem = AVPlayerItem(asset: downloadTask.urlAsset)
    player = AVPlayer(playerItem: playerItem)
    player.play()
}
Run Code Online (Sandbox Code Playgroud)

问题是它只是不下载视频,只播放流。我还实现了代表,但他们都没有被调用:

func urlSession(_ session: URLSession, assetDownloadTask: AVAssetDownloadTask, didLoad …
Run Code Online (Sandbox Code Playgroud)

http-live-streaming ios avplayer swift avassetdownloadtask

5
推荐指数
1
解决办法
1545
查看次数

当 allowedExternalPlayback 为 false 时,AVPlayerViewController 通过airplay 播放音频

我有一个通过 AVPlayerViewController 播放的主视频,应该通过 Airplay 播放到 AppleTV 等。这就是我设置视图控制器的方式:

let player = AVPlayer(url: url)
let controller = AVPlayerViewController()
controller.player = player
Run Code Online (Sandbox Code Playgroud)

这是 AudioSession 的设置:

try session.setCategory(.playback)
try session.setActive(true)
Run Code Online (Sandbox Code Playgroud)

添加了音频、AirPlay 和画中画的后台模式功能。

然后我还有另一个视频,该视频永远不能通过 AirPlay 播放。在实际的应用程序中,当 AVPlayerLayer 中的屏幕被访问时,该视频将自动播放。但为了简单起见,我在本例中使用另一个 AVPlayerViewController。我看过关于 Airplay 2 的 WWDC,他们建议player.allowsExternalPlayback = false针对这些具体情况进行设置。

这就是我设置不应播放 AirPlay 的播放器的方法:

let player = AVPlayer(url: url)
player.allowsExternalPlayback = false

let controller = AVPlayerViewController()
controller.player = player
Run Code Online (Sandbox Code Playgroud)

这种作品。但是,如果您:

  1. 开始与第一个玩家进行播放
  2. 关闭播放器(当播放仍然连接时)
  3. 开始播放第二个播放器(禁用外部播放的播放器)

视频正在设备上播放,但音频正在外部设备上播放。

我尝试过的:

  1. 停用AudioSessiontry session.setActive(false)
  2. try session.setCategory(.playAndRecord, options: [.defaultToSpeaker])
  3. 将类别更改为.playAndRecord和 …

avfoundation ios avaudiosession avplayer airplay

5
推荐指数
1
解决办法
647
查看次数