Плеер на сайт как добавить


Вставка видео и аудио в HTML, опции плеера

Цель урока: Как вставить видео и аудио в html, форматы файлов

Вставка аудио

Форматы аудио-файлов:

Для вставки аудио-плеера используется следующий код:

<audio controls="controls"> <source src="song.ogg" type="audio/ogg"> <source src="song.mp3" type="audio/mpeg"> </audio>

<audio controls="controls"> <source src="song.ogg" type="audio/ogg"> <source src="song.mp3" type="audio/mpeg"> </audio>

В браузере Google Chrome плеер будет выглядеть:

Атрибуты тега <audio> для плеера:

Атрибут Значение Описание
autoplay autoplay Указывает, что аудио должен начать играть, как только будет готов
controls controls Указывает, что элементы управления воспроизведением должны отображаться
loop loop Указывает, что аудио должно начаться снова, когда оно будет закончено
preload auto
metadata
none
Определяет, должно ли аудио быть загруженным при загрузке страницы
src url Указывает адрес аудио для проигрывания
Другие возможности вставки аудио на сайт
  1. <a href="имя_файла.mp3">Щелкни </a>

    <a href="имя_файла.mp3">Щелкни </a>

  2. <bgsound src="04.wav" loop="5">

    <bgsound src="04.wav" loop="5">

    *только для форматов: wav, mp3, aiff, wma

  3. <embed src="имя_файла.wav">

    <embed src="имя_файла.wav">

Вставка видео

Формат видео-файлов:

<video controls="controls" poster="logo.png"> <source src="movie.mp4" type="video/mp4"> <source src="movie.ogg" type="video/ogg"> Ваш браузер не поддерживает video. </video>

<video controls="controls" poster="logo.png"> <source src="movie.mp4" type="video/mp4"> <source src="movie.ogg" type="video/ogg"> Ваш браузер не поддерживает video. </video>

Результат в браузере:

Атрибуты тега <video> для плеера:

Атрибут Значение Описание
audio muted Определяет по умолчанию состояние звука. В настоящий момент только "muted" разрешено
autoplay autoplay Если указан, видео начнет играть сразу как только оно будет готово
controls controls Если указан, кнопки управления будут показаны, такие как кнопка воспроизведения
height пиксели Указывает высоту видео плеера
loop loop Если указан, видео начнет проигрываться снова, как только закончится
poster url Указывает URL изображения, представляющего видео
preload auto
metadata
none
Если указан, видео будет загружено при загрузке страницы, и готово к запуску. Игнорируется, если "autoplay" указан
src url Адрес URL видео для проигрывания
width пиксели Указывает ширину видео плеера

Пример:

<video src="04.avi" loop="loop" audio="muted">

<video src="04.avi" loop="loop" audio="muted">

Другой вариант вставки видео (без плеера):

<a href="имя_файла.avi">Щелкни и смотри</a> <!-- Пример: --> <a href="ocean.qt"> Видеоклип 1 Мб</a>

<a href="имя_файла.avi">Щелкни и смотри</a> <!-- Пример: --> <a href="ocean.qt"> Видеоклип 1 Мб</a>

* для форматов mpeg, avi

Фавикон Favicon

Фавиконка отображается в адресной строке браузера перед URL страницы, также Фавикон можно заметить во вкладке браузера страницы. Поисковые системы передают Favicon вместе с результатами поиска.

  • файлы с расширением .ico
  • размер 16×16 пикселей

Сервис для преобразования в ico-формат: http://image.online-convert.com/

<html> <head> <link rel="icon" href="favicon.ico" type="image/x-icon"> </head>

<html> <head> <link rel="icon" href="favicon.ico" type="image/x-icon"> </head>

HTML 5: семантические теги

  • Семантические теги обычно несут смысловую нагрузку и не имеют никакого внешнего оформления в html. Но их можно и нужно оформлять стилями CSS. Такие теги важны для удобства читаемости кода и влияют на выдачу поисковиков.
  • Рассмотрим примеры семантических тегов и их использования:
<!doctype html> <html> <head> <meta charset="utf-8"> <title>Заголовок</title> </head> <body> <header> header элемент - здесь следует какая-то информация в заголовке сайта. Обычно это лого компании и иногда дополнительная навигация по сайту. <nav>nav (сокращенное от navigation) элемент - обычно представляет горизонтальное меню для навигации по отдельным частям сайта.</nav> </header> <h2>Главный заголовок страницы</h2> <section> Секция 1 <article>Статья 1</article> <article>Статья 2</article> <article>Статья 3</article> </section> <section> Секция 2 <article>Статья 4</article> <article>Статья 5</article> <article>Статья 6</article> <div>Обычный div, блочный элемент</div> </section> <aside> ASIDE - какая-то информация, имеющая отношение к теме страницы. </aside>   <footer> labs-org.ru, Copyright 2020 </footer> </body> </html>

