使用系统的AVCastPicker进行投屏,因为当手机播放到某个位置时,希望开始投屏之后,也从同一个位置开始播放。
在实现的过程中,因为要设置投屏的资源对象:AVQueueItem,其description属性中,有个startPosition,但是设置了没有用
使用系统的AVCastPicker进行投屏,因为当手机播放到某个位置时,希望开始投屏之后,也从同一个位置开始播放。
在实现的过程中,因为要设置投屏的资源对象:AVQueueItem,其description属性中,有个startPosition,但是设置了没有用
在iOS开发中,当你使用AVQueuePlayer
与AVCastPicker
进行投屏时,直接设置AVQueueItem
的startPosition
可能不会如你期望那样工作,因为AVQueueItem
的startPosition
主要用于队列中的项目播放时的起始位置,而不直接控制投屏时的起始点。对于投屏(特别是使用AirPlay),起始播放位置的控制通常依赖于播放器的当前状态或你如何设置播放器的初始状态。
要实现从特定位置开始投屏,你可以采取以下步骤:
AVPlayer
(或AVQueuePlayer
,如果你在使用队列)已经播放到了你想要的起始位置。你可以通过seekToTime
方法来实现这一点。AVPlayerLayer
(如果需要)显示视频:AVPlayerLayer
来显示视频,并且它在投屏前已经正确配置并显示了期望的帧。AVRoutePickerView
(在较新版本的iOS中可能已被AVCastPicker
取代)或AVCastPicker
来选择投屏设备,并设置AVPlayer
的playerLayer
的videoGravity
和frame
以适应投屏设备的屏幕。AVPlayer
的timeControlStatus
变化或相关的路由变化,以确保在投屏开始时播放器已经处于正确的状态。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 回答1.1k 阅读✓ 已解决
1 回答1.1k 阅读
1 回答992 阅读
1 回答972 阅读
1 回答869 阅读
824 阅读
713 阅读
可能是由于AVCastPicker的限制bug,检查startPosition是不是在合理的范围