Как сделать радио программу

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

Начну сразу с сути, поэтому определимся с функционалом:

  1. Проигрывание потокового аудио с помощью ExoPlayer.
  2. Парсинг HTML страницы.
  3. Интеграция API Last.fm.
  4. Подключение сервиса для управления проигрыванием из «шторки».
  5. Работа с кастомными библиотеками.

С требованиями разобрались, теперь самое сложное интересное — реализация.

Весь код вы можете найти на GitHub, здесь же я уделю внимание только основным моментам.

Senior Java Developer Открытие , Удалённо , По итогам собеседования

Думаю, что SDK у вас установлено и новые проекты вы создавать умеете, поэтому создадим пустой (blank) проект и добавим библиотеки в build.gradle:

// Animations library compile ‘com.wang.avi:library:2.1.3’ // Connectivity library compile ‘org.jsoup:jsoup:1.8.3’ // Library for load and show images compile ‘com.squareup.picasso:picasso:2.5.2’ // Library for playing audio compile ‘com.google.android.exoplayer:exoplayer:r1.5.3’

Теперь коротко пройдемся по классам:

Делаем настоящее РАДИО #shorts

  1. Player — класс для инициализации и управления нашим ExoPlayer.
  2. NotificationService — класс для проигрывания аудио в фоне и отображения уведомления в шторке.
  3. Const — класс для описания ссылок на аудио и прочего.
  4. CircularSeekBar — класс, который я позаимствовал на GitHub, добавляет нам изогнутый SeekBar.
  5. GetTrackInfo — здесь мы обращаемся к Last.fm, а также парсим HTML страницу.
  6. MainActivity — главный класс приложения, выполняющий функции отрисовки экрана и инициализации методов.

Также добавим пару layout-файлов для шторки и главного экрана, drawables можно найти здесь:

И добавим нашему Manifest несколько разрешений и служб:

Теперь давайте получим ключ Last.fm API, он нужен нам для того, чтобы по имени исполнителя найти его фотографию и показать ее на главном экране. Для этого нужно перейти на страницу создания аккаунта и войти или зарегистрироваться, после чего вам потребуется создать приложение. Эта операция займет 30 секунд, и мы наконец доберемся до API KEY, его вам нужно ввести в поле LAST_FM_KEY класса Const.java:

public static String LAST_FM_KEY = «YOUR_API_KEY»;

Далее предлагаю перейти к способу получения ссылки на прямую трансляцию, ее я беру отсюда. Для этого нам нужно запустить радио и, нажав правой кнопкой мыши в Chrome, выбрать пункт «посмотреть код», после чего выбрать вкладку Network и найти ссылку с самым длинным timeline. Это и будет наш стрим, он уже добавлен в класс Const — аналогичным способом я получил ссылку на HTML-страницу с именем исполнителя и названием трека. В этом коде много костылей, так как парсить HTML — это само по себе странное занятие, но все же я постараюсь его объяснить:

Здесь вы можете видеть получаемый мною нужный фрагмент HTML-страницы:

On Air: Rockabilly Radio (136 connections)

Artist: Mack Stevens

Как создать своё интернет радио бесплатно — сделать своё интернет радио


Track: In The Groove (143)

А это его парсинг, надеюсь, что комментарии будут информативны:

Этот пример кода, вполне возможно, не является лучшей практикой, но все приложение было написано ночью за несколько часов. Парсинг HTML — занятие сложное, и если есть возможность его не использовать, то нужно этой возможностью пользоваться. Надеюсь, мой опыт обработки HTML-страницы кому-то окажется полезным.

Далее парсинг JSON и получение фото пользователя.

Вот пример отправляемого Last.fm JSON-ответа для певицы Adele:

Все, что нас с вами здесь интересует — это изображение размера «mega», парсить мы его будем таким образом:

// Создаем JSONObject и передаем ему на вход наш ответ от Last.fm JSONObject dataJsonObj = new JSONObject(sb.toString()); // После чего проверяем, не ошибка ли пришла if (!isError(dataJsonObj)) < // Если все хорошо, парсим 5й элемент массива, // а именно фото размера «mega» if (dataJsonObj.optJSONObject(«artist»).optJSONArray( «image»).optJSONObject(4).optString(«#text»).toString().length() >10) < MainActivity.album = dataJsonObj.optJSONObject(» artist»).optJSONArray(«image»).optJSONObject(4).optString(«#text»); >else MainActivity.album = «»; >