<!doctype html> <html> <head> <meta charset="utf-8"> <title>Заголовок</title> </head> <body> <header> header элемент - здесь следует какая-то информация в заголовке сайта. Обычно это лого компании и иногда дополнительная навигация по сайту. <nav>nav (сокращенное от navigation) элемент - обычно представляет горизонтальное меню для навигации по отдельным частям сайта.</nav> </header> <h2>Главный заголовок страницы</h2> <section> Секция 1 <article>Статья 1</article> <article>Статья 2</article> <article>Статья 3</article> </section> <section> Секция 2 <article>Статья 4</article> <article>Статья 5</article> <article>Статья 6</article> <div>Обычный div, блочный элемент</div> </section> <aside> ASIDE - какая-то информация, имеющая отношение к теме страницы. </aside> <footer> labs-org.ru, Copyright 2020 </footer> </body> </html>

Задание: Оформите фрагменты готового реферата или курсовой работы в веб-странице, используя семантические теги. Главы работы — это теги section, подглавы — теги article. Не нужно вставлять большие фрагменты текста, это могут быть несколько абзацев на каждый подпункт главы. Все семантические теги должны быть использованы.

sampotts / plyr: простой проигрыватель HTML5, YouTube и Vimeo

перейти к содержанию Зарегистрироваться
  • Почему именно GitHub? Особенности →
    • Обзор кода
    • Управление проектами
    • Интеграции
    • Действия
    • Пакеты
    • Безопасность
    • Управление командой
    • Хостинг
    • мобильный
    • Истории клиентов →
    • Безопасность →
  • Команда
  • Предприятие
  • Проводить исследования
.

Как сделать VLC проигрывателем по умолчанию в браузере Chrome?

Переполнение стека
  1. Около
  2. Товары
  3. Для команд
  1. Переполнение стека Общественные вопросы и ответы
  2. Переполнение стека для команд Где разработчики и технологи делятся частными знаниями с коллегами
.

Введение в инструменты игрока - оружие, жезлы и т. Д.

Инструменты - это особый экземпляр, используемый для реализации оружия, жезлов и других интерактивных инструментов. В этом руководстве вы узнаете, как создавать инструменты, где их разместить в игровой иерархии и как написать базовый сценарий инструмента.

Создание инструмента

Все инструменты начинаются с пустого контейнера, в котором хранятся все экземпляры, составляющие инструмент, включая части, звуковые эффекты и скрипты, обеспечивающие функциональность.

Создание контейнера для инструментов

Чтобы создать новый контейнер для инструментов:

  1. В окне проводника наведите указатель мыши на Workspace и нажмите кнопку.

  2. В разделе Взаимодействие выберите Инструмент .

Вставка деталей или сеток

Любые детали или сетки, добавленные к инструменту, будут моделью, которую видят игроки. Вы можете создавать мечи, ракетные установки, волшебные палочки или почти любой инструмент, который вам нравится!

Инструменты, как и другие модели, могут состоять из нескольких частей.Поскольку игроки будут носить инструменты с собой (или дико размахивать ими, как мечом!), Детали инструмента должны быть сварены вместе с использованием ограничений Weld .

Подтвердите, что все детали не закреплены
При конструировании инструментов убедитесь, что детали инструмента не закреплены на . Если какая-либо часть инструмента закреплена, игроки застрянут на месте, когда наденут его.

Инструменты без деталей
Инструмент можно изготовить без деталей и сеток ! В этом случае инструмент просто становится предметом инвентаря, ожидающим ввода игрока, как магическое заклинание, которое можно сотворить, щелкнув другого персонажа или коснувшись экрана.Чтобы создать инструмент, который не использует сетку или детали, посмотрите свойства инструмента и снимите флажок RequiresHandle .

Регулировка рукоятки инструмента

Инструменты, которые носят игроки, должны содержать одну деталь под названием Ручка . Ручка - это место, где инструмент будет крепиться к руке игрока.

Например, волшебная палочка ниже на самом деле разделена на три части: светящийся наконечник, основной корпус и красную ручку. Когда игрок вооружает палочку, он будет держать ее в той части, которая называется Ручка .

Ручки для поиска и устранения неисправностей
  • Только одна часть должна называться Ручка . Если у вас есть несколько деталей, называемых Ручка , инструмент случайным образом выберет одну из них в качестве точки крепления руки.
  • Деталь Handle должна быть прямым потомком контейнера инструментов - она ​​не может быть вложена в модель или папку внутри контейнера.

