Pull to refresh
2659.3
RUVDS.com
VDS/VPS-хостинг. Скидка 15% по коду HABR15

Проигрыватель для очень медленного воспроизведения видеофайлов

Reading time 8 min
Views 8K
Original author: Tom Whitwell
Карантин — это как раз то время, когда можно сделать особенный «домашний кинотеатр», который украсит интерьер.

В декабре 2018 года Брайан Бойер опубликовал статью о создании проигрывателя для очень медленного воспроизведения видеоклипов (Creating a Very Slow Movie Player). Это — прекрасный этюд о свете, о Бразилии и об архитектуре. Бойер рассказал о разработке устройства с экраном, основанным на электронной бумаге, которое показывает фильмы со скоростью 24 кадра в час, а не 24 кадра в секунду. Примерно год нужен на то, чтобы посмотреть на его проигрывателе 142-минутный фильм «Космическая одиссея 2001 года».


Проигрыватель Брайана Бойера (источник)

С тех пор я каждые несколько месяцев вспоминаю о той статье и посещаю раздел сайта Waveshare (магазина электроники, который находится в Шэньчжэне) с дисплеями на электронной бумаге.

Сейчас там, за $58, продаётся 7,5-дюймовый дисплей, который поставляется вместе со всем необходимым для его подключения к Raspberry Pi. Я, наконец, решился на покупку такого дисплея, а потом, за пару дней, сделал собственный «замедленный кинотеатр».


«Психо» Альфреда Хичкока на моём проигрывателе, смонтированном в рамке из IKEA (фото автора)

Мой проигрыватель вот уже два месяца показывает «Психо» Альфреда Хичкока в углу нашей гостиной. Я, правда, в сравнении с проектом Бойера, немного ускорил воспроизведение. Новый кадр выводится каждые две минуты, при этом воспроизведение идёт с шагом в четыре кадра. То есть — за 24 часа выводятся примерно две минуты экранного времени. На воспроизведение 110-минутного фильма понадобится немного меньше трёх месяцев.

Фильм «Психо» полон прекрасного, которое раскрывается перед зрителем очень медленно. Некоторые сцены, вроде поездки Джанет Ли, шли неделями, а сцена в душе длилась примерно полтора дня.


«Психо» Альфреда Хичкока

Если вы хотите создать собственный VSMP (Very Slow Movie Player, проигрыватель для очень медленного воспроизведения видео) — вам надо будет сделать четыре дела:

  1. Настройте Raspberry Pi так, чтобы этот одноплатный компьютер мог бы работать без монитора, что позволит дистанционно загружать в него файлы и запускать на нём программы.
  2. Подключите Raspberry Pi к экрану на электронной бумаге и установите соответствующий драйвер.
  3. Напишите программу (или воспользуйтесь моей) для извлечений кадров из видеофайлов, для изменения размеров этих кадров и для их дизеринга. То, что получится, нужно будет вывести на дисплей. Программа, кроме того, должна «знать» о том, где именно в воспроизводимом видеофайле находится текущий кадр.
  4. Найдите какую-нибудь рамку для того чтобы оформить с её помощью готовый проигрыватель.

Экран на электронной бумаге, Raspberry Pi, microSD -карта и рамка из IKEA обошлись мне примерно в £120 (около $153).

Обратите внимание на то, что я рассказал в этом материале всё, что знаю о VSMP. Поэтому если у вас при создании собственного проигрывателя появятся вопросы, выходящие за рамки этой статьи, я не смогу на них ответить. Правда, если вы зададите подобный вопрос на GitHub, то, возможно, помочь вам сможет кто-то ещё.


VSMP в действии

Настройка Raspberry Pi


Существует множество руководств, посвящённых настройке Raspberry Pi. Я купил на сайте Pimoroni 2-гигабайтную версию Raspberry Pi 4, блок питания и карту памяти на 64 Гб с записанным на ней установщиком операционных систем NOOBS. Благодаря NOOBS в нашем распоряжении оказываются практически все необходимые библиотеки, поэтому приобретение именно такой карты, которую выбрал я, сильно упростило мне жизнь. (Если вы решите купить карту без NOOBS — обратитесь к этому руководству).

Для того чтобы с платой Raspberry Pi можно было бы работать без традиционного компьютерного монитора — понадобятся два основных инструмента: SSH и SFTP. С помощью SSH можно управлять устройством из командной строки (я использую терминал MacOS), а SFTP позволяет выгружать на устройство файлы (я пользуюсь FileZilla).

После того, как у вас заработает SSH (обычно всё настраивается очень просто) — вы сможете управлять Raspberry Pi через домашнюю WiFi-сеть. Можно будет перемещаться по файловой системе компьютера, запускать приложения, редактировать файлы и так далее. Правда, чтобы это всё делать, надо владеть основами работы с терминалом, но я не думаю, что, в плане использованных мной команд, сильно вышел за пределы ls (вывод списка файлов), cd (смена директории) и nano (это — простой текстовый редактор, к которому, правда, надо привыкнуть).

