[Перевод] YouTube-проигрыватель сверхвысокого разрешения на Raspberry Pi

Иногда на стандартном компьютерном экране с разрешением 1920×1080 просто не хватает пикселей для того чтобы разглядеть все детали роликов с YouTube. Эта проблема коснулась и меня. Когда это случилось — я создал устройство, которое позволяет смотреть YouTube со сверхвысоким разрешением.

6tlbow01m_-qbavfmiwyvhfxj-a.jpeg

Обзор проекта


Бывает так, что мне надоедает смотреть ролики с YouTube на HD-мониторе или на телевизоре. Особенно меня расстраивает то, что этим роликам обычно не хватает чёткости. Эту проблему я решил с помощью особого устройства, собранного из Raspberry Pi 3 и светодиодной RGB-панели с фантастическим разрешением 64×64 пикселя.
b42d62eeb9a972cb1f8b95d34be8be18.jpg

Светодиодная RGB-панель
aada203d1564ea6a1ec91ff799dba01d.jpg

Raspberry Pi с платой расширения для подключения RGB-панели

Вот как выглядит просмотр видео на моём проигрывателе.


Просмотр видео на RGB-панели

В этом проекте используются следующие компоненты:

  • Светодиодная RGB-панель DFRobot с разрешением 64×64 пикселя.
  • Одноплатный компьютер Raspberry Pi 3 Model B+.
  • Плата расширения для подключения светодиодной панели к Raspberry Pi — Adafruit Matrix Driver HAT.

Программный код проекта написан на Python.

Сопряжение устройств и подготовка программ


Подробности о подключении светодиодной панели к Raspberry Pi и об установке необходимого программного обеспечения можно почитать здесь. После того, как удастся наладить совместную работу устройств, установим OpenCV:
sudo apt-get update
sudo apt-get install libopencv-dev python-opencv

Далее, так как мы планируем проигрывать видео с YouTube, установим ещё пару библиотек. В частности — библиотеку pafy, которая реализует именно тот функционал, который нас интересует:
sudo python -m pip install youtube_dl
sudo python -m pip install pafy

Теперь, когда предварительная подготовка завершена, поговорим о коде проигрывателя.

Код


Вот полный код моей программы:
import pafy
import time
import sys
import numpy as np
from rgbmatrix import RGBMatrix, RGBMatrixOptions, graphics
from PIL import Image, ImageDraw
url = sys.argv[1]
video = pafy.new(url)
best = video.getbest(preftype="mp4")
options = RGBMatrixOptions()
options.rows = 64
options.cols = 64
options.chain_length = 1
options.parallel = 1
options.hardware_mapping = 'adafruit-hat'
matrix = RGBMatrix(options=options)
matrix.Clear()
import cv2
capture = cv2.VideoCapture()
capture.open(best.url)
success,image = capture.read()

FRAMERATE = 120

while success:
    image_resized = cv2.resize(image, (64,64), interpolation = cv2.INTER_AREA)
    image_resized = cv2.cvtColor(image_resized, cv2.COLOR_BRG2RGB)
    display_img = Image.fromarray(image_resized)
    matrix.SetImage(display_img.convert('RGB'))
    #cv2.imshow('frame',image_resized)
    #time.sleep(1/FRAMERATE)
    success, image = capture.read()

cap.release()
cv2.destroyAllWindows()

В нём реализована следующая последовательность действий:
  • Импорт библиотек.
  • Загрузка видео и преобразование его в нужный формат.
  • Настройка RGB-панели.
  • Создание объекта OpenCV для захвата видео.
  • Обход кадров видео, их преобразование к нужному виду и отправка на RGB-панель.

ea12f0bea3ea78b8d2392f04276024ec.jpg

Видео на RGB-панели

Я написал программу так, чтобы она могла бы, в качестве аргумента командной строки, принимать URL видео, которое нужно воспроизвести. После того, как программа узнаёт адрес видео, для его загрузки и сохранения на устройстве используется библиотека pafy. В программе я указал, что используемая RGB-панель имеет разрешение 64×64 пикселя, и что в проекте применяется плата расширения adafruit-hat. Далее, чтобы помочь OpenCV в деле захвата кадров видео, я создал объект VideoCapture и передал ему видео. И наконец, после того, как изображение готово для вывода на RGB-панель, я применил библиотеку rpi-rgb-led-matrix, которая, с использованием инструментов, импортированных из PIL, выводит изображение. Для этого, в частности, объекты изображений OpenCV преобразуются в объекты изображений PIL:

display_img = Image.fromarray(image_resized)

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

Просмотр видео


Для просмотра видео программу нужно запустить, воспользовавшись такой командой (программе надо передать адрес видео):
sudo python low_res_yt.py 

После этого останется лишь наслаждаться YouTube-роликом сверхвысокой чёткости.

Хотите собрать себе проигрыватель «сверхвысокой» чёткости для YouTube?

oug5kh6sjydt9llengsiebnp40w.png

© Habrahabr.ru