Замена держателя инструмента

Если ваш инструмент волочится по земле или смотрит назад, вы можете исправить это, изменив свойства grip инструмента.

Каждый инструмент индивидуален, поэтому вам придется поэкспериментировать с изменением значений рядом со свойствами GripForward , GripRight и GripUp , пока инструмент не будет выглядеть правильно.

Перетаскивание инструмента по земле Инструмент обращен назад Инструмент правильно ориентирован Инструменты

также можно смещать относительно руки персонажа с помощью свойства GripPos . Это может быть полезно при создании инструмента, который должен лежать на плече игрока.

Смещение по умолчанию ( 0,0,0 ) Смещение инструмента до уступа

Настройка значка инструмента

Инструменты, которыми владеет игрок, хранятся в его рюкзаке .На экране это представлено полосой действий , которая показывает каждый инструмент в рюкзаке.

Используйте следующие свойства, чтобы настроить внешний вид инструмента на панели действий:

  • TextureID - Значок инструмента. Установите идентификатор изображения для этого свойства так же, как декали, кнопки изображений и т. Д.
  • ToolTip - Имя всплывающей подсказки при наведении курсора.

Можно / нельзя уронить

По умолчанию игрок может уронить инструмент, нажав клавишу Backspace ( удалить в macOS).Вы можете отключить этот параметр, установив для свойства CanBeDropped инструмента значение false . Если CanBeDropped - это false , нажатие Backspace или delete вернет инструмент в рюкзак игрока.

Добавление инструментов в игру

После того, как ваш инструмент настроен, он должен быть помещен в соответствующую область иерархии объектов вашей игры.

Инструмент для запуска по умолчанию

Если вы хотите, чтобы все игроки начинали с инструмента в своем инвентаре, поместите его в папку StarterPack .Когда любой игрок появляется, инструмент копируется в его рюкзак.

Коллекционный инструмент

Инструмент может быть помещен в рабочую область , если игроки смогут собирать его во время исследования. Например, вы можете разместить гранатомет супергероя в труднодоступной части игрового мира.

Инструмент для работы / покупки

Некоторые инструменты должны быть вознаграждены, когда игрок делает что-то особенное, или выставлены на продажу во внутриигровом магазине. Их следует поместить в ServerStorage , а затем клонировать в рюкзак игрока в нужное время.

Реализация инструментов

Чтобы инструменты могли делать интересные вещи в игровом мире, вам нужно добавить скриптов .

События, связанные с конкретным инструментом

Есть четыре специфических для инструмента условий, с которыми вы можете работать в скрипте инструмента. Они указывают на состояние инструмента и действия игрока с ним.

Инструмент / оборудование | Оборудование Происходит, когда игрок выбирает инструмент из своего рюкзака.
Инструмент / без оборудования | Без оборудования Происходит, когда игрок роняет инструмент или переключает инструменты.
Инструмент / активирован | Активирован Происходит, когда игрок начинает активировать инструмент (щелчки, касания или нажатия A на геймпаде).
Инструмент / Деактивировано | Деактивировано Происходит, когда игрок прекращает ввод активации (отпускает кнопку или касается).

Хотя при разработке инструмента вам могут не понадобиться все четыре условия, этот код можно использовать как базовый шаблон скрипта инструмента:

Этот код предполагает, что сценарий является дочерним элементом первого уровня внутри контейнера инструментов.Если сценарий находится в другом месте, скорректируйте путь в строке 1 (значение , инструмент ), чтобы он указывал на основной контейнер инструментов.

Добавление базового сценария

Вот как добавить в инструмент простой серверный скрипт ( Script ). При экипировке игрок сможет щелкнуть по экрану, чтобы изменить ночь на день и наоборот.

  1. В окне проводника наведите указатель мыши на контейнер инструментов, нажмите и вставьте Script .
  1. Скопируйте следующий код и вставьте его в свой скрипт.
 локальный инструмент = script.Parent локальная функция onActivate () если game.Lighting.ClockTime> = 8 и game.Lighting.ClockTime 
  1. Протестируйте свою игру, возьмите инструмент и щелкните в любом месте игрового мира. Время дня должно меняться с ночи на день и наоборот с каждым щелчком!
Сценарий

против LocalScript

В приведенном выше примере используется только серверный сценарий ( Script ), но для большинства инструментов потребуется как серверный сценарий , так и локальный сценарий ( LocalScript ), каждый из которых заботится об определенных аспектах поведения инструмента.

Запомните эти основные различия между каждым типом скрипта:

  • Скрипт - Управляет изменениями в общем игровом мире, видимыми для всех игроков, такими как открытие двери, стрельба из стрелы и т. Д.
  • LocalScript - управляет вещами, которые происходят только на компьютере / устройстве игрока, например, точно определяет, где касаются экрана или щелкают.