Теперь немного об ExoPlayer, и почему я не использовал стандартный MediaPlayer. MediaPlayer абсолютно не оптимизирован для таких нагрузок и частенько останавливал трансляцию. Также на старых (старше пятой) версиях Android перемотка, которую я собирался добавить позже, работает так, как будто плеер подгружает всю аудио дорожку между текущим положением и выбранным пользователем. После недолгих поисков выбор пал на ExoPlayer, сейчас коротко опишу его возможности, код ниже можно использовать как отдельный элемент в своем проекте:

Финальный этап урока — это уведомление в шторке, сервис и то, каким образом это работает.

Из главного Activity при начале проигрывания аудио мы запускаем сервис, и он берет всю работу на себя, освобождая работу в Activity. Выглядит это так:

// При нажатии на кнопку проигрывания вызывается эта функция, // и мы запускаем сервис, описанный ранее в Manifest public void startPlayerService()

Сервис управляется с помощью Intent. Когда пользователь нажимает на кнопку «play / pause» в шторке, сервис отправляет Intent сам себе и обрабатывает его, так мы отправляем Intent при нажатии:

views.setOnClickPendingIntent(R.id.buttonID, pplayIntent); PendingIntent pplayIntent = PendingIntent.getService(this, 0, playIntent, 0); Intent playIntent = new Intent(this, NotificationService.class); playIntent.setAction(Const.ACTION.PLAY_ACTION); А так обрабатываем в onStartCommand: if (intent.getAction().equals(Const.ACTION.PLAY_ACTION)) < // Здесь можно изменить изображение на кнопке, // проиграть звук, остановить сервис и многое другое >

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

Источник: tproger.ru

Как создать радиопередачу

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

Читайте также:
Как можно упорядочить структуру программ в меню

Как создать радиопередачу

Статьи по теме:

  • Как создать радиопередачу
  • Как организовать радио
  • Как сделать свое онлайн-радио

Инструкция

Прежде чем создать радиопередачу, продумайте ее концепцию, определите, какова будет ее целевая аудитория, и в зависимости от этого решите, каким образом будет подаваться материал. Можно использовать выдуманного персонажа-интервьюера или рассказчика. Наделите его харизмой и характерными интонациями, по которым он будет легко угадываться слушателями. Такой харизмой может обладать и просто ведущий, способный на креатив. И тут неважно, какой жанр вы выберите, ведь даже материалы академического цикла передач могут быть поданы остро и неожиданно.

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

Подавайте информацию энергично, «с огоньком». Если вы будете активны и позитивны, то сможете «зажечь» и слушателей. Жестикулируйте в студии, не стесняйтесь, это поможет тому, чтобы ваш голос и интонации звучали естественнее. Чтобы «встряхнуть» собеседника, используйте провокационные вопросы.

Не перебивайте интервьюируемого там, где он говорит что-то интересное, внимательно слушайте его, умейте держать паузу. Такая нарочитая «заминка» в конце речи может заставить вашего собеседника продолжить и сказать что-то неожиданное.

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

Освойте специальное программное обеспечение, например, аудио-редакторы Sound Forge или Cool Edit Pro. Научитесь монтировать передачи, вырезать и менять местами их фрагменты, вырезать оговорки, посторонние шумы, накладывать дополнительный звук или музыку. Учитывайте, что речь должна оставаться живой, а излишняя «чистка» может лишить ее естественности и искренности.

Источник: www.kakprosto.ru

Язык программирования Vala и где он используется. Создаем простое приложение для прослушивания радио

Язык программирования Vala и где он используется. Создаем простое приложение для прослушивания радио.

Для создания приложений с GUI под операционные системы GNU/Linux можно использовать практически любой язык программирования. Обычно раньше использовался язык C, но он не поддерживает объектно‑ориентированное программирование и является довольно громоздким и многословным.

C++ более удобен в плане написания прикладных программ. Он, в отличие от C, уже имеет поддержку ООП и более лаконичен.