Ещё я, для решения «тяжёлых» задач, пользовался SFTP, передавая на Raspberry Pi большие файлы фильмов и выгружая написанный мной код, который потом доводил до ума с помощью nano.


Raspberry Pi и плата расширения для подключения дисплея приклеены к рамке из IKEA. Питание подводится к плате снизу, через разъём USB-C.

Подключение дисплея


Сам дисплей невероятно тонок, с ним идёт гибкий PCB-кабель и плата расширения, которая подключается прямо к Raspberry Pi. На экран наклеена защитная плёнка, которую можно убрать.

С физической точки зрения связать экран с Raspberry Pi очень просто: достаточно подключить к GPIO-пинам соответствующую плату расширения. Это — самое большое отличие моего проекта от проекта Брайана Бойера 2018 года.

На Raspberry Pi надо включить SPI. Именно с помощью этого интерфейса плата взаимодействует с экраном. Поэтому данный шаг совершенно необходим. Но сделать это, после того, как налажена работа с платой по SSH, очень просто.

Далее, надо загрузить и установить на Raspberry Pi драйвер дисплея и мой код.

Ниже я исхожу из предположения о том, что вы, как и я, используете NOOBS. Если это не так — то вам может понадобиться самостоятельно установить кое-какие вспомогательные инструменты (Git, Pip, Pil, ffmpeg).

Подключитесь к Raspberry Pi по SSH и, находясь в домашней директории, выполните следующие команды (обратите внимание на то, что во второй строке нужны кавычки):

sudo raspi-config <-- Не забудьте включить SPI
git clone https://github.com/TomWhitwell/SlowMovie/
cd ‘SlowMovie/e-paper/RaspberryPi&JetsonNano/python’
sudo python setup.py install

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

python examples/epd_7in5_V2_test.py


Waveshare-версия «Hello World»

Если ваш экран ничего не показал — проверьте две вещи. Во-первых — удостоверьтесь в том, что включили SPI. Во-вторых — посмотрите, пользуетесь ли таким же дисплеем, как и я (7,5 дюймов, V2).

Если у вас не включён интерфейс SPI, то вы увидите не особенно информативные сообщения об ошибках. Например — такое сообщение:

IOError: [Errno 2] No such file or directory

Когда я попробовал вывести что-то на экран в первый раз, у меня ничего не заработало. Потом — заработало. Потом — опять не заработало. Я был уверен в том, что имею дело с аппаратной проблемой, что я как-то повредил гибкий кабель, на вид довольно хрупкий, которым дисплей подключается к плате. Но проблема была не в «железе». Я просто, сначала, забыл включить SPI, а потом запустил не тот демо-пример.

На плате расширения, которая используется для подключения экрана к Raspberry Pi, есть переключатели. Мои были в таких положениях:

  • Display Config: B: Other.
  • Interface Config: 0: 4-Line SPI.


Моя версия «Hello World» выводит случайные кадры из двухсекундного фрагмента «Психо»

Hello World


Теперь, когда экран подключён к Raspberry Pi и приведён в рабочее состояние, нужно вернуться в папку SlowMovie:

cd ~/SlowMovie

Моя версия программы для замедленного воспроизведения видеофайлов написана на Python. Здесь используются 3 библиотеки:

  • ffmpeg — универсальный инструмент для работы с медиафайлами.
  • ffmpeg-python — ffmpeg-обёртка для Python.
  • PIL — Python Image Library — Python-библиотека для обработки изображений.

Если вы пользуетесь NOOB, то ffmpeg и PIL будут уже установлены. Установка ffmpeg может вызывать некоторые сложности, но этому посвящено множество руководств. Если вы, всё же, сами с этим не справились — просто воспользуйтесь NOOBS.

Установить ffmpeg-python можно такой командой:

sudo pip install ffmpeg-python

После этого в нашем распоряжении должно быть всё необходимое, а значит — можно запустить (находясь в папке SlowMovie) мою версию «Hello World»:

python helloworld.py

Эта программа случайным образом выбирает MP4-файл (в папке уже есть короткий клип test.mp4). Далее, она извлекает из этого файла случайный кадр, меняет его размеры, обрабатывает его и выводит на экран. Полный код программы можно найти здесь. А ниже я привожу самые интересные её части с комментариями:

# Использование ffmpeg для извлечения одного кадра из .mp4-файла, изменение размеров кадра, леттербоксинг, сохранение полученного изображения в локальной файловой системе
def generate_frame(in_filename, out_filename, time, width, height):
    (
        ffmpeg
        .input(in_filename, ss=time)
        .filter('scale', width, height, force_original_aspect_ratio=1)
        .filter('pad', width, height, -1, -1)
        .output(out_filename, vframes=1)              
        .overwrite_output()
        .run(capture_stdout=True, capture_stderr=True)
    )