Вот несколько примеров инструментов и аспектов, которыми можно будет управлять с помощью локального или серверного сценария:

Инструмент Локальный скрипт Серверный скрипт
Жезл Творца Определяет, где игрок касается экрана или щелкает по нему. Создает новую деталь в том месте игрового мира, где игрок коснулся или щелкнул.
Плащ-невидимка Временно делает игрока невидимым для всех остальных игроков, пока надет плащ.
Mega-Bow Определяет, как долго игрок активирует инструмент (время между активацией и деактивацией). Выпускает магическую стрелу с большей или меньшей силой, в зависимости от обнаруженного времени активации.
Устранение неполадок инструмента
Инструмент может отлично работать в Studio, но не в живой игре Roblox. Если это произойдет, запомните эти советы:
  • Локальные сценарии и сценарии сервера разделены «стеной», поэтому они не могут напрямую слушать друг друга. Из-за этого вам нужно будет отправить RemoteEvent через стену, чтобы отправлять сообщения между двумя сценариями.
  • Убедитесь, что каждый сценарий ( Script или LocalScript ) выполняет именно то, что должен! Просмотрите примечания и примеры выше для уточнения.
Для получения справки по этой теме см. Удаленные функции и события.

Теперь вы должны быть знакомы с инструментами проектирования, добавлением их в игру и написанием сценариев, которые наделяют их потрясающими возможностями!

.Учебное пособие по потоковой передаче видео

для iOS: начало работы

Вы уже какое-то время работаете над приложениями для iOS и считаете себя довольно ловким. Думаешь, ты все сделал, а?

Да, я понял, ты, наверное, сможешь немного поработать в сети? Возможно, возьмем какой-нибудь JSON и создадим приличную таблицу с ячейками, содержащими текст и изображения.

Это впечатляющий список достижений, но скажите мне…

Вы можете это сделать ??

Правильно, пора вывести ваше приложение на новый уровень и узнать, как добавить потоковое видео!

👏👏👏

На этот раз вы создадите новое приложение для всех тех, кто занимается видеоблогерами из путешествий.Некоторые люди хотят снимать художественные фильмы о своих путешествиях, а некоторые хотят наслаждаться этими впечатлениями, не вставая с постели.

Вы здесь, чтобы воплотить в жизнь обе эти мечты.

В процессе вы изучите основы фреймворков AVKit и AVFoundation.

Начало работы

Примечание : Если вы следуете и строите симулятор, будьте готовы либо отключить точки останова, либо часто нажимать кнопку пропуска. Если вы видите ошибки или предупреждения, начинающиеся с AudioHAL_Client или CUICatalog , не обращайте на них внимания и двигайтесь дальше.

Для начала убедитесь, что вы скачали ресурсы, доступные в верхней части руководства. Затем откройте TravelVlogs.xcodeproj и перейдите к VideoFeedViewController.swift .

Введение в AVKit

Полезный совет разработчиков: всегда отдавайте предпочтение высочайшему уровню абстракции, доступному вам. Затем вы можете перейти на более низкий уровень, когда то, что вы использовали, больше не соответствует вашим потребностям. Следуя этому совету, вы начнете свой путь с видеофреймворка самого высокого уровня.

AVKit находится поверх AVFoundation и предоставляет весь необходимый пользовательский интерфейс для взаимодействия с видео.

Если вы создадите и запустите, вы увидите уже настроенное приложение со таблицей, полной потенциальных видео для просмотра.

Ваша цель - показывать видеопроигрыватель всякий раз, когда пользователь нажимает на одну из ячеек.

Добавление локального воспроизведения

На самом деле есть два типа видео, которые вы можете воспроизводить. Первое, что вы увидите, - это тип, который в настоящее время находится на жестком диске телефона.Позже вы узнаете, как воспроизводить потоковое видео с сервера.

Для начала перейдите к VideoFeedViewController.swift . Добавьте следующий импорт прямо под импортом UIKit .

 импорт AVKit 

Посмотрите ниже, и вы увидите, что у вас уже определены tableView и массив Video s. Вот так существующий tableView заполняется данными. Сами видео взяты из класса видео менеджера.Вы можете посмотреть, как они были получены, в AppDelegate.swift .

Затем прокрутите вниз, пока не найдете tableView (_ tableView: didSelectRowAt :) . Добавьте следующий код к существующему методу:

 // 1 let video = videos [indexPath.row] // 2 пусть videoURL = video.url let player = AVPlayer (url: videoURL) 
  1. Сначала вы берете объект видеомодели.
  2. Все объекты Video имеют свойство url , представляющее путь к видеофайлу.Здесь вы берете URL-адрес и создаете объект AVPlayer .