На языках С и С++ можно писать не только под ОС Linux, но и под другие операционные системы.

Для GTK было создано множество языковых привязок. Кроме уже названых C и C++ для написания GTK‑приложений можно использовать C#, JavaScript, Python и Rust. Дополнительно существуют проекты, благодаря которым можно писать на Java или PHP.

Vala был специально создан для более простой и быстрой разработки приложений с использованием библиотеки GTK. Этот язык уникален тем, что код при компиляции транслируется в код на языке C, а уже потом преобразуется в машинный код. Благодаря этому скорость выполнения программы на Vala схожа со скоростью этой же программы на языке C.

Vala значительно упрощает создание приложений. Он многое вобрал в себя от таких известных языков, как Java и C#. В Vala доступны практически все современные техники программирования. На этом языке можно писать не только прикладной софт, но и системные программы.

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

Примеры простых программ

Как же обойтись без helloworld‑ов в статье об языке программирования? Я тоже не буду отходить от этой традиции. Вот простой пример программы без ООП:

void main()

А в этом примере уже применяются принципы ООП:

class Sample < void run() < stdout.printf(«Hello, Worldn»); >static int main(string[] args) < var sample = new Sample(); sample.run(); return 0; >>

Ниже приводится пример простейшей программы с GUI:

using Gtk; int main(string[] args)

Более подробную информацию об этом языке можно найти на сайте gitbook.io. Здесь помимо теории найдется и множество практических примеров. А на сайте valadoc.org находится официальная документация к языку. Описание всех классов, объектов и методов, а также примеры их использования — все это можно найти на указанном сайте.

У языка с недавних пор имеется и свой вполне современный сайт.

Также существует такой проект, как Elementary, который развивает одноименную операционную систему и свой набор приложений, написанных на Vala. То есть этот язык, по сути, является официальным языком разработки для проекта. На этом сайте можно ознакомиться с полным списком приложений, специально созданных для Elementary.

На Vala уже создано множество полезных приложений. Например, Boxes — это программа для создания и управления виртуальными системами. Gitg — простой графический git‑клиент. Dino — современная программа для обмена сообщениями. Monitor — простой системный монитор.

Для разработки рекомендуется использовать интегрированную среду Builder. Она является официальной IDE для создания приложений под окружение рабочего стола GNOME. Еще можно установить редактор Visual Studio Code со специальным расширением. Дополнительно я еще использую вот это расширение, которое позволяет запускать приложение сразу в песочнице.

Разработчики из GNOME Foundation рекомендуют распространять свои приложения в виде самодостаточных пакетов flatpak и публиковать их на сервисе Flathub. Для этого в среде разработки Builder шаблоны проектов уже содержат манифест для создания flatpak. Разработчику лишь остается правильно его заполнить. Обычно это сводится к прописыванию разрешений и добавлению необходимых модулей.

Читайте также:
Что выведет программа если на вход подать 573

Радио. Начало разработки

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

Писалось оно на основе другого моего приложения. Его репозиторий можно найти здесь.

Итак, передо мной стояла задача создать простое приложение для прослушивания онлайн‑радиостанций. В приложение должен быть интегрирован поиск станций с сайта radio‑browser.info. Из результатов поиска станции должны в один клик добавляться в список избранных. Также необходимо предусмотреть и добавление станций в ручном режиме, через простую форму, где пользователь может ввести название станции и адрес ее потока вещания. Приложение должно быть написано на GTK4 и libadwaita, то есть являться полноценным приложением для среды рабочего стола GNOME.

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

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

Из всех данных мне понадобятся только название станции и ее адрес потока. Я решил отказаться от использования фавиконов и прочих атрибутов. Вследствие этого код значительно сокращается по объему.

Пользовательский интерфейс можно создавать несколькими способами. Для визуального конструирования интерфейса существует приложение Cambalache. Еще есть возможность использовать Blueprint, который отличается непревзойденной лаконичностью и позволяет буквально в несколько строк описать весь UI. С документацией по этому проекту можно ознакомиться здесь.

Я все же выбрал писать интерфейс простым vala‑кодом. Мне так привычнее. Все описание интерфейса находится в файле MainWindow.vala в construct. Сам UI приложения довольно простой и минималистичный. Все в духе философии GNOME!

