iOS YTPlayerView 强制视频质量

iOS YTPlayerView force video quality

我目前正在我们的应用程序中使用 iOS-youtube-player-helper 库。有一个视图控制器,其 YTPlayerView 的纵横比为 16:9,这意味着它只占用屏幕的一部分。视频以介质加载,无论如何,我无法以 720P 或 1080P 播放。我确信这些质量是可用的,只是 YTPlayerView 强制质量基于视频播放器的高度。因为这是一个库,不是直接嵌入iframe,所以我不能使用"vq"参数(在playerVars中指定vq似乎不起作用),并且将质量设置为小然后稍后再更改也不起作用(参考this issue on GitHub)

现在,鉴于 UI 设计问题,我无法让 YTPlayerView 填满整个屏幕。那么,是否可以强制 YTPlayerView 至少播放 720P? (解决方法,更改库代码,...)

因为这是一款即将上架 App Store 的应用(当然我们也不希望与 google 发生任何法律纠纷),请不要建议使用违反Youtube ToC 例如 XCDYouTubeKit

非常感谢

我找到了解决方法,这对我来说效果很好。

首先,问题取决于YTPlayerView内部构造的webView大小。例如,如果你有一个 320x200 的播放器视图,尝试将你的视频强制设置为 720hd 是行不通的,因为 iFrame youtube 播放器 class 会根据你的播放器尺寸重新切换到更好的分辨率(在这种情况下,质量很小,因为你有 320x200).

你可以看到这个 解释了这个问题。

当您将 YTPlayerView class 导入您的项目时,您有两个文件:YTPlayerView.hYTPlayerView.m

YTPlayerView.m更新也适用于 iPads)


我更改了使用自定义大小(4k 分辨率)初始化 webview 的功能,并且在最后一部分我添加了缩放内容和恢复原始框架的可能性,如下所示:

- (UIWebView *)createNewWebView {
    CGRect frame = CGRectMake(0.0, 0.0, 4096.0, 2160.0); //4k resolution
    UIWebView *webView = [[UIWebView alloc] initWithFrame:frame];
    //UIWebView *webView = [[UIWebView alloc] initWithFrame:self.bounds];

    webView.autoresizingMask = (UIViewAutoresizingFlexibleWidth | UIViewAutoresizingFlexibleHeight);
    webView.scrollView.scrollEnabled = NO;
    webView.scrollView.bounces = NO;

    if ([self.delegate respondsToSelector:@selector(playerViewPreferredWebViewBackgroundColor:)]) {
        webView.backgroundColor = [self.delegate playerViewPreferredWebViewBackgroundColor:self];
        if (webView.backgroundColor == [UIColor clearColor]) {
            webView.opaque = NO;
        }
    }

    webView.scalesPageToFit = YES;
    if ( UI_USER_INTERFACE_IDIOM() == UIUserInterfaceIdiomPad )
    {
        CGSize contentSize = webView.scrollView.contentSize;
        CGSize viewSize = self.bounds.size;
        float scale = viewSize.width / contentSize.width;
        webView.scrollView.minimumZoomScale = scale;
        webView.scrollView.maximumZoomScale = scale;
        webView.scrollView.zoomScale = scale;
        // center webView after scaling..
        [webView setFrame:CGRectMake(0.0, self.frame.origin.y/3, 4096.0, 2160.0)];
    } else {
        webView.frame = self.bounds;
    }
    [webView reload];
    return webView;
}

希望这对尝试在他的项目中使用 Youtube 原始播放器的人有所帮助。

P.S.:我所有的尝试都是用 swift 项目和以下变量完成的:

var playerVars:Dictionary =
        ["playsinline":"1",
         "autoplay":"1",
         "modestbranding":"1",
         "rel":"0",
         "controls":"0",
         "fs":"0",
         "origin":"https://www.example.com",
         "enablejsapi":"1",
         "iv_load_policy":"3",
         "showinfo":"0"] 

使用函数:

self.playerView.load(withVideoId: "Rk6_hdRtJOE", playerVars: self.playerVars)

和以下方法强制解析:

self.playerView.loadVideo(byId: "Rk6_hdRtJOE", startSeconds: 0.0, suggestedQuality: YTPlaybackQuality.HD720)

关于iPads:

正如 Edward 在评论中所报告的那样,iPads 上存在一个小问题,那是因为这些设备似乎不适用 scalesPageToFit。目标是检查设备是否为 iPad,然后缩放(缩小)scrollView 以承载小视图边界。 我已经在我的 iPad air 上进行了测试,它可以正常工作。让我知道。