iOS YTPlayerView принудительное качество видео

В настоящее время я использую библиотеку iOS-youtube-player-helper в нашем приложении. Существует контроллер представления с YTPlayerView, который имеет соотношение сторон 16:9, что означает, что он занимает только часть экрана. Видео загружается в среднем формате, и, как бы то ни было, я не смог заставить его воспроизводиться в формате 720P или 1080P. Я уверен, что эти качества доступны, просто YTPlayerView форсирует качество в зависимости от высоты видеоплеера. Поскольку это библиотека, а не прямое встраивание iframe, я не могу использовать параметр «vq» (указание vq в playerVars, похоже, не работает), и установка низкого качества, а затем изменение его позже также не работает (см. эта проблема на GitHub)

Теперь, учитывая тот факт, что я не могу заставить YTPlayerView заполнять весь экран из-за проблем с дизайном пользовательского интерфейса. Итак, можно ли заставить YTPlayerView играть хотя бы в 720P? (Обходные пути, изменение кода библиотеки,...)

Поскольку это приложение будет в App Store (и, конечно же, мы не хотим иметь никаких юридических споров с Google), пожалуйста, не предлагайте использовать библиотеки, которые противоречат ToC Youtube, такие как XCDYouTubeKit

Огромное спасибо


person Nicholas    schedule 05.01.2017    source источник


Ответы (1)


Я нашел обходной путь, и это хорошо работает для меня.

Прежде всего, проблемы зависят от размера webView, построенного внутри YTPlayerView. Например, если у вас есть playerView 320x200, попробуйте принудительно настроить видео на 720hd, это не сработает, потому что класс проигрывателя iFrame youtube повторно переключается на лучшее разрешение в соответствии с размером вашего проигрывателя (в этом случае низкое качество, потому что у вас есть 320x200).

Вы можете увидеть этот ответ SO, объясняющий эту проблему.

Когда вы импортировали класс YTPlayerView в свой проект, у вас есть два файла: YTPlayerView.h и YTPlayerView.m.

YTPlayerView.m (обновление для работы также на iPad)


Я изменил функцию, в которой веб-просмотр инициализируется с нестандартным размером (разрешение 4k), и в последнюю часть я добавил возможность масштабировать содержимое и восстанавливать исходный кадр, например:

- (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.: все мои попытки были сделаны с быстрым проектом и следующими варами:

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)

Об iPad:

Как сообщил Эдвард в комментариях, на iPad была небольшая проблема, потому что эти устройства, похоже, не применяются scalesPageToFit. Цель состоит в том, чтобы проверить, является ли устройство iPad, а затем масштабировать (уменьшить масштаб) scrollView для размещения небольших границ представления. Я проверил на своем iPad Air, и он работает. Дай мне знать.

person Alessandro Ornano    schedule 29.07.2017
comment
Спасибо. Я попробую завтра. - person Nicholas; 30.07.2017
comment
Похоже, это решение работает только на iPhone, есть ли способ заставить его работать и на iPad? - person Nicholas; 14.08.2017
comment
@Edward У вас есть абсолютная причина: спасибо за ваш отчет, я исправил функцию, чтобы она работала также на iPad .. - person Alessandro Ornano; 14.08.2017
comment
Спасибо, этот новый код работает на iPad. Однако у меня возникла проблема, когда webView YTPlayerView выходит за пределы YTPlayerView. В моем случае, когда я проверяю интерфейс, я вижу, что YTPlayerView имеет высоту 768 и ширину 432, тогда как базовый webView имеет размеры 2160 и 4096. Если я устанавливаю clipToBounds YTPlayerView, веб-просмотр обрезается, в противном случае весь мой экран заполнено. Есть ли что-то, что я мог упустить, например, ограничение или что-то в этом роде? Кстати, я тестирую это и на ios 9.0, и на 9.3. - person Nicholas; 15.08.2017
comment
Кажется, scalesPageToFit контент неправильно масштабируется на устройствах iPad, дайте мне время подумать о разумном обходном пути, чтобы применить это масштабирование вручную. - person Alessandro Ornano; 15.08.2017
comment
Вы уже нашли решение? - person Nicholas; 17.08.2017
comment
Да, чувак, помни, что это всего лишь обходной путь. Масштабирование не похоже на scalesPageToFit, возможно, расчет масштаба можно было бы улучшить, но это хорошая точка для начала. Дайте мне знать ваше мнение. - person Alessandro Ornano; 17.08.2017
comment
Это все еще не работает, так как мое приложение сразу вылетает. Мне удалось встроить веб-просмотр в прокрутку, а затем установить масштаб внешнего прокрутки, что также уменьшило размер элементов управления плеером, особенно на меньшем экране. Какие-либо предложения? - person Nicholas; 19.08.2017
comment
Пожалуйста, решение с WKWebView iOS 12 - person user924; 07.05.2019
comment
Будьте осторожны: иногда это приводило к тому, что наше приложение переставало отвечать на запросы. Он застрял бы на этой строке: UIWebView *webView = [[UIWebView alloc] initWithFrame:frame]; - person Jordan H; 02.11.2020