Главная страница приложения:

Текстовая метка с надписью «Добро пожаловать!» — это часть контейнера Gtk.Box с вертикальной ориентацией, состоящего из двух частей. В верхней части бокса находится уже упомянутая метка с приветствием. В ней отображаются названия станций. В нижней части контейнера располагается другая метка. В ней выводятся заголовки трансляций.

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

Поиск станций

После запуска программы пользователь видит перед собой список из двухсот станций. Я просто не вижу смысла загружать больше. Этот лимит прописан в методе search:

Этот метод используется для формирования списка станций согласно поисковому запросу пользователя, который содержится в переменной text. Сам метод вызывается из метода show_stations:

var stations = new Gee.ArrayList(); var client = new Client(); if(search_box.is_visible())< stations = client.search(entry_search.get_text().down()); >else < stations = client.search(«»); >>

Далее объект stations разбирается на составляющие при помощи цикла foreach. Потом из этих составляющих добываются название станции и ее адрес потока, которые в свою очередь попадают в список:

foreach (var station in stations) < var row = new Adw.ActionRow () < title = station.name.replace(«, «and»).strip(), subtitle = station.url.strip() >; if(station.url != null station.url != «») < list_box.append(row); >>

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

Что касается самой поисковой строки, то в зависимости от страницы приложения она имеет разный вид. Так для первой страницы справа от строки есть кнопка, при нажатии на которую начинается процесс поиска:

На второй странице, само собой, этой кнопки нет. В принципе, эта кнопка не нужна, так как поиск можно начать, нажав на Enter, но я все‑таки решил ее оставить.

Избранное

Для того чтобы добавить станцию в список избранных, пользователю достаточно нажать на соответствующий значок в хидербаре. Но не все так просто, как хотелось бы. Нужно учитывать, что у станции в списке может отсутствовать, например, название, и тогда надо отправить пользователя на специальную страницу для его ввода. Или же название может быть некорректным (к примеру, содержать недопустимые символы), тогда пользователь также должен быть отправлен на ту же страницу, но уже для правки названия. Если же у станции напрочь отсутствует URL потока, то тогда не остается ничего, кроме как вывести сообщение об ошибке.

Страница с избранными станциями выглядит примерно так:

Как видно, хидербар здесь состоит из большего количества кнопок. Тут присутствуют функции для добавления станции по имени и URL, для удаления и редактирования станций и для показа/скрытия строки поиска. Кнопки, расположенные справа (пуск/стоп, запись, меню), отображаются на всех страницах.

Переключение страниц основано на компоненте Gtk.Stack. В него в виде дочерних элементов добавлены два списка станций и страница редактирования. Бокс с метками для вывода названия станций и заголовков трансляций в стек не входит.

Директории

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

Также в отдельной папке хранится и информация о последней прослушанной станции. В этой папке находятся два файла. В одном хранится название станции, а в другом — ее URL.

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

Читайте также:
Самые популярные программы TV

Все эти директории создаются при первом запуске приложения. Вот как это реализовано для папки избранных станций:

favorite_stations_directory_path = Environment.get_user_data_dir()+»/favorite-stations»; GLib.File favorite_stations_directory = GLib.File.new_for_path(favorite_stations_directory_path); if(!favorite_stations_directory.query_exists())< try< favorite_stations_directory.make_directory(); >catch(Error e) < stderr.printf («Error: %sn», e.message); >>

Все эти директории создаются в изолированной среде, и таким образом приложению не нужен доступ к файловой системе.

Настройки и потоки

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

Про первые две настройки вроде все понятно — нужные, в принципе, вещи. А вот зачем понадобилась третья настройка? Дело в том, что в первых выпусках приложения поиск работал очень медленно. Все из‑за того, что метод search попросту отсутствовал и поиск осуществлялся посредством метода get_stations. Позже, когда поиск был значительно улучшен, эту настройку решено было не убирать, так как поиск все равно продолжает работать при ее активном состоянии, а видеть первоначальный список станций нужно далеко не каждому пользователю.

В последних версиях программы поиск/показ станций происходит в отдельном потоке:

if(Thread.supported())< new Thread(null, show_stations).join(); >else

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

Заголовки трансляций и запись

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