AVPlayer - это сердце воспроизведения видео на iOS.

Объект проигрывателя может запускать и останавливать ваши видео, изменять скорость их воспроизведения и даже увеличивать и уменьшать громкость. Вы можете думать о проигрывателе как об объекте контроллера, который может управлять воспроизведением одного медиаресурса за раз.

В конце метода добавьте следующие строки, чтобы настроить контроллер представления.

 пусть playerViewController = AVPlayerViewController () playerViewController.player = игрок present (playerViewController, animated: true) { player.play () } 

AVPlayerViewController - это удобный контроллер представления, которому нужен объект player для использования. Как только он появится, представьте его как полноэкранный видеоплеер.

По окончании анимации презентации вы вызываете play () , чтобы начать воспроизведение видео.

Вот и все! Собери и беги, чтобы посмотреть, как это выглядит.

Контроллер представления показывает набор основных элементов управления. Это включает в себя кнопку проигрывателя, кнопку отключения звука и 15-секундные кнопки пропуска для перехода вперед и назад.

Добавление удаленного воспроизведения

Это было довольно просто. Как насчет добавления воспроизведения видео с удаленного URL-адреса? Это наверняка должно быть намного сложнее.

Перейдите на AppDelegate.swift . Найдите строку, в которой подается .видео установлено. Вместо загрузки локальных видео загрузите все видео, заменив эту строку следующей.

 feed.videos = Video.allVideos () 

И… все! Перейдите к Video.swift . Здесь вы можете видеть, что allVideos () просто загружает одно дополнительное видео. Единственное отличие состоит в том, что его свойство url представляет адрес в Интернете, а не путь к файлу.

Постройте и запустите, а затем прокрутите до конца ленты, чтобы найти видео キ ツ ネ 村 (kitsune-mura) или Fox Village.

В этом прелесть AVPlayerViewController ; все, что вам нужно, это URL, и все готово!

На самом деле перейдите на allVideos () и замените эту строку:

 пусть videoURLString = "https://wolverine.raywenderlich.com/content/ios/tutorials/video_streaming/foxVillage.mp4" 

… с этим:

 пусть videoURLString = "https://wolverine.raywenderlich.com/content/ios/tutorials/video_streaming/foxVillage.m3u8 " 

Build and run, и вы увидите, что видео о деревне лисиц все еще работает.

Единственное отличие состоит в том, что второй URL-адрес представляет HLS Livestream. Прямая трансляция HLS работает путем разделения видео на 10-секундные фрагменты. Затем они передаются клиенту по частям. Как вы можете видеть в примере GIF, видео начало воспроизводиться намного быстрее, чем при использовании версии MP4.

Добавление зацикленного предварительного просмотра видео

Вы могли заметить этот черный ящик в правом нижнем углу.Вы собираетесь превратить этот черный ящик в плавающий пользовательский видеоплеер. Его цель - воспроизвести постоянно обновляемый набор клипов, чтобы заинтересовать пользователей всеми этими видео.

Затем вам нужно добавить несколько пользовательских жестов, таких как нажатие для включения звука и двойное нажатие для изменения его скорости в 2 раза. Если вы хотите иметь очень конкретный контроль над тем, как все работает, лучше написать собственный просмотр видео.

Вернитесь к VideoFeedViewController.swift и проверьте определения свойств.Вы увидите, что оболочка этого класса уже существует и создается с набором видеоклипов.

Твоя работа - пускать дела.

Введение в AVFoundation

Хотя AVFoundation может показаться немного пугающим, большинство объектов, с которыми вы имеете дело, по-прежнему довольно высокоуровневые, учитывая все обстоятельства.

Основные классы, с которыми вам необходимо ознакомиться:

  1. AVPlayerLayer : этот специальный подкласс CALayer может отображать воспроизведение данного объекта AVPlayer .
  2. AVAsset : это статические представления мультимедийного актива. Объект актива содержит такую ​​информацию, как продолжительность и дата создания.
  3. AVPlayerItem : динамический аналог AVAsset . Этот объект представляет текущее состояние воспроизводимого видео. Это то, что вам нужно предоставить AVPlayer , чтобы все заработало.

AVFoundation - это огромный фреймворк, который выходит далеко за рамки этих нескольких классов. К счастью, это все, что вам нужно для создания видеопроигрывателя с зацикливанием.

Вы будете возвращаться к каждому из них по очереди, так что не беспокойтесь о их запоминании или о чем-то еще.

Написание пользовательского просмотра видео с помощью AVPlayerLayer

