我用了AVPlayerView不停播放4个视频AVPlayerLooper.
问题是:AVPlayerView只显示一个循环视频.但我需要播放一个序列(4个视频).
如何AVPlayerLooper播放所有4个视频并在此之后循环播放?
import Cocoa
import AVKit
import AVFoundation
class ViewController: NSViewController {
@IBOutlet weak var viewOne: AVPlayerView!
var playerLooper: AVPlayerLooper? = nil
override func viewDidLoad() {
super.viewDidLoad()
let videos = (1...4).map { _ in
Bundle.main.urls(forResourcesWithExtension: "mov", subdirectory: nil)![Int(arc4random_uniform(UInt32(4)))]
}
viewOne.player = AVQueuePlayer(url: videos[Int(arc4random_uniform(UInt32(4)))])
let item = AVPlayerItem(url: videos[Int(arc4random_uniform(UInt32(4)))])
playerLooper = AVPlayerLooper(player: viewOne.player as! AVQueuePlayer, templateItem: item)
viewOne.player?.actionAtItemEnd = .advance
viewOne.controlsStyle = .none
NotificationCenter.default.addObserver(self, selector: Selector(("loopSequence")), name: NSNotification.Name.AVPlayerItemDidPlayToEndTime, object: viewOne.player?.currentItem)
func loopSequence() …Run Code Online (Sandbox Code Playgroud) 我试图用AVPlayerView斯威夫特,但编译器抱怨它不能找到一个名为成员player中AVPlayerView.

但AVPlayerView显然确实有一个叫做的属性player.

其他属性或方法都很好.似乎只有player不被承认.
更新:该问题与AVPlayerControllerView无关,请参阅下面的答案.班级的名字AVTouchIgnoringView在一开始就让我困惑,但这也是思考问题的错误途径.
===
众所周知,Media Player在iOS 9中不推荐使用框架,因此我决定尝试AVKit在我的新项目中使用.我的任务是显示嵌入在集合视图'header(UICollectionReusableView)中的视频播放器,下面有一些任意单元格.
这是我在代码中这样做的方式:
override func viewDidLoad() {
super.viewDidLoad()
apiManager.loadVideo() { video in
let player = AVPlayer(URL: video.url)
self.playerViewController.view.hidden = true
self.playerViewController.player = player
self.addChildViewController(self.playerViewController)
headerView.videoContainerView.addSubview(self.playerViewController.view)
Cartography.layout(self.playerViewController.view,
headerView.videoContainerView) { (v1, v2) in
v1.leading == v2.leading
v1.bottom == v2.bottom
v1.trailing == v2.trailing
v1.top == v2.top
}
self.playerViewController.didMoveToParentViewController(self)
self.playerViewController.addObserver(self,
forKeyPath: KeyPath.ReadyForDisplay, options: nil, context: nil)
}
}
override func observeValueForKeyPath(keyPath: String,
ofObject object: AnyObject, change: [NSObject : AnyObject],
context: UnsafeMutablePointer<Void>) {
if …Run Code Online (Sandbox Code Playgroud) 这就是我所拥有的,我希望这个视频能够填满整个屏幕(aspectFill)
playerLayer.videoGravity = kCAGravityResizeAspectFill 应该执行Aspect Fill,但我仍然会在屏幕的顶部和底部出现黑条.
最后一行应该循环视频,但它只是变暗并停止播放.
任何建议表示赞赏.
var moviePlayer: AVPlayer!
override func viewDidLoad() {
super.viewDidLoad()
// Load the video from the app bundle.
let videoURL: NSURL = NSBundle.mainBundle().URLForResource("video", withExtension: "mp4")!
self.moviePlayer = AVPlayer(URL: videoURL)
self.moviePlayer.muted = true
let playerLayer = AVPlayerLayer(player: self.moviePlayer)
playerLayer.videoGravity = kCAGravityResizeAspectFill //this not working
playerLayer.zPosition = -1
playerLayer.frame = self.view.frame
self.view.layer.addSublayer(playerLayer)
self.moviePlayer.play()
// Loop video.
NSNotificationCenter.defaultCenter().addObserver(self, selector: "loopVideo", name: AVPlayerItemDidPlayToEndTimeNotification, object: self.moviePlayer)
}
func loopVideo() {
self.moviePlayer.play()
}
Run Code Online (Sandbox Code Playgroud) 我使用自定义图像选择器来选择时间流逝,我想获取所选时间流逝的网址,以便我可以播放时间流逝.
- (void)qb_imagePickerController:(QBImagePickerController *)imagePickerController didFinishPickingAssets:(NSArray *)assets {
for (PHAsset *asset in assets) {
NSURL *url = [NSURL URLWithString: assetURLgoesHere];
AVURLAsset *avAsset = [AVURLAsset URLAssetWithURL:url options:nil];
AVPlayerItem *playerItem = [AVPlayerItem playerItemWithAsset:avAsset];
AVPlayer *videoPlayer = [AVPlayer playerWithPlayerItem:playerItem];
[videoPlayer play];
}
[self dismissViewControllerAnimated:YES completion:NULL];
}
Run Code Online (Sandbox Code Playgroud)
这就是我现在所拥有的,但我需要获得资产的网址.
我通常使用swift但这个自定义图像选择器是用objective-c编写的.所以我有点客观 - c菜鸟
更新的代码
- (void)qb_imagePickerController:(QBImagePickerController *)imagePickerController didFinishPickingAssets:(NSArray *)assets {
for (PHAsset *asset in assets) {
- (PHImageRequestID)requestAVAssetForVideo:(PHAsset *)asset options:(PHVideoRequestOptions *)options resultHandler:(void (^)(AVAsset *asset, AVAudioMix *audioMix, NSDictionary *info))resultHandler
NSURL *url = [NSURL URLWithString: asset];
AVURLAsset *avAsset = …Run Code Online (Sandbox Code Playgroud) 我有一个适合在电视或笔记本电脑上观看的视频(即横向主导)。我需要使该视频垂直填满 iPhone 屏幕,而不会使视频超出纵横比。因此,视频左侧和右侧的大部分内容都会从屏幕的左侧和右侧渗出。
CodingWithChris 在这里以故事板的形式完成了这一点:https://www.youtube.com/watch?v =1HN7usMROt8(放大到 1:35:00)我需要知道如何在 SwiftUI 中以编程方式执行此操作。
目前我有一个在模拟器 onAppear 中播放的视频。这是我的代码:
struct SignInView: View {
private let player = AVPlayer(url: URL(fileURLWithPath: Bundle.main.path(forResource: "DL_preview", ofType: "mp4")!))
var body: some View {
ZStack {
VideoPlayer(player: player)
.onAppear() {
player.isMuted = true
player.play()
}
VStack {
Run Code Online (Sandbox Code Playgroud)
这是视频的屏幕截图,以供纵横比参考。想象一下在此屏幕截图的中央直立放置的 iPhone(纵向)。这就是我想要填充整个屏幕的所有框架。

非常感谢你的帮助!!
这是一个很好的简单的avplayer代码片段,在队列中播放一小部分视频.我的问题.我实际上想在队列中的视频之间暂停.可能吗?
我注意到率两次发射; 状态只会像通知那样触发一次.
import UIKit
import AVKit
import AVFoundation
class ViewController: UIViewController {
@IBOutlet weak var VideoView: UIView!
var player:AVQueuePlayer = AVQueuePlayer()
@IBAction func NextSlide(sender: AnyObject) {
player.play()
}
override func viewDidLoad() {
func NextSlide(sender: AnyObject) {
}
super.viewDidLoad()
// Do any additional setup after loading the view, typically from a nib.
let arrayOfPaths: [String] = ["http://192.100.1.1:8080/dino1.mov","http://192.100.1.1:8080/dino1.mov","http://192.100.1.1:8080/dino1.mov"]
var shots = [AVPlayerItem]()
for item in arrayOfPaths {
let url2adopt = NSURL(string: item)
let avAsset = AVURLAsset(URL: url2adopt!)
let shot = AVPlayerItem(asset: …Run Code Online (Sandbox Code Playgroud) 据我了解,AVCameraCalibrationData 只能通过 AVCaptureDepthDataOutput 使用。那是对的吗?
另一方面,AVCaptureDepthDataOutput 只能通过 iPhone X 前摄像头或 iPhone Plus 后摄像头访问,还是我弄错了?
我想要做的是获取 AVCaptureVideoDataOutput SampleBuffer 的 FOV。特别是,它应该匹配所选的预设(全高清、照片等)。
我有 SwiftUI 中的 URL 列表。当我点击某个项目时,我会呈现一个全屏视频播放器。我有一个@EnvironmentObject可以处理一些查看器选项(例如,是否显示时间码)。我还有一个显示和隐藏时间码的切换开关(我只在本例中包含了该切换开关,因为时间码视图并不重要),但每次我更改切换开关时,都会再次创建视图,从而重新设置AVPlayer. 这是有道理的,因为我是在视图的初始化程序中创建播放器的。
我考虑过创建自己的ObserveredObject类来包含 ,AVPlayer但我不确定如何或在哪里初始化它,因为我需要给它一个 URL,而我只能从CustomPlayerView. 我还考虑过将播放器设置为 ,@EnvironmentObject但初始化我可能不需要的东西似乎很奇怪(如果用户没有点击 URL 来启动播放器)。
AVPlayer创建 AVKit 的正确方法是什么VideoPlayer?这是我的示例代码:
class ViewerOptions: ObservableObject {
@Published var showTimecode = false
}
struct CustomPlayerView: View {
@EnvironmentObject var viewerOptions: ViewerOptions
private let avPlayer: AVPlayer
init(url: URL) {
avPlayer = AVPlayer(url: url)
}
var body: some View {
HStack {
VideoPlayer(player: avPlayer)
Toggle(isOn: $viewerOptions.showTimecode) { Text("Show Timecode") }
}
}
}
Run Code Online (Sandbox Code Playgroud) 我正在尝试让AVPlayer播放作为本地文件的m3u8播放列表。
我已经使用苹果的示例播放列表之一将其缩小为一个简单的测试用例:
https://tungsten.aaplimg.com/VOD/bipbop_adv_fmp4_example/master.m3u8
Run Code Online (Sandbox Code Playgroud)
如果我从远程URL播放此播放列表,则AVPlayer会播放得很好。但是,如果我将此播放列表下载到本地文件,然后将本地文件URL交给AVPlayer,则AVPlayer将不会播放它。它只是显示划掉的比赛符号。
有趣的是,这也可以与Safari复制。Safari将播放远程播放列表,但不播放本地文件。还要注意的是,AVPlayer的这种行为在iOS 10.2和macOS 10.12.1上是相同的。另外,直接播放mp4媒体文件(未包装在播放列表中)似乎也没有此问题,因为它既可以从远程URL播放,也可以从本地文件播放。
检查AVPlayerItem.error不会导致任何有用的事情:
An unknown error occurred (-12865)
The operation could not be completed
Run Code Online (Sandbox Code Playgroud)
有谁知道AVPlayer无法播放本地播放列表的任何限制?
谢谢。