我正在尝试使用 contentOverlayView 向 AVPlayerViewController 添加一个额外的按钮。问题是我只想在显示播放器控件时显示按钮。我觉得在这个阶段这是不可能的,但想确定一下。有人可以确认目前这是否可行吗?
有什么方法可以将“向后/前进跳过 30 分钟”按钮添加到子类 AVPlayerViewController 中,使其看起来像原生的(就像播放/暂停按钮一样)?
我正在尝试添加一个UISlider来控制AVPlayerViewController中的音量,为此我在'AVPlayerViewController.contentOverlayView'上添加了一个UISlider.UISlider不允许我拖动,好像没有启用它并且它的选择器操作方法'changeVolumeLevelOfPlayer'没有被调用.
这是我的代码:
-(void)viewDidLoad {
[super viewDidLoad];
[[AVAudioSession sharedInstance] setCategory:AVAudioSessionCategoryPlayback error:nil];
[[AVAudioSession sharedInstance] setActive:YES error:nil];
[[UIApplication sharedApplication] beginReceivingRemoteControlEvents];
AVPlayerViewController *avPlayerViewController = [[AVPlayerViewController alloc] init];
AVPlayer *player = [AVPlayer playerWithURL:[self getVideoURLAtIndex:[self.indexOfCurrentTrailer intValue]]];
avPlayerViewController.player = player;
avPlayerViewController.delegate = self;
[player play];
avPlayerViewController.view.frame = CGRectMake(0, 0, 300, 250);
UISlider *sliderForVolumeControl = [[UISlider alloc] initWithFrame:CGRectMake(0, avPlayerViewController.view.frame.size.height/2, 100, 40)];
[sliderForVolumeControl setMinimumValue:0.0];
[sliderForVolumeControl setMaximumValue:1.0];
[sliderForVolumeControl setValue:0.5];
sliderForVolumeControl.continuous = YES;
[sliderForVolumeControl setBackgroundColor:[UIColor orangeColor]];
[sliderForVolumeControl addTarget:self action:@selector(changeVolumeLevelOfPlayer:) forControlEvents:UIControlEventValueChanged];
[sliderForVolumeControl setUserInteractionEnabled:YES];
[sliderForVolumeControl setEnabled:YES];
[avPlayerViewController.contentOverlayView addSubview:sliderForVolumeControl];
[self addChildViewController:avPlayerViewController];
[self.view addSubview:avPlayerViewController.view];
[avPlayerViewController …Run Code Online (Sandbox Code Playgroud) 我有一个用 AVPlayerViewController 包装的 AVPlayer。我的整个应用程序处于纵向模式,AVPlayer 是其中一个视图的子视图。我想在设备像 YouTube 应用程序一样旋转时自动全屏显示视频。有没有办法以编程方式调用 AVPlayerViewController 的全屏按钮方法。在文档中没有找到任何内容。
我试图检测何时处于AVPlayerViewController全屏模式,但我很难做到这一点。我想知道用户何时选择展开按钮进入全屏,如下所示:
我已经根据这些建议添加了适当的观察者:
相应的代码:
var avWidth:CGFloat = 375
var avHeight:CGFloat = 300
override func viewDidLoad()
{
super.viewDidLoad()
let path = NSBundle.mainBundle().pathForResource("cable pressback", ofType: "mp4")
let url = NSURL.fileURLWithPath(path!)
let player = AVPlayer(URL: url)
playerViewController.player = player
playerViewController.view.frame = CGRectMake(0, 100, self.view.frame.size.width, 300)
playerViewController.view.translatesAutoresizingMaskIntoConstraints = true
view.addSubview(playerViewController.view)
self.addChildViewController(playerViewController)
[playerViewController .addObserver(self, forKeyPath:"videoBounds" , options: NSKeyValueObservingOptions.New, context: nil)]
}
override func observeValueForKeyPath(keyPath: String?, ofObject object: AnyObject?, change: [String : AnyObject]?, context: UnsafeMutablePointer<Void>)
{
print("playerViewController.view.frame = \(playerViewController.view.frame)")
if keyPath …Run Code Online (Sandbox Code Playgroud) 我能够通过presentViewController正确显示AVPlayerViewController."播放"和"暂停"按钮按预期工作,但"快进/后退"按钮不执行任何操作...我查看了文档,但没有看到任何提及我需要为它们显式实现手势功能.
我没有做任何特别的事情来使用mp4格式的本地视频文件来实例化AVPlayerViewContoller :
let videoURL = NSURL(fileURLWithPath: path)
let player = AVPlayer(URL: videoURL!)
let playerViewController = AVPlayerViewController()
playerViewController.player = player
self.presentViewController(playerViewController, animated: true) {
playerViewController.player!.play()
}
Run Code Online (Sandbox Code Playgroud)
我错过了什么?我发现很难相信没有其他人遇到过这种情况.
我认为它可能是:
标题几乎描述了所有内容,但这里有详细说明......要在我的应用程序中播放视频,我正在使用 AVPlayerViewController 以模态方式呈现
let player = AVPlayer.init(url: url)
let playerViewController = AVPlayerViewController.init()
playerViewController.player = player
parentViewController.present(playerViewController, animated: true, completion: {...})
Run Code Online (Sandbox Code Playgroud)
一切正常,视频全屏播放,我可以将设备旋转到横向和纵向……仍然一切顺利。
当我点击右下角的对话气泡以更改音频或字幕设置时,这种 UIAlertController 以纵向模式显示(iPhone 7 加纵向):

在横向模式下点击相同的按钮时,它看起来像这样(基本相同,但会以纵向显示,iPhone 7 横向):

现在是实际问题:在横向模式下在 6/6s/7 PLUS 设备上播放电影并点击对话气泡时,应用程序崩溃!这是出现在调试器输出和堆栈跟踪中的内容:
2017-08-10 12:08:18.683184+0200 MyApp[27739:6396143] [Assert] transitionViewForCurrentTransition 未设置!(<_UIFullscreenPresentationController: 0x7ffe3e586000>)

对我来说,它看起来像一个 Apple 错误,因为我在这里没有做任何特别的事情(至少我是这么认为的)并且因为崩溃仅在使用 plus 设备时显示,这是唯一具有紧凑和常规尺寸类组合的设备.
有人知道这里发生了什么吗?
好的。这是问题。我有 tabBar 控制器,在索引 0 的选项卡中,我有一个 TableView,其中包含 AVPlayerViewController 显示视频的单元格。对于 iPhone,当我打印 UIApplication.shared.windows 的内容时 - 它只有 2 个窗口 - UIWindow 和 UITextEffectWindow。但是对于 iPad - 它有 UIWindow、UITextEffectWindow 和几个 PGHostedWindow(3-4 取决于带视频的单元格数量)。那些 PGHostedWindows 是什么?在我看来,当 AVPlayer 的视图添加到单元格的视图层次结构时,他们正在与 AVPlayer 一起创建 - 这让我想到它可能与 iPad 在“画中画”模式下显示视频的能力有关。但即使我将 AVPlayerViewController 的 allowedPictureInPicture 设置为 false - 这些窗口仍在创建。最糟糕的部分 - 即使我从可见区域滚动那些带有视频的单元格,或者转到另一个选项卡 - 那些 PGHostedWindows 也不会被释放。所以问题是 - 那些 PGHostedWindows/ 是什么以及如何防止它们创建?
我有一个带有两个独立播放器的视图控制器,一个带有 AVAudioPlayer 的音频播放器和一个带有 AVPlayerViewController 的视频播放器。
当视图加载时,两个播放器也用它们的源进行初始化,但保持暂停,直到用户与其中一个进行交互。

我试图让这个应用程序能够在后台播放来自 AVAudioPlayer 的音频,所以我在应用程序的功能中设置了该选项并且它正在工作,但我有一些主要问题。
第一个问题是设置引起的
AVAudioSession.sharedInstance().setCategory(AVAudioSession.Category.playback, mode: .default)
Run Code Online (Sandbox Code Playgroud)
这是背景音频所必需的,但它使视频也可以在后台播放,这不是我想要的。有什么办法可以防止这种情况发生吗?
然后,我使用 MPRemoteCommandCenter 为 Lockscreen 和 Control Center 设置控件,指定音频播放器在用户与控件交互时应启动或暂停。如果我只使用音频而不启动播放器并在控制中心、锁屏和应用内播放器之间移动,一切正常。
但是,如果我开始使用 AVPlayerViewController 播放视频,暂停它,启动音频播放器并转到锁定屏幕,即使视频甚至没有播放,命令也会连接到视频。
在为控件运行的代码中没有提到视频播放器(我也尝试完全删除代码,但没有成功)。
这是预期的行为吗?有什么方法可以禁用它吗?
TL;DR
我有一个音频和视频播放器,并且只希望音频播放器能够在后台播放,但出于某种原因,来自 MPRemoteCommandCenter 的控件优先考虑视频播放器,我想更改/禁用此行为。
我有一个带有单个播放器和登录名的 iOS 应用程序。它应该像这样工作:
但是,除了最后一步之外,我的代码可以完成所有操作。如果用户注销并登录 - 它开始播放流,但是当您单击完成按钮并尝试退出视频时,它不起作用。视频保持全屏,并给出以下警告:
Warning: <AVPlayerViewController: 0x7f9fca08aa00> is trying to exit full screen, but is not in its view's window's view controller hierarchy. This results in undefined behavior.
Run Code Online (Sandbox Code Playgroud)
我对 xcode ios 和objectiveC 真的很陌生,我的代码如下
- (void)viewDidLoad {
NSLog(@"ChannelListingViewController::viewDidLoad(): Called...");
[super viewDidLoad];
self.check=1;
NSLog(@"ChannelListingViewController::viewDidLoad(): Exiting...");
}
-(void) playVideo
{
self.channelURL = [TulixAppGlobalConfig getUserSubscribedPlanChannels];
NSURL *url = [[NSURL alloc] initWithString:[self.channelURL[1] getChannelHlsStreamURL]];
self.player = [AVPlayer playerWithURL:url];
// create a player view controller
[self presentViewController:controller …Run Code Online (Sandbox Code Playgroud) ios ×10
avplayer ×7
crash ×1
fullscreen ×1
ipad ×1
landscape ×1
mp4 ×1
objective-c ×1
size-classes ×1
stream ×1
swift ×1
xcode ×1