我对观察者和 Swift/ObjC 还很陌生,我正在尝试使用 Apple 文档中所说的方法来监视 AVPlayer 状态,但是当我尝试添加时,我得到的一切都是“已收到消息但未处理”错误消息观察者。
gs_mediaObjAdv=AVPlayer(URL: NSURL(string: mediaURL));
gs_mediaObjAdv.addObserver(self, forKeyPath: "status", options:NSKeyValueObservingOptions.New, context:nil);
Run Code Online (Sandbox Code Playgroud)
如果我取消注册观察者,错误就会消失,但如果我在observeValueForKeyPath函数中添加println("test"),则不会发生任何事情。
关于如何以简单的方式监控状态的任何想法?
我见过 2 个属性AVPlayerItem:
@property (nonatomic, readonly, getter=isPlaybackBufferFull) BOOL playbackBufferFull;
@property (nonatomic, readonly, getter=isPlaybackBufferEmpty) BOOL playbackBufferEmpty;
Run Code Online (Sandbox Code Playgroud)
现在,这是Apple文档所说的:
回放缓冲区满:
此属性报告用于播放的数据缓冲区已达到容量。尽管播放缓冲区已达到容量,但可能不存在足够的统计数据来支持 的
playbackLikelyToKeepUp预测YES。
回放缓冲区空:
它表示播放已消耗所有缓冲媒体,播放将停止或结束。
从这些陈述中,我的理解是:
回放缓冲区满:
整个数据已加载播放。例如,我正在从 URL 播放 5 分钟长的视频。当直到最后的所有内容都已加载时,这些将是正确的。
回放缓冲区空:
实际播放已经消耗了到目前为止加载的所有缓冲区。例如,直到 2.3 分钟的数据已经被加载并且播放也已经到了那个时间并且没有更多的内容可以呈现。(我认为是时候开始我们的旋转木马了,一个指标)
我误解了什么吗?如果是,请纠正我..
欢迎任何深入的知识或建议!
我有三个网址,必须检查这些网址是否有视频链接播放.如果它不包含网址中的视频并从下一个网址播放视频,我必须esc链接.以下代码将有助于跟踪播放状态.
let playerAV = AVPlayerViewController()
var player = AVPlayer()
playerAV.player = player
playerAV.view.frame = CGRectMake(0, 0, self.videoView.frame.width, self.videoView.frame.height)
self.addChildViewController(playerAV)
self.videoView.addSubview(playerAV.view)
playerAV.didMoveToParentViewController(self)
playerAV.player?.play()
addObserverOfMoviePlayer()
NSNotificationCenter.defaultCenter().addObserver(self, selector: #selector(ChannelDetailViewController.notificationObserver(_:)), name:AVPlayerItemDidPlayToEndTimeNotification , object: player.currentItem)
_ = UIDevice.beginGeneratingDeviceOrientationNotifications
NSNotificationCenter.defaultCenter().addObserver(self, selector: #selector(ChannelDetailViewController.deviceOrientationDidChange(_:)) , name:
UIDeviceOrientationDidChangeNotification, object: nil)
playerAV.player!.addObserver(self, forKeyPath: "rate", options: NSKeyValueObservingOptions.New, context: nil)
playerAV.player!.currentItem!.addObserver(self, forKeyPath: "playbackBufferEmpty", options: NSKeyValueObservingOptions.New, context: nil)
playerAV.player!.currentItem!.addObserver(self, forKeyPath: "playbackLikelyToKeepUp", options: NSKeyValueObservingOptions.New, context: nil)
override func observeValueForKeyPath(keyPath: String?, ofObject object: AnyObject?, change: [String : AnyObject]?, context: UnsafeMutablePointer<Void>) {
if keyPath == "rate" …Run Code Online (Sandbox Code Playgroud) 我正在尝试更新这个已弃用的方法:“presentMoviePlayerViewControllerAnimated”,但是我无法导入 AVKit 并使用 AVPlayerViewContoller。似乎我的 Xcode 没有以某种方式看到这个框架。
这是我的代码:
比赛详情VC.m
-(void) tableView:(UITableView *)tableView didSelectRowAtIndexPath (NSIndexPath *)indexPath {
YoutubeVideoModel* video = [_videos objectAtIndex:indexPath.row];
XCDYouTubeVideoPlayerViewController *videoPlayerViewController = [[XCDYouTubeVideoPlayerViewController alloc] initWithVideoIdentifier:video.videoID];
=>[self presentMoviePlayerViewControllerAnimated:videoPlayerViewController];
Run Code Online (Sandbox Code Playgroud)
无法访问 AVKit 文件: 使用 CM + 单击
MatchDetalisVC.m更新
[self presentViewController:videoPlayerViewController animated:YES completion:nil];
Run Code Online (Sandbox Code Playgroud)
用这个更改了最后一行。没有错误。看来我也不必在我的 ViewController 中 #import AVKit 。是正确的吗?
令人惊讶的是,尽管进行了很多搜索,但我仍无法找到答案。
我有一个已缓存的文件,我可以检索我认为是url的缓存目录和文件名吗?
这是获取文件然后播放的代码
let cachedFilePath = getCachedFilePath.result as! String
audioFileURL = cachedFilePath
self.audioPlayerItem = AVPlayerItem(url: NSURL(string: audioFileURL!) as! URL)
Run Code Online (Sandbox Code Playgroud)
这是如果我打印返回的内容audioFileURL:
/ Users / Genie / Library / Developer / CoreSimulator / Devices / A2FB00CE-B018-4FDF-9635-35FD6678DF8D / data / Containers / Data / Application / E18B5E89-B973-4277-AA5C-1378C69D80CD / Library / Caches / Parse / PFFileCache / 7e4a8f655859 %20Name%20of%20the%20Wind%2017-92.mp3
播放器加载,但从不播放,它只是坐在那里旋转。所以我想知道我是否将URL正确传递给播放器?
我读过一个要使用的线程,file://但是没有用。
有人知道如何使用 AVPlayer 设置视频帧的圆角吗?我正在尝试这样做:
- (void)loadVideoWithPlayer:(AVPlayer*)playerVideo
{
dispatch_async(dispatch_get_main_queue(), ^{
AVPlayerLayer *avLayer = [AVPlayerLayer playerLayerWithPlayer: playerVideo];
[avLayer setCornerRadius:20];
[avLayer setMasksToBounds:YES];
[self.playerViewController setPlayer:playerVideo];
[self insertSubview:self.playerViewController.view belowSubview:self.interactView];
[self.playerViewController.player play];
});
}
Run Code Online (Sandbox Code Playgroud)
但它不起作用。我无法设置圆角,AVPlayer.playerViewController.view因为视频帧可能不同。
我想以编程方式AVPlayerViewController从 iPad 向外部窗口添加视图。问题是添加时,播放器视图显示“此视频正在电视上播放”
示例代码:
let player = AVPlayer(url: someUrl)
//these two properties seem to have no effect
//player.usesExternalPlaybackWhileExternalScreenIsActive = true/false
//player.allowsExternalPlayback = true/false
let viewController = AVPlayerViewController()
viewController.player = player
viewController.view.frame = frame
externalWindow.addSubview(viewController.view)
player.play()
Run Code Online (Sandbox Code Playgroud)
有没有办法将视频视图自己添加到外部窗口,以便我可以决定大小?
我正在创建一个Video应用程序Swift3。Video我们在列表中有一个文件列表TableView。对于每个,我们都为用户Video提供了选择的选项。现在我正在尝试播放用户选择的特定范围。Range SliderRangeVideoVideo
我正在使用下面的代码来启动Video4 秒到 8 秒的使用CMTimeMake,但无法正确播放。
let targetTime:CMTime = CMTimeMake(4, 1)////Video start
self.player?.seek(to: targetTime)
self.player?.currentItem?.forwardPlaybackEndTime = CMTimeMake(8, 1)//Video stop
self.player?.play()
Run Code Online (Sandbox Code Playgroud)
谁能帮助我哪里做错了。谢谢。
我正在使用从 Firebase 加载的 URL 填充集合视图。但是当我退出视图或向上滚动集合视图时,我无法让视频暂停。当我使用导航控制器返回时,我仍然可以听到后台播放的视频。然后当我再次进入视图时,视频开始播放,但第一个从未完成。
这是我的视图控制器。有小费吗?谢谢你!我还是 Swift 的新手,所以请原谅我的无知。
import UIKit
import AVKit
import AVFoundation
import Firebase
import FirebaseDatabase
import SDWebImage
class ComedyViewController: UIViewController, UICollectionViewDataSource, UICollectionViewDelegate {
var avPlayer = AVPlayer()
var avPlayerLayer = AVPlayerLayer()
@IBOutlet weak var comedyCollectionView: UICollectionView!
var comedyVideoArray = [ComedyModel]()
var comedyDBRef: DatabaseReference! {
return Database.database().reference().child("comedy")
}
override func viewDidLoad() {
super.viewDidLoad()
loadComedyDB()
}
func loadComedyDB() {
comedyDBRef.observe(DataEventType.value, with: { (snapshot) in
if snapshot.childrenCount > 0 {
self.comedyVideoArray.removeAll()
for comedyData in snapshot.children.allObjects as! [DataSnapshot] {
let comedyObject …Run Code Online (Sandbox Code Playgroud) 我正在尝试加载一个需要标头中的令牌的视频文件。我在 Stackverflow 上了解到,通过查看以下问题,这可能是可能的。问题是我不相信 AVURLAssetHTTPHeaderFieldsKey 是公开的,或者我错误地编写了资产变量。我想做的是将令牌添加到标头中,以便 AVPlayer 加载视频文件。到目前为止,这是我的代码,它只显示播放器,但不加载视频,我猜测是因为我的标题设置不正确:
NSURL *videoURL = [NSURL URLWithString:cell.media[@"redirectionUrl"]];
NSMutableDictionary * headers = [NSMutableDictionary dictionary];
[headers setObject:[CMUser currentUser].token forKey:@"Authorization"];
AVURLAsset *asset = [AVURLAsset URLAssetWithURL:videoURL options:@{@"AVURLAssetHTTPHeaderFieldsKey" : headers}];
AVPlayerItem * item = [AVPlayerItem playerItemWithAsset:asset];
AVPlayer *player = [[AVPlayer alloc] initWithPlayerItem:item];
AVPlayerViewController *playerViewController = [AVPlayerViewController new];
playerViewController.player = player;
playerViewController.modalPresentationStyle = UIModalPresentationOverFullScreen;
[self presentViewController:playerViewController animated:YES completion:nil];
Run Code Online (Sandbox Code Playgroud) avplayer ×10
ios ×7
swift ×5
objective-c ×2
xcode ×2
addobserver ×1
avasset ×1
avfoundation ×1
avkit ×1
avplayeritem ×1
cornerradius ×1
http-headers ×1
swift3 ×1
video ×1