【问题标题】:Get link to media from AVFullScreenViewController iOS 8从 AVFullScreenViewController iOS 8 获取媒体链接
【发布时间】:2015-07-11 12:05:05
【问题描述】:

我正在尝试在某些内容开始播放时获取视频链接(例如任何 YouTube 视频)。

首先我捕捉到视频开始播放的时间

[[NSNotificationCenter defaultCenter] addObserver:self selector:@selector(videoStarted:) name:@"UIWindowDidBecomeVisibleNotification" object:nil];

然后延迟尝试获取链接

-(void)videoStarted:(NSNotification *)notification
{
    NSLog(@"notification dic = %@", [notification userInfo]);
    [self performSelector:@selector(detectModal) withObject:nil afterDelay:2.5f];
}

-(void)detectModal
{
    CUViewController *controller = (CUViewController *)[appDelegate.window rootViewController].presentedViewController;
    NSLog(@"Presented modal = %@", [appDelegate.window rootViewController].presentedViewController);
    if(controller && [controller respondsToSelector:@selector(item)])
    {
        id currentItem = [controller item];
        if(currentItem && [currentItem respondsToSelector:@selector(asset)])
        {
            AVURLAsset *asset = (AVURLAsset *)[currentItem asset];
            if([asset respondsToSelector:@selector(URL)] && asset.URL)
                [self newLinkDetected:[[asset URL] absoluteString]];
            NSLog(@"asset find = %@", asset);
        }
    }
    else
    {
        for (UIWindow *window in [UIApplication sharedApplication].windows) {
            if ([window.rootViewController.presentedViewController isKindOfClass:NSClassFromString(@"AVFullScreenViewController")])
            {
                controller = (CUViewController *)window.rootViewController.presentedViewController;
                for(int i = 0; i < [controller.view.subviews count]; i++)
                {
                    UIView *topView = [controller.view.subviews objectAtIndex:i];
                    NSLog(@"top view = %@", topView);
                    for(int j = 0; j < [topView.subviews count]; j++)
                    {
                        UIView *subView = [topView.subviews objectAtIndex:j];
                        NSLog(@"sub view = %@", subView);
                        for (int k = 0; k < [subView.subviews count]; k++)
                        {
                            CUPlayerView *subsubView = (CUPlayerView *)[subView.subviews objectAtIndex:k];
                            NSLog(@"sub sub view = %@ class = %@", subsubView, NSStringFromClass([subsubView class]));
                            if([NSStringFromClass([subsubView class]) isEqualToString:@"AVVideoLayerView"])
                            {
                                NSLog(@"player view controller = %@", subsubView.playerController);
                                CUPlayerController *pController = subsubView.playerController;
                                NSLog(@"item = %@", [pController player]);
                                CUPlayerController *proxyPlayer = pController.playerControllerProxy;
                                if(proxyPlayer)
                                {
                                    AVPlayer *player = [proxyPlayer player];
                                    NSLog(@"find player = %@ chapters = %@", player, proxyPlayer.contentChapters);
                                    break;
                                }
                            }
                        }
                    }
                }
            }
        }
    }
}

CUViewController、CUPlayerView、CUPlayerController - 假的类,看起来像这样

@interface CUPlayerController : UIViewController

@property(nonatomic, retain) id playerControllerProxy;
@property(nonatomic, retain) id player;
@property(nonatomic, retain) id item;

- (id)contentChapters;

@end

在这一行之前一切都很好

NSLog(@"find player = %@ chapters = %@", player, proxyPlayer.contentChapters);

玩家总是零。也许有更简单的方法来获取媒体链接?

【问题讨论】:

  • 您想获取正在浏览器中播放的视频的 URL 还是我误会了您?
  • 是的,从 uiwebview 开始播放
  • 如果你以后想下载视频,我得告诉你,Apple 会拒绝你的申请。 Mercury Browser 做了同样的事情,不得不删除这个功能。
  • 我知道如何通过它。
  • 几年前我在 iOS 4 上做过同样的事情。我会看看它。

标签: ios objective-c avplayer


【解决方案1】:

首先,我想重点介绍播放 AVPlayerItem 的 AVPlayer。 AVPlayerItem 对象携带对 AVAsset 对象的引用和该资产的表示设置。当您使用 AVPlayer 的 playerWithURL: 方法时,它会自动创建由资产支持的 AVPlayerItem,该资产是名为 AVURLAsset 的 AVAsset 的子类。 AVURLAsset 有一个 URL 属性。因此,如果您使用它,您可以获得当前播放项目的 NSURL。下面是一个获取 URL 的示例函数:

-(NSURL *)urlOfCurrentlyPlayingInPlayer:(AVPlayer *)player{
    // get current asset
    AVAsset *currentPlayerAsset = player.currentItem.asset;
    // make sure the current asset is an AVURLAsset
    if (![currentPlayerAsset isKindOfClass:AVURLAsset.class]) return nil;
    // return the NSURL
    return [(AVURLAsset *)currentPlayerAsset URL];
}

我认为这只是你如何将这个东西适应你的代码的问题。希望这会有所帮助。

【讨论】:

  • 您好,您似乎没有阅读问题。我正在尝试获取从 UIWebView 开始的视频 URL。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2021-01-29
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2021-12-29
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多