Первый класс, о котором вам нужно подумать, - это AVPlayerLayer . Этот подкласс CALayer похож на любой другой слой: он отображает на экране все, что находится в его свойстве content .

Этот слой просто заполняет свое содержимое кадрами из видео, которое вы дали ему через свойство player .

Перейдите на VideoPlayerView.swift , где вы найдете пустое представление, которое будете использовать для показа видео.

Первое, что вам нужно сделать, это добавить правильный оператор импорта, на этот раз для AVFoundation.

 импортировать AVFoundation 

Хороший старт; теперь вы можете добавить AVPlayerLayer в микс.

A UIView - это просто оболочка для CALayer . Он обеспечивает сенсорное управление и специальные возможности, но не является подклассом.Вместо этого он владеет и управляет свойством нижележащего слоя. Один из отличных приемов состоит в том, что вы можете указать, какой тип слоя вы хотите, чтобы ваш подкласс представления владел.

Добавьте следующее переопределение свойства, чтобы сообщить этому классу, что он должен использовать AVPlayerLayer вместо простого CALayer .

 переопределить класс var layerClass: AnyClass { вернуть AVPlayerLayer.self } 

Поскольку вы оборачиваете слой проигрывателя в виде, вам необходимо предоставить свойство player .

Для этого сначала добавьте следующее вычисляемое свойство, чтобы вам не приходилось все время преобразовывать подкласс слоя.

 var playerLayer: AVPlayerLayer { вернуть слой как! AVPlayerLayer } 

Затем добавьте фактическое определение player с геттером и сеттером.

 var player: AVPlayer? { получить { вернуть playerLayer.player } устанавливать { playerLayer.player = newValue } } 

Здесь вы просто настраиваете и получаете объект player вашего playerLayer . UIView - действительно средний человек.

И снова настоящее волшебство приходит, когда вы начинаете взаимодействовать с самим проигрывателем .

Постройте и запустите, чтобы увидеть…

Вы на полпути, хотя пока не видите ничего нового!

Написание циклического просмотра видео

Затем перейдите к VideoLooperView.swift и приготовьтесь использовать свой VideoPlayerView с пользой. Этот класс уже имеет набор VideoClip s и инициализирует свойство VideoPlayerView .

Все, что вам нужно сделать, это взять эти клипы и выяснить, как воспроизводить их в непрерывном цикле.

Для начала добавьте следующее свойство player.

 частный let player = AVQueuePlayer () 

Проницательный глаз заметит, что это не простой экземпляр AVPlayer . Правильно, это специальный подкласс AVQueuePlayer . Как вы, наверное, догадались по названию, этот класс позволяет вам предоставить очередь элементов для воспроизведения.

Добавьте следующий метод, чтобы начать настройку проигрывателя.

 private func initializePlayer () { videoPlayerView.player = игрок } 

Здесь вы передаете проигрыватель в videoPlayerView , чтобы подключить его к нижележащему AVPlayerLayer .

Теперь пора добавить список видеоклипов в проигрыватель, чтобы он мог начать их воспроизведение.