# Импорт библиотеки для работы с дисплеем, его инициализация и очистка
from waveshare_epd import epd7in5_V2
epd = epd7in5_V2.EPD()
epd.init()
epd.Clear()
# Выяснение количества кадров в файле
frameCount = int(ffmpeg.probe(inputVid)[‘streams’][0][‘nb_frames’])
# Выбор случайного кадра
frame = random.randint(0,frameCount)
# Преобразование номера кадра в тайм-код, используемый ffmpeg
msTimecode = “%dms”%(frame*41.666666)
# Открытие сохранённого кадра в PIL
pil_im = Image.open(“grab.jpg”)
# Преобразование картинки в растровое изображение с глубиной цвета 1 бит (Только нули и единицы)
# Использование алгоритма дизеринга Флойда-Стейнберга
pil_im = pil_im.convert(mode=’1',dither=Image.FLOYDSTEINBERG)
# Вывод изображения
epd.display(epd.getbuffer(pil_im))

Проигрыватель для очень медленного воспроизведения видео


После того, как у вас заработал скрипт helloworld.py, вы можете перенести на устройство свои видеофайлы, воспользовавшись SFTP. Просто разместите их в папке /Videos.

Обращайте внимание на размер вашей карты — если окажется так, что при загрузке данных на почти заполненную microSD-карту часть видеофайла загрузилась, а другой части уже загружаться некуда, вы столкнётесь со странными ошибками.

А вот команда для запуска моего проигрывателя, созданного на довольно-таки любительском уровне:

python slowmovie.py

Программа запоминает место, на котором остановилось воспроизведение видео. Поэтому можно продолжить показ фильма даже после того, как плата Raspberry Pi была выключена и включена.

Мой проигрыватель поддерживает различные опции, справку по которым можно получить такой командой:

python slowmovie.py -h

Например, его можно запустить так:

python slowmovie.py -f 2001.mp4 -d 150 -i 1

Это значит, что он будет воспроизводить файл 2001.mp4, выводя на экран новый кадр каждые 150 секунд. Это даст 24 кадра в час вместо 24 кадров в секунду.

Новые кадры будут выводиться на экран до тех пор, пока работает программа, а после выхода из SSH-сессии этот процесс остановится. Для того чтобы организовать автоматический запуск скрипта slowmovie.py при включении устройства — можно прибегнуть к этой инструкции. По сути же — достаточно отредактировать файл /etc/profile:

sudo nano /etc/profile

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

cd SlowMovie
sudo python slowmovie.py

Завершение работы над проектом


Экран настолько тонкий, что может быть размещён в обычной рамке для фотографий из IKEA. Я использовал рамку, которую купил много лет назад. Она очень похожа на рамку RIBBA. Я убрал стекло и покрасил рамку, после чего прикрепил экран к задней панели рамки. К задней части панели я, с помощью клеевого пистолета, приклеил Raspberry Pi. Конструкция получилась аккуратной и надёжной. Я собираюсь отнести всё то, что у меня получилось, в багетную мастерскую, чтобы там мою конструкцию окончательно довели бы до ума.


Образец алгоритмического искусства, созданный под влиянием Георга Нисса

Что дальше?


  • В каталоге Waveshare есть ещё много интересного. Например — экран, по размеру — такой же, как мой, но с гораздо более высоким разрешением, стоит там $140. Дисплей, похожий на мой, но чуть побольше, стоит $170, а модуль дисплея, который намного крупнее моего, стоит $150.
  • Похоже, что в состав PIL входит лишь алгоритм дизеринга Флойда-Стейнберга. А ведь существует очень много подобных алгоритмов.
  • Хорошо было бы, если бы моя программа могла бы читать .mp4-файлы с USB-флэшки, но мне этого добиться не удалось.
  • Есть много разных видов дисплеев, основанных на электронной бумаге. Некоторые поддерживают частичное обновление экрана. Применение такого дисплея, возможно, позволит избавиться от некрасивого процесса обновления экрана, происходящего каждый раз при смене изображения.
  • После того, как в вашем доме появится небольшой дисплей, подключённый к интернету и хорошо вписывающийся в интерьер, окажется, что использовать его можно разными способами. Мне, например, понравился бы e-paper-проект, реализующий идеи The Clock Кристиана Марклея. Или — что-то вроде House of Dust Элисон Ноулз, или — нечто подобное Computergrafik Георга Нисса.

Планируете сделать себе проигрыватель для замедленного воспроизведения видеофайлов?

Tags:
Hubs:
+42
Comments 21
Comments Comments 21

Articles

Information

Website
ruvds.com
Registered
Founded
Employees
11–30 employees
Location
Россия
Representative
ruvds