使用投播组件的时候,如何设置投屏资源的播放初始位置?

使用系统的AVCastPicker进行投屏,因为当手机播放到某个位置时,希望开始投屏之后,也从同一个位置开始播放。

在实现的过程中,因为要设置投屏的资源对象:AVQueueItem,其description属性中,有个startPosition,但是设置了没有用

阅读 756
avatarAI BotBETA

在iOS开发中,当你使用AVQueuePlayerAVCastPicker进行投屏时,直接设置AVQueueItemstartPosition可能不会如你期望那样工作,因为AVQueueItemstartPosition主要用于队列中的项目播放时的起始位置,而不直接控制投屏时的起始点。对于投屏(特别是使用AirPlay),起始播放位置的控制通常依赖于播放器的当前状态或你如何设置播放器的初始状态。

要实现从特定位置开始投屏,你可以采取以下步骤:

  1. 确保播放器在投屏前已定位到正确的位置
    在启动投屏之前,你需要确保你的AVPlayer(或AVQueuePlayer,如果你在使用队列)已经播放到了你想要的起始位置。你可以通过seekToTime方法来实现这一点。
  2. 使用AVPlayerLayer(如果需要)显示视频
    如果你需要在本地屏幕上显示视频,同时准备投屏,确保你使用AVPlayerLayer来显示视频,并且它在投屏前已经正确配置并显示了期望的帧。
  3. 配置并启动投屏
    使用AVRoutePickerView(在较新版本的iOS中可能已被AVCastPicker取代)或AVCastPicker来选择投屏设备,并设置AVPlayerplayerLayervideoGravityframe以适应投屏设备的屏幕。
  4. 监听投屏状态
    监听AVPlayertimeControlStatus变化或相关的路由变化,以确保在投屏开始时播放器已经处于正确的状态。
  5. 自动播放
    如果投屏成功后需要自动播放,确保在投屏成功后调用play方法。

示例代码片段

以下是一个简化的示例,展示如何在准备投屏前设置播放器的位置:

import AVFoundation
import AVKit

var player: AVPlayer?
var playerLayer: AVPlayerLayer?

// 设置播放器
let asset = AVAsset(url: URL(string: "你的视频URL")!)
player = AVPlayer(playerItem: AVPlayerItem(asset: asset))

// 设置播放器的初始位置
let startTime = CMTimeMakeWithSeconds(10.0, preferredTimescale: 1) // 从第10秒开始
player?.seek(to: startTime, toleranceBefore: kCMTimeZero, toleranceAfter: kCMTimeZero, completionHandler: { (finished) in
    if finished {
        // 投屏逻辑
        // ...

        // 假设投屏已经成功,现在播放
        player?.play()
    }
})

// 如果需要在屏幕上显示视频
playerLayer = AVPlayerLayer(player: player)
playerLayer?.videoGravity = AVLayerVideoGravity.resizeAspectFill
playerLayer?.frame = yourView.bounds // 假设yourView是你想显示视频的视图
yourView.layer.addSublayer(playerLayer!)

请注意,这个示例中并没有直接涉及到AVCastPicker的投屏逻辑,因为这通常涉及到UI交互和可能的错误处理,但核心思想是在投屏前通过seekToTime来设置播放器的起始位置。

1 个回答

可能是由于AVCastPicker的限制bug,检查startPosition是不是在合理的范围

撰写回答
你尚未登录,登录后可以
  • 和开发者交流问题的细节
  • 关注并接收问题和回答的更新提醒
  • 参与内容的编辑和改进,让解决方法与时俱进
推荐问题