Добавьте для этого следующий метод.

 private func addAllVideosToPlayer () { для видео в клипах { // 1 let asset = AVURLAsset (url: video.URL) let item = AVPlayerItem (актив: актив) // 2 player.insert (элемент, после: player.items (). last) } } 

Здесь вы просматриваете все клипы. За каждого вы:

  1. Создайте AVURLAsset из URL каждого объекта видеоклипа.
  2. Затем вы создаете AVPlayerItem с активом , который проигрыватель может использовать для управления воспроизведением.
  3. Наконец, вы используете метод insert (_after :) , чтобы добавить каждый элемент в очередь.

Теперь вернитесь к initializePlayer () и вызовите метод.

 addAllVideosToPlayer () 

Теперь, когда у вас настроен проигрыватель, пора выполнить некоторые настройки.

Для этого добавьте следующие две строки:

 player.volume = 0,0 player.play () 

По умолчанию для показа зацикленных клипов будет установлено автоматическое воспроизведение и отключение звука.

Наконец, вам нужно вызвать метод, над которым вы работали.Перейдите к методу init (clips :) и добавьте эту строку внизу.

 initializePlayer () 

Собери и запусти, чтобы увидеть полностью рабочий клип!

К сожалению, по окончании воспроизведения последнего клипа видео проигрыватель становится черным.

Выполнение фактического зацикливания

Apple написала отличный новый класс под названием AVPlayerLooper . Этот класс возьмет элемент для одного игрока и позаботится обо всей логике, необходимой для воспроизведения этого элемента в цикле.К сожалению, здесь это вам не поможет!

Вы хотите иметь возможность воспроизводить всех этих видео в цикле. Похоже, вам придется делать все вручную. Все, что вам нужно сделать, это следить за своим плеером и проигрываемым в данный момент элементом. Когда дойдет до последнего видео, вы снова добавите все клипы в очередь.

Когда дело доходит до «отслеживания» информации об игроке, единственный путь, который у вас есть, - это использовать Key-Value Observing .

Да, это один из самых необычных API, которые придумала Apple. Тем не менее, если вы будете осторожны, это мощный способ наблюдать и реагировать на изменения состояния в режиме реального времени. Если вы совершенно не знакомы с KVO, вот быстрый ответ. Основная идея заключается в том, что вы регистрируетесь для получения уведомлений каждый раз, когда значение определенного свойства изменяется. В этом случае вы хотите знать, когда player currentItem изменяется. Каждый раз, когда вы получаете уведомление, вы будете знать, что проигрыватель перешел к следующему видео.

Первое, что вам нужно сделать, это изменить свойство player, которое вы определили ранее. Перейдите в начало файла и замените старое определение на:

 @objc private let player = AVQueuePlayer () 

Единственное отличие состоит в том, что вы добавили директиву @objc . Это говорит Swift, что вы хотите предоставить свойство объектам Objective-C, например KVO . Чтобы использовать KVO в Swift - намного лучше, чем в Objective-C - вам нужно сохранить ссылку на наблюдателя.Добавьте следующее свойство сразу после player :

 приватный токен var: NSKeyValueObservation? 

Чтобы начать наблюдение за свойством, вернитесь к initializePlayer () и добавьте в конце следующее:

 token = player.observe (\. currentItem) {[слабый я] игрок, _ в if player.items (). count == 1 { сам? .addAllVideosToPlayer () } } 

Здесь вы регистрируете блок, который будет запускаться каждый раз при изменении свойства currentItem проигрывателя.Когда текущее видео изменяется, вы хотите проверить, перешел ли проигрыватель к финальному видео. Если да, то пора снова добавить все видеоклипы в очередь.

Вот и все! Создавайте и запускайте, чтобы ваши клипы зацикливались бесконечно.

Эффективное воспроизведение видео

Прежде чем двигаться дальше, следует отметить, что воспроизведение видео - это ресурсоемкая задача. Как бы то ни было, ваше приложение будет продолжать воспроизводить эти клипы, даже если вы начнете смотреть полноэкранное видео.

Чтобы исправить это, сначала добавьте следующие два метода в нижнюю часть VideoLooperView.swift .

 func pause () { player.pause () } func play () { player.play () } 

Как видите, вы открываете методы play () и pause () и передаете сообщение проигрывателю этого представления .

Теперь перейдите к VideoFeedViewController.swift и найдите viewWillDisappear (_ :) .Там добавьте следующий вызов, чтобы приостановить воспроизведение видео.

 videoPreviewLooper.pause () 

Затем перейдите к viewWillAppear (_ :) и добавьте соответствующий вызов для возобновления воспроизведения, когда пользователь вернется.

 videoPreviewLooper.play () 

Соберите и запустите, и перейдите к полноэкранному видео. Предварительный просмотр возобновится с того места, где он остановился, когда вы вернетесь к ленте.

Игра с элементами управления

Теперь пора добавить элементы управления.Ваши задачи:

  1. Включение звука при однократном нажатии.
  2. Переключение между скоростью 1x и 2x при двойном нажатии.

Вы начнете с реальных методов, необходимых для выполнения этих задач. Сначала вернитесь к VideoLooperView.swift и найдите, где вы добавили свои методы воспроизведения и паузы.

Добавьте следующий обработчик простого нажатия, который будет переключать громкость между 0,0 и 1,0.

 @objc func wasTapped () { игрок.volume = player.volume == 1.0? 0,0: 1,0 } 

Затем добавьте обработчик двойного касания.

 @objc func wasDoubleTapped () { player.rate = player.rate == 1.0? 2,0: 1,0 } 

Это похоже на то, что переключает скорость воспроизведения между 1.0 и 2.0.

Затем добавьте следующее определение метода, который создает оба распознавателя жестов.

 func addGestureRecognizers () { // 1 let tap = UITapGestureRecognizer (target: self, action: #selector (VideoLooperView.wasTapped)) let doubleTap = UITapGestureRecognizer (target: self, действие: #selector (VideoLooperView.wasDoubleTapped)) doubleTap.numberOfTapsRequired = 2 // 2 tap.require (toFail: двойное касание) // 3 addGestureRecognizer (коснитесь) addGestureRecognizer (двойное касание) } 

Комментарий за комментарием:

  1. Сначала вы создаете оба распознавателя жестов и сообщаете им, какие методы вызывать.Вы также говорите двойному касанию, что ему нужно два касания.
  2. Затем вы заставляете одиночное касание ждать, чтобы убедиться, что двойное касание не произойдет. Если вы этого не сделали, метод однократного нажатия всегда будет вызываться немедленно.
  3. Затем вы добавляете распознаватели жестов в просмотр видео.

Чтобы закончить, перейдите к init (clips :) и добавьте следующий вызов метода внизу.

 addGestureRecognizers () 

Build and run снова, и вы сможете нажимать и дважды нажимать, чтобы поиграть со скоростью и громкостью клипов.Это показывает, насколько легко добавить пользовательские элементы управления для взаимодействия с пользовательским просмотром видео.

Теперь вы можете увеличить громкость и перегрузить звук одним касанием пальца. Довольно аккуратно!

Попытка не украсть шоу

В заключение, если вы собираетесь создать приложение с видео, важно подумать о том, как ваше приложение повлияет на ваших пользователей.

Да, я знаю, это звучит ослепительно очевидно. Но сколько раз вы использовали приложение, которое запускает беззвучное видео, но выключает музыку?

Если вы никогда не сталкивались с этой первой мировой пародией, то подключите наушники… Ой, извините.Версия 2018: Bluetooth-подключение наушников. Включите музыку и запустите приложение. Когда вы это сделаете, вы заметите, что ваша музыка выключена, даже несмотря на то, что видеоповтор не издает шума !

Я считаю, что вы должны разрешить своим пользователям выключать свою музыку, вместо того чтобы делать такое смелое предположение. К счастью для вас, это нетрудно исправить, изменив настройки AVAudioSession .

Перейдите к AppDelegate.swift и добавьте следующий импорт в начало файла.

 импортировать AVFoundation 

Затем в верхней части приложения (_: didFinishLaunchingWithOptions :) добавьте следующую строку.

 пытаться? AVAudioSession.sharedInstance (). SetCategory (AVAudioSessionCategoryAmbient, режим: AVAudioSessionModeMoviePlayback, варианты: [.mixWithOthers]) 

Здесь вы сообщаете совместно используемому AVAudioSession , что вы хотите, чтобы ваш звук был в категории AVAudioSessionCategoryAmbient .Значение по умолчанию - AVAudioSessionCategorySoloAmbient , что объясняет отключение звука из других приложений.

Вы также указываете, что ваше приложение использует звук для «воспроизведения фильмов» и что вас устраивает микширование звука со звуком из других источников.

Для окончательной сборки и запуска запустите резервную копию музыки и запустите приложение еще раз.

Теперь у вас есть видео-приложение для балерин, которое дает вам свободу быть капитаном собственного корабля.

Куда идти дальше?

Вы можете скачать окончательный проект, используя ссылку вверху или внизу этого руководства.

Вы успешно создали приложение, которое может воспроизводить как локальное, так и удаленное видео. Он также эффективно рассылает пользователям спам с обзором самых крутых видео на платформе.

Если вы хотите узнать больше о воспроизведении видео, это верхушка айсберга. AVFoundation - это обширный фреймворк, который может обрабатывать такие вещи, как:

  • Захват видео встроенной камерой.
  • Перекодирование между видеоформатами.
  • Применение фильтров к видеопотоку в реальном времени.

Как всегда, я рекомендую посмотреть видеоархив WWDC, когда вы пытаетесь узнать больше о конкретной теме.

Одна вещь, которая, в частности, не рассматривается в этом руководстве, - это реакция на свойство AVPlayerItem status . Наблюдение за статусом удаленных видео позволит вам узнать о состоянии сети и качестве воспроизведения потокового видео.

Чтобы узнать больше о том, как реагировать на изменения этого статуса, я рекомендую Advances in AVFoundation Playback.

Также мы упомянули HLS Live Streaming, но по этой теме можно узнать гораздо больше. Если вас это интересует, рекомендую документацию Apple. Эта страница содержит хороший список ссылок на другие ресурсы, которые вы можете использовать, чтобы узнать больше.

Как всегда, спасибо за чтение, и дайте мне знать, если у вас возникнут вопросы в комментариях!

Raywenderlich.com Еженедельно

Информационный бюллетень raywenderlich.com - это самый простой способ оставаться в курсе всего, что вам нужно знать как разработчику мобильных приложений.

Получайте еженедельный дайджест наших руководств и курсов, а в качестве бонуса получите бесплатный углубленный курс по электронной почте!

.

Смотрите также

Поделиться в соц. сетях

Опубликовать в Facebook
Опубликовать в Одноклассники
Вы можете оставить комментарий, или ссылку на Ваш сайт.

Оставить комментарий