player.media_info_updated.connect ((obj) => < string? title = extract_title_from_stream (obj); if (title != null) < current_title.show(); current_title.set_text(title); title_changed(title); >else < current_title.hide(); >>);

Благодаря тому, что к объекту player подсоединен сигнал media_info_updated, данные в текстовой метке current_title постоянно обновляются в соответствии с изменениями в потоке.

Способ записи вещания станций был взят из приложения Reco. Код был несколько упрощен. Были удалены ненужные форматы и добавлено определение даты и времени для составления имени mp3-файла.

Комбинации клавиш

Для удобства пользователя в приложение были добавлены различные комбинации клавиш. Эти комбинации позволяют осуществлять показ или скрытие строки поиска, а также инициировать начало поиска. Также с помощью, например, клавиши пробела можно запускать или останавливать воспроизведение. Для выхода из приложения тоже существует определенная комбинация. Вот как это было сделано:

var event_controller = new Gtk.EventControllerKey (); event_controller.key_pressed.connect ((keyval, keycode, state) => < if (Gdk.ModifierType.CONTROL_MASK in state keyval == Gdk.Key.q) < app.quit(); >if (Gdk.ModifierType.CONTROL_MASK in state (keyval == Gdk.Key.f || keyval == Gdk.Key.s)) < on_search_clicked(); >return false; >); event_controller.key_released.connect ((keyval, keycode, state) => < if (search_box.is_visible() stack.visible_child == scroll keyval == Gdk.Key.Return) < on_start_search_clicked(); >if (!search_box.is_visible() (stack.visible_child == scroll || stack.visible_child == favorite_scroll) (keyval == Gdk.Key.space || keyval == Gdk.Key.Return))< if(current_state == PlayerState.PLAYING || current_state == PlayerState.BUFFERING)< on_stop_station(); >else < on_play_station(); >> return; >); ((Gtk.Widget)this).add_controller(event_controller);

Как видно, для клавиши ввода (Return) потребовалось подключать отдельный сигнал (key_released), так как на другой сигнал (key_pressed) не было никакой реакции. А все потому, что сигнал key_pressed не рассчитан на использование с клавишей Return.

Libadwaita

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

private void set_toast (string str)

Контейнер для списка станций это обычный Gtk.ListBox, но в него добавлены адвайтовские ActionRow, в которых определены свойства title и subtitle.

Страница редактирования это Gtk.ListBox со встроенными в него дочерними элементами Adw.EntryRow. В эти EntryRow в качестве суффиксов добавлены кнопки для очистки полей:

Диалоговые окна принадлежат классу Adw.MessageDialog. Вообще, все окна в приложении из Адвайты. Вот пример метода alert, который используется для вывода простого окна сообщения:

private void alert (string heading, string body) < var dialog_alert = new Adw.MessageDialog(this, heading, body); if (body != «») < dialog_alert.set_body(body); >dialog_alert.add_response(«ok», _(«_OK»)); dialog_alert.set_response_appearance(«ok», SUGGESTED); dialog_alert.response.connect((_) => < dialog_alert.close(); >); dialog_alert.show(); >

Переход на GNOME 44

Недавно вышла новая версия среды GNOME под номером 44. Естественно, я решил обновить все свои приложения, включая и Radio.

При сборке пакета flatpak меня ждало сообщение об ошибке, гласящее, что библиотека libsoup-2.4 не обнаружена. Разработчики решили удалить эту версии из новой платформы. Я не захотел переходить на третью версию библиотеки, так как пришлось бы переписывать некоторую, хоть и небольшую, часть кода. Проще всего прописать модуль для старой версии библиотеки в манифесте программы. Так я и поступил:

После добавления модуля в манифест сборка пакета прошла успешно.

При добавлении модулей в манифест нужно указывать именно commit в разделе sources. Если вместо commit указать branch, то в вашей IDE проект, скорее всего, соберется, а вот сборочный бот в системе Flathub может выдать ошибку.

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

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

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

НЛО прилетело и оставило здесь промокод для читателей нашего блога:— 15% на все тарифы VDS (кроме тарифа Прогрев) — HABRFIRSTVDS

Источник: habr.com

Рейтинг
( Пока оценок нет )
Загрузка ...
EFT-Soft.ru