Оглавление:
- Шаг 1. Получите хороший список IPTV
- Шаг 2: предварительный эксперимент с кодом
- Шаг 3: Добавьте GPIO
- Шаг 4. Интегрируйте оборудование, чтобы выглядеть четко
- Шаг 5: Pi Power
- Шаг 6: интеграция мощности
- Шаг 7: долгосрочное решение кнопки
- Шаг 8: окончательная проверка соответствия
- Шаг 9: Окончательная интеграция
- Шаг 10: наслаждайтесь своим винтажным IPTV
2025 Автор: John Day | [email protected]. Последнее изменение: 2025-01-13 06:58
Я нашел старый портативный телевизор Magnavox 1984 года выпуска, стоящий на полке в моем местном благотворительном магазине. Я подумал про себя: "О, ПРЕКРАСНО!" При дальнейшем осмотре я заметил на нем ценник в 15 долларов, поэтому решил забрать его домой и сделать из него что-нибудь шикарное. Я помню, как в детстве смотрел повторы всех великих классиков в великолепном черно-белом цвете, и хотел снова воплотить это в жизнь.
Проблема в том, что аналоговых станций больше нет, и они совершенно неспособны выполнять какое-либо декодирование ATSC или какое-либо цифровое декодирование. Я заметил наличие AV-соединения сбоку, и у меня было несколько малиновых пи, поэтому я решил отправиться в приключение, чтобы выяснить, как я могу транслировать на него каналы. Я тоже хочу, чтобы он выглядел резким. Я не буду запускать его на 9 батареях D-cell, поэтому я могу спрятать rpi в батарейном отсеке с множеством других вкусностей.
Шаг 1. Получите хороший список IPTV
Ежедневный список IPTV имеет фантастический выбор бесплатных станций IPTV, организованных по странам. Выберите желаемую страну и загрузите файл m3u.
Для программного обеспечения, которое находится в этом, необходим формат m3u. Подробнее об особенностях формата читайте здесь.
Шаг 2: предварительный эксперимент с кодом
Код python, который мы собираемся написать, анализирует файл m3u на список станций.
#! / usr / bin / python3
импорт подпроцесса из sys import argv class Station: def _init _ (self): self.channel = 0 self.name = '' self.address = '' channel_list = с открытым ('./ us-m3uplaylist-2020-08- 17-1.m3u ',' r ') как m3u: i = 0 для строки в m3u: if line.startswith (' # EXTINF '): this = Station () this.name = line.split (', ') [1] line = next (m3u) this.address = line.strip () this.channel = i channel_list.append (this) i = i + 1 process = subprocess. Popen (['vlc', '--loop', '--intf', 'dummy', '--fullscreen', channel_list [int (argv [1])]. адрес])
Давайте разберемся с этим.
#! / usr / bin / python3
Это сообщает bash, что мы будем использовать python3 для интерпретации этого файла.
импорт подпроцесса из sys import argv
Нам понадобится модуль подпроцесса для запуска нашего экземпляра vlc, и нам понадобится argv, чтобы выбрать, в каком канале мы будем запускать vlc.
class Station: def _init _ (self): self.channel = 0 self.name = '' self.address = ''
Это определяет класс под названием Station. Каждый канал будет иметь номер канала, имя канала, взятое из файла m3u, и адрес, откуда этот канал транслируется.
channel_list =
Это список, в котором будут храниться все каналы, извлеченные из файла m3u.
с open ('./ us-m3uplaylist-2020-08-17-1.m3u', 'r') как m3u: i = 0 для строки в m3u: if line.startswith ('# EXTINF'): this = Station () this.name = line.split (',') [1] line = next (m3u) this.address = line.strip () this.channel = i channel_list.append (this) i = i + 1
Этот цикл открывает список воспроизведения m3u и принимает данные. интересующие нас строки файла m3u начинаются с #EXTINF, это указывает на новую запись в файле списка воспроизведения. Следующее интересующее значение - это имя, которое находится в той же строке, что и #EXTINF, но с запятой между ними. Следующая строка этого конкретного m3u - это адрес потока. Итератор «i» используется для подсчета того, какой канал является каким. Этот цикл проходит через весь файл m3u и заполняет список каналов станциями.
process = subprocess. Popen (['vlc', '--loop', '--intf', 'dummy', '--fullscreen', channel_list [int (argv [1])]. адрес])
библиотека подпроцессов позволяет python вызывать процессы (программы) и возвращает PID (идентификатор процесса). Это позволяет python «правильно» управлять запуском и закрытием программ, не заполняя файл истории, или позволяя запускать более произвольный код с помощью общих «системных» вызовов. Каждый элемент массива, используемый в качестве аргумента для Popen, соответствует набранному в командной строке.
vlc --loop --intf dummy - полноэкранные адреса
Вышеупомянутая команда - это то, что нужно запустить, с параметром --loop, исправляющим некоторые проблемы с приостановкой потока при загрузке следующих фрагментов (странные проблемы с m3u8), --intf dummy запускает vlc без интерфейса, просто экран, --fullscreen запускает видео в полноэкранном режиме (НЕЛЬЗЯ!), а адрес является адресом потока. Как вы можете видеть в коде, мы предоставляем адрес из номера канала списка, который предоставляется во время выполнения с помощью оператора argv. Сохраните этот файл как tv_channels.py, измените расположение списка воспроизведения в файле python, чтобы он указывал на ваш список воспроизведения, и вы можете запустить код следующим образом:
python tv_channels.py
Шаг 3: Добавьте GPIO
На схеме показаны два вывода GPIO, используемые для кнопок, и каждый из них имеет подтягивающий резистор, чтобы удерживать вывод GPIO в высоком положении после нажатия кнопки. Определенный ранее код можно улучшить, чтобы сделать операцию немного более плавной, добавив возможности GPIO. Это позволяет нам изменять канал с помощью кнопок, а не клавиатуры и операторов argv, как в случае с realsies tv.
Первое, что следует отметить, это то, что я определил телевидение как класс. Чтобы быть телевизором, мы должны быть на текущем канале, иметь список возможных каналов и иметь возможность менять каналы. В этом примере единственным методом смены каналов будет перемещение вверх по списку каналов и перемещение вниз по списку каналов. Как только канал будет выбран, нам нужно будет запустить VLC на канале, который мы хотим видеть.
#! / usr / bin / python3
from time import sleep import subprocess from sys import argv from gpiozero import Класс кнопки Station: def _init _ (self): self.channel = 0 self.name = '' self.address = '' self.process = '' class Television: def _init _ (self, filename): self.current_channel = 0 self.channel_list = self.build_channel_list (filename) self.start_channel () def build_channel_list (self, filename): с open (filename, 'r') как m3u: i = 0 для строки в m3u: if line.startswith ('# EXTINF'): this = Station () this.name = line.split (',') [1] line = next (m3u) this.address = line. strip () this.channel = i self.channel_list.append (this) i = i + 1 def channel_up (self): self.current_channel = self.current_channel + 1, если self.current_channel> len (self.channel_list): self. current_channel = len (self.channel_list) self.start_channel () def channel_down (self): self.current_channel = self.current_channel - 1, если self.current_channel <0: self.current_channel = 0 self.start_channel () def start_channel (self): try: self.process. kill () за исключением: передать print ('начальный канал% d'% self.current_channel) self.process = subprocess. Popen (['vlc', '-q', '--loop', '--intf', ' dummy ',' --fullscreen ', self.channel_list [self.current_channel].address]) this = Television ('./ us-m3uplaylist-2020-08-17-1.m3u ') channel_UP = Button (18) channel_DN = Кнопка (23) пока True: channel_UP.when_pressed = this.channel_up channel_DN.when_pressed = this.channel_down
В этой итерации кода есть несколько улучшений. теперь он использовал модуль под названием gpiozero, который требуется Raspberry Pi для легкого доступа к функциям контактов GPIO.
sudo apt-get install python3-gpiozero
или
sudo pip установить gpiozero
Как видно из моего кода, я выбрал GPIO 18 и GPIO 23 для каналов ВВЕРХ и ВНИЗ соответственно. В библиотеке gpiozero есть хороший класс для функций кнопок для when_pressed, is_pressed, when_held и т. Д. Это делает его довольно простым. Я выбрал when_pressed, который относится к функции обратного вызова, запускаемой при обнаружении этого сигнала.
Последнее серьезное изменение - включение опции '-q' в вызов подпроцесса VLC. Это просто запускает vlc без вывода всего вывода на терминал, чтобы не было беспорядка, чтобы мы могли видеть информационные операторы печати в коде.
Шаг 4. Интегрируйте оборудование, чтобы выглядеть четко
Я не понял, как я хочу этого добиться, и это будет уникальное решение для каждой используемой модели телевизора. Мне нужно хорошенько подумать об этом и исследовать телевизор, чтобы найти хороший источник питания для пи, как только я запихну компьютер в массивный батарейный отсек. Я также подумал об использовании кнопок часов для выбора канала, так как они уже красиво размещены на телевизоре, а часы все равно не работают. Я опубликую больше, когда найду хорошее решение, но именно здесь Мой проект будет сильно отличаться от всех остальных. Наслаждайтесь интеграцией IPTV, подобной реальному телевидению!
Шаг 5: Pi Power
Для найденной мной модели телевизора требуется блок питания на 12 В. Я осмотрел плату, но не обнаружил очевидных регуляторов мощности для 5 В, поэтому наиболее очевидное место для получения стабильного питания находится на печатной плате, где входит цилиндрический разъем для 12 В. С этим есть очевидная проблема.. мы не хотим жарить пи, поэтому нам понадобится регулятор мощности. Я выбрал понижающий преобразователь мощности MP2315. Это очень дешево и просто в использовании. Мы припаяем вход 12 В постоянного тока от цилиндрического разъема на печатной плате к контактам IN + и GND преобразователя, а VO + - к контакту 2 на Raspberry Pi, а также к GND.
ПЕРЕД этим обязательно включите преобразователь и убедитесь, что на выходе подается правильное напряжение 5 В. Я выбрал самый простой вариант с проводной регулировкой напряжения. Триммер будет регулировать напряжение, поэтому я наблюдал за выходным напряжением с помощью мультиметра, пока регулировал триммер отверткой.
Шаг 6: интеграция мощности
Покопавшись вокруг телевизора, было решено, что лучшее место для сбора энергии - это отрицательная часть цилиндрического разъема и переключатель включения / выключения телевизора, что означает, что мы можем включать и выключать потоки с помощью телевизора, а не то, что постоянное питание пи, потянув его прямо из соединителя цилиндра.
Провода были впаяны и протянуты вдоль стороны печатной платы рядом с корпусом, пока они не достигли задней части устройства, где их пропустили через отверстие в задней части батарейного отсека. Как только они будут пропущены, мы можем подготовить концы кабеля и припаять их к регулятору мощности. Я настроил его на 5 В для питания пи-пи и припаял к нему контакты заголовка, чтобы мы могли подключить перемычки «мама-мама» от регулятора мощности непосредственно к набору заголовков GPIO пи. Обычно это не рекомендуется, так как пи обычно получает питание через UBS, который имеет встроенный регулятор для кондиционирования 5 В, но, поскольку мощность уже регулируется, все должно быть в порядке.
Из-за этого в аудиолиниях возникает некоторый шум, потому что в системе есть контур заземления. Я перепробовал множество точек питания и заземления по всей доске в надежде получить простой ответ, но не нашел ни одной. Я также припаял кабель microUSB к регулятору с переключением режимов, чтобы посмотреть, решит ли проблему принудительная подача питания через внутренние регуляторы пи. Это не так. Решение будет в некоторых изолирующих трансформаторах заземления. Их скорее заказывали, чем строили, потому что они дешевы и красиво упакованы. Вы можете приобрести их в большинстве магазинов или отделов автозвука. Это то, что я выбрал.
Шаг 7: долгосрочное решение кнопки
Несомненно, кнопки не останутся на макетной плате, поэтому необходимо более постоянное решение. Я схватил старую макетную плату и скинул схему вместе с несколькими выводами, чтобы упростить доступ к сигналам. Здесь у всех будут разные мнения о том, как прикрепить или установить кнопки. Я решил сделать их прототипами и просто прикрепил их к шасси так, чтобы ручка, которая поворачивается над экраном для переноски, не мешала. Не стесняйтесь украсить дизайн, добавив 3D-печатный корпус, который упрощает монтаж, используйте гайки и болты, необычные клеи, интегрируйте оригинальные кнопки, что угодно. Пока это работает, нет неправильных ответов.
Они будут установлены снаружи корпуса, а Raspberry Pi будет спрятан внутри очень вместительного батарейного отсека, поэтому потребуется просверлить небольшое отверстие, чтобы кабели могли выходить из батарейного отсека.
Шаг 8: окончательная проверка соответствия
Все оборудование необходимо проверить в последний раз, чтобы увидеть, где именно нужно проделать все отверстия в шасси, а также отверстия какого размера и т. Д. Кроме того, следует продумать, где разместить компоненты для оптимальной простоты подключения и доступа. Короче говоря, убедитесь, что все подходит там, где вы думаете, прежде чем вы непоправимо испортите свой проект и вам придется вытащить шпаклевку.
Шаг 9: Окончательная интеграция
Теперь все оборудование находится там, где оно должно быть, и все оно умещается так же удобно, как жучок в коврике. Давайте порежем! Я нашел место в батарейном отсеке, где я мог бы вывести AV-кабели, используя небольшое углубление в пластике. Я измельчил его с помощью настольного точильного станка. Он довольно быстро с этим справился. Я использовал дремель, чтобы отшлифовать больше пластика, чтобы он хорошо подходил для кабелей.
Последний компонент - это селектор каналов. Я просверлил небольшое отверстие в батарейном отсеке и по одному вытащил из него соединительные кабели. Кнопки были соединены, и я прикрепил макетную плату к пластиковому шасси с помощью двух половин предварительно приклеенной липучки. Я понимаю, что было около 1200 лучших способов сделать это, но это сработало, и у меня было все необходимое под рукой.
Шаг 10: наслаждайтесь своим винтажным IPTV
Это подводит итог. Находите шоу и получайте удовольствие от просмотра. Однако не садитесь слишком близко. Ты сгнишь себе мозг!
Есть много возможностей для улучшения этого проекта, так что двигайте его в любом направлении, в каком захотите, но было весело зайти так далеко. Что касается меня, я запускаю это из cronjob при перезагрузке, поэтому stdout не захватывает сообщения из скрипта python. Я хочу исправить это, чтобы знать, на каком я канале. Еще одно хорошее дополнение - адаптер беспроводной клавиатуры на Pi. Это позволит вам изменить сеть Wi-Fi, если вы выйдете из дома с телевизором. Несмотря на. это был забавный проект, и я не могу дождаться, чтобы приступить к следующему.