- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
我正在努力实现与 snapchat 相同的目标。也就是说,当用户完成拍摄视频并进入预览 View 时,视频会卡住一秒钟左右,直到视频准备好播放为止,然后开始播放。我正在努力实现同样的目标。以下是我尝试过的,
while playerItem1.status == .unknown {
print("1111121232432431243123241432143243214324321")
if playerItem1.status == .readyToPlay {
playerQueue = AVQueuePlayer(playerItem: playerItem1)
self.playerQueue?.play()
playerLayer = AVPlayerLayer(player: playerQueue)
playerLayer.frame = (camPreview?.bounds)!
playerLayer?.layoutIfNeeded()
playerLayer.videoGravity = AVLayerVideoGravity.resizeAspectFill
camPreview?.layer.insertSublayer(playerLayer, above: previewLayer)
playerLooper = AVPlayerLooper(player: playerQueue, templateItem: playerItem1)
}
}
然而这会导致 xcode 崩溃,因为它似乎永远不会结束。我不明白这一点,因为在某些时候状态应该变成 .readyToPlay
,因为如果我不理会它,它就会这样做。
主要是我想这样做,因为目前当您放开我的代码中的捕获按钮时,屏幕会卡住然后进行转换。我希望它卡住视频而不是捕获屏幕。
extension ViewController: AVCaptureFileOutputRecordingDelegate {
//MARK: - Protocal stubs
func capture(_ captureOutput: AVCaptureFileOutput!, didStartRecordingToOutputFileAt fileURL: URL!, fromConnections connections: [Any]!) { print("bruh? MMMM") }
func capture(_ captureOutput: AVCaptureFileOutput!, didFinishRecordingToOutputFileAt outputFileURL: URL!, fromConnections connections: [Any]!, error: Error!) {
}
func fileOutput(_ output: AVCaptureFileOutput, didFinishRecordingTo outputFileURL: URL, from connections: [AVCaptureConnection], error: Error?) {
if (error != nil) {
print("Error recording movie11: \(error!.localizedDescription)")
} else {
newViewVideoPlayback()
switchIcon.isHidden = true
switchWhiteUI.isHidden = true
switchCamButton.isHidden = true
camWhiteLine.isHidden = true
// let videoRecorded = outputURL! as URL
// playerItem1 = AVPlayerItem(url: videoRecorded)
if !captureSession.isRunning {
DispatchQueue.global(qos: .background).async {
self.startRunningCaptureSession()
}
}
}
}
let videoRecorded = outputURL! as URL
playerItem1 = AVPlayerItem(url: videoRecorded)
playerItem1.addObserver(self,
forKeyPath: #keyPath(AVPlayerItem.status),
options: [.old, .new],
context: &playerItemContext)
override func observeValue(forKeyPath keyPath: String?,
of object: Any?,
change: [NSKeyValueChangeKey : Any]?,
context: UnsafeMutableRawPointer?) {
// Only handle observations for the playerItemContext
guard context == &playerItemContext else {
super.observeValue(forKeyPath: keyPath,
of: object,
change: change,
context: context)
return
}
if keyPath == #keyPath(AVPlayerItem.status) {
let status: AVPlayerItem.Status
if let statusNumber = change?[.newKey] as? NSNumber {
status = AVPlayerItem.Status(rawValue: statusNumber.intValue)!
} else {
status = .unknown
}
// Switch over status value
switch status {
case .readyToPlay:
// Player item is ready to play.
playerQueue = AVQueuePlayer(playerItem: playerItem1)
self.playerQueue?.play()
playerLayer = AVPlayerLayer(player: playerQueue)
playerLayer.frame = (camPreview?.bounds)!
playerLayer?.layoutIfNeeded()
playerLayer.videoGravity = AVLayerVideoGravity.resizeAspectFill
camPreview?.layer.insertSublayer(playerLayer, above: previewLayer)
playerLooper = AVPlayerLooper(player: playerQueue, templateItem: playerItem1)
case .failed: break
// Player item failed. See error.
case .unknown: break
// Player item is not yet ready.
}
}
}
}
最佳答案
来自Docs
When a player item is created, its status is AVPlayerItem.Status.unknown, meaning its media hasn’t been loaded and has not yet been enqueued for playback. Associating a player item with an AVPlayer immediately begins enqueuing the item’s media and preparing it for playback. When the player item’s media has been loaded and is ready for use, its status will change to AVPlayerItem.Status.readyToPlay. You can observe this change using key-value observing.
因此,您需要监听状态,而不是制作一个 while 循环,该循环会压垮系统,直到状态发生变化,这也在 Docs 中。
private var playerItemContext = 0
playerItem.addObserver(self,
forKeyPath: #keyPath(AVPlayerItem.status),
options: [.old, .new],
context: &playerItemContext)
override func observeValue(forKeyPath keyPath: String?,
of object: Any?,
change: [NSKeyValueChangeKey : Any]?,
context: UnsafeMutableRawPointer?) {
// Only handle observations for the playerItemContext
guard context == &playerItemContext else {
super.observeValue(forKeyPath: keyPath,
of: object,
change: change,
context: context)
return
}
if keyPath == #keyPath(AVPlayerItem.status) {
let status: AVPlayerItemStatus
if let statusNumber = change?[.newKey] as? NSNumber {
status = AVPlayerItemStatus(rawValue: statusNumber.intValue)!
} else {
status = .unknown
}
// Switch over status value
switch status {
case .readyToPlay:
// Player item is ready to play.
case .failed:
// Player item failed. See error.
case .unknown:
// Player item is not yet ready.
}
}
}
<小时/>
extension ViewController: AVCaptureFileOutputRecordingDelegate {
//MARK: - Protocal stubs
func capture(_ captureOutput: AVCaptureFileOutput!, didStartRecordingToOutputFileAt fileURL: URL!, fromConnections connections: [Any]!) { print("bruh? MMMM") }
func capture(_ captureOutput: AVCaptureFileOutput!, didFinishRecordingToOutputFileAt outputFileURL: URL!, fromConnections connections: [Any]!, error: Error!) {
}
func fileOutput(_ output: AVCaptureFileOutput, didFinishRecordingTo outputFileURL: URL, from connections: [AVCaptureConnection], error: Error?) {
if (error != nil) {
print("Error recording movie11: \(error!.localizedDescription)")
} else {
newViewVideoPlayback()
switchIcon.isHidden = true
switchWhiteUI.isHidden = true
switchCamButton.isHidden = true
camWhiteLine.isHidden = true
let videoRecorded = outputURL! as URL
playerItem1 = AVPlayerItem(url: videoRecorded)
playerItem1.addObserver(self,
forKeyPath: #keyPath(AVPlayerItem.status),
options: [.old, .new],
context: &playerItemContext)
playerQueue = AVQueuePlayer(playerItem: playerItem1)
if !captureSession.isRunning {
DispatchQueue.global(qos: .background).async {
self.startRunningCaptureSession()
}
}
}
}
override func observeValue(forKeyPath keyPath: String?,
of object: Any?,
change: [NSKeyValueChangeKey : Any]?,
context: UnsafeMutableRawPointer?) {
// Only handle observations for the playerItemContext
guard context == &playerItemContext else {
super.observeValue(forKeyPath: keyPath,
of: object,
change: change,
context: context)
return
}
if keyPath == #keyPath(AVPlayerItem.status) {
let status: AVPlayerItem.Status
if let statusNumber = change?[.newKey] as? NSNumber {
status = AVPlayerItem.Status(rawValue: statusNumber.intValue)!
} else {
status = .unknown
}
// Switch over status value
switch status {
case .readyToPlay:
playerLayer = AVPlayerLayer(player: playerQueue)
playerLayer.frame = (camPreview?.bounds)!
playerLayer?.layoutIfNeeded()
playerLayer.videoGravity = AVLayerVideoGravity.resizeAspectFill
camPreview?.layer.insertSublayer(playerLayer, above: previewLayer)
playerLooper = AVPlayerLooper(player: playerQueue, templateItem: playerItem1)
// Player item is ready to play.
self.playerQueue?.play(
case .failed: break
// Player item failed. See error.
case .unknown: break
// Player item is not yet ready.
}
}
}
}
关于ios - 当AVPlayer项为 ".readyToPlay"时如何仅播放videoPreviewLayer,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/53686445/
我有一个 AVPlayer当我到达持续时间结束时,我想回到开始,但我不想重新启动AVPlayer . //Do something when video ended NotificationCente
我正在使用 AVPlayer 从服务器流式传输音频,我现在想做的是显示一个显示缓冲进度的自定义 UISlider。 有人想出这个吗?请给我解决方案。现在播放器一次加载整个持续时间并在 UISlider
我知道 AVPlayerItem(AVPlayer 的子类)能够订阅 AVPlayerItemDidPlayToEndTimeNotification AVPlayer 没有这样的功能,我需要使用 A
总结: 如果您只使用 AVPlayer 在您的应用程序中播放流音频,那么锁屏更新将工作得很好(许多流 - 一个接一个)。但是,如果您使用 AVPlayer 播放流式音频,然后播放本地视频文件(即使在使
我正在尝试创建像 Vine 这样的应用程序。我有一个 Collection View ,其中每个项目都包含一个带有 AVPlayerLayer 和 AVPlayer 实例的 View ,并且相应的 a
我创建了一个简单的 AVPlayer。 (如果我没有正确创建它,请帮我修复它...😀)我想用 swift ui 在我的 VStack 中显示它,但我有点卡住了... 如果库里至少有AVPlayer
我已将观察者添加到 AVPlayer,但它不会在 avplayer 状态准备好播放时调用该函数。该函数在视频开始播放时调用两次,但 AVPlayer 的持续时间参数都返回“nan”,我需要在 AVPl
我有 2 个 View Controller ,第一个包含一个视频信息列表表,然后从列表中选择一个项目,通过导航打开详细 View Controller 。我在这个细节 Controller 上使用了
关于这个主题的所有线程都非常老(5+ 哟),我似乎无法形成一个清晰的现代方法,所以希望这可以在 2020 年(Swift 5,Xcode 11)进行总结。 如果您要使用 为 iPhone 构建一个 A
我有一个 AVPlayer 可以从网络流式传输 mp3 文件。我已经激活了一个 AVAudioSession 以便在应用程序退出/屏幕关闭时播放音频。音乐播放完美,但手机顶部状态菜单中出现的“播放”三
我正在使用 Apple 的文档演示。这是演示链接: AVPlayerDemo 我的应用程序在执行以下步骤后崩溃了: 1) 播放歌曲 2) 从搜索栏快进。 3)点击下一步,4) 从搜索栏快进。 这是我的
因此看来,实际起作用的唯一值是0.0、0.5、1.0和2.0 ... 我尝试将其设置为0.25,因为我希望它以自然速度的1/4播放,但它却以自然速度的1/2播放。有人可以确认吗? 最佳答案 已确认。实
我有一个应用程序,它通过 AVMutableComposition 将本地文件加载到 avPlayer 中,它可能有多达 6 个音频和视频轨道作为合成的一部分。 我有一个 UISlider,用于调整播
在我的 IOS 应用程序中使用 AVPlayer 显示短视频的屏幕。我成功离开并重新进入此屏幕几次,但在七次或更多次后,我得到空白屏幕并且 AVPlayerLayer 的 IsReadyForDisp
我正在开发一个应用程序,其中包括使用每帧动画播放视频的功能。 您可以看到 example这样的功能。 我已经尝试添加 CAKeyFrameAnimation到 AVSynchronizedLayer
如何在 osx 自动播放中制作 avplayer? 我试过这个: NSURL *videoURL = [[NSBundle mainBundle] URLForResource:@"video nam
iOS AVPlayer 的默认最大和最小缓冲区大小是多少?如何增加 mp3 流媒体的大小?谢谢你 最佳答案 如果您的 缓冲区大小 意味着播放缓冲区,那么我相信这个大小没有记录。 此行为由 AVFou
我正在使用多个 AVPlayer 在我的屏幕上显示内容,并且它们都同时播放视频。 问题是有时 avplayer 正在播放,但 avplayerlayer 没有显示任何内容 - 你得到的只是一个空白屏幕
我正在使用 AVPlayer 在我的应用程序中播放视频,现在我想让视频在后台模式下播放。 这是我放入 - (BOOL)application:(UIApplication *)application
我在 iOS 6.1 中使用 AVPlayer 对象。我目前正在连接到 Icecast 服务器以传输现场音乐源。但是,当流由于任何原因(例如重新启动或信号更改)而中断时,AVPlayer 会停止播放。
我是一名优秀的程序员,十分优秀!