Передача звука с компьютера на android

Передаем звук со «спящего» смартфона на сервер — «Хакер»

Передача звука с компьютера на android

О том, что стоящий в твоей комнате традиционный телефон с аккуратно лежащей на нем трубкой все равно может за тобой шпионить, известно чуть ли не со времен А. Г. Белла. Смартфоны продвинулись по этой скользкой дорожке значительно дальше. А как все это выглядит с программной точки зрения?

Введение

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

Исключительно в образовательных целях!

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

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

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

[]

Команды:

  • 0 — успешно выполнено;
  • -1 — произошла ошибка;
  • 1 — подключение клиента;
  • 2 — начало записи;
  • 3 — отправка записанного AAC-файла;
  • 4 — отправка записанного WAV-файла;
  • 5 — потоковая передача данных;
  • 6 — потоковая передача WAV-заголовка.

Клиент

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

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

На борту нашего клиент-телефона установлена операционная система Android. Из этого очевиден выбор языка программирования — им становится Java.

Для написания клиента установим на персональный компьютер IDE Eclipse и Android SDK. Для работы данных компонентов необходим установленный комплект разработчика приложений Java Develovoper Kit. После настройки всех необходимых компонентов подключаем к компьютеру телефон (не забываем про ОС Android) с включенной возможностью отладки по USB.

Теперь ты готов кодить! Создай проект в Eclipse и начинай писать программу. Написать класс для подключения к серверу труда не составит. Основные поля этого класса: Socket (программный интерфейс для обеспечения обмена данными между клиентом и сервером.), IP (адрес для подключения), Port (параметр протоколов TCP и UDP) , поток для приема данных, поток для передачи данных.

Следуя принципам объектно-ориентированного программирования, все поля делаем приватными (private). В этом классе реализуем метод sendPacket() и задаем его тип synchronized. Synchronized имеет два важных момента: это гарантия того, что только один поток выполняет секцию кода в один момент времени, а данные, измененные одним потоком, будут видны всем другим потокам.

В методе sendPacket() при отправке данных создаем блок обработки исключений. Если возникает исключение, информацию о нем записываем в лог и закрываем сокет.

GUI мобильного приложения

Но на этом не стоит останавливаться, потребуется класс для записи данных (звука) (WavRecorder). Для этого класса необходимо описать:

  • количество бит на семпл (описываем в виде константы RECORDER_BPP = 16);
  • количество каналов записи (CHANNELINMONO);
  • формат записи (ENCODINGPCM16BIT);
  • флаг, показывающий, идет ли в данный момент запись (по умолчанию false);
  • идентификатор устройства;
  • IP-адрес сервера;
  • номер порта на сервере.

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

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

Основой этого класса является метод run() (выполняется в отдельном потоке). Будем использовать его для записи звука и отправки данных на сервер — для дальнейшего хранения или обработки. Для потоковой передачи звука создадим «динамический» буфер, в него будут записываться наши данные с микрофона.

public void run() { try { // Подключение к сокету, получение исходящего потока данных, отправка идентификатора устройства } catch (IOException e) { // Обработка возможных ошибок и запись их в лог } byte data[] = new byte[bufferSize]; // Создание буфера while (isRecording) { read = recorder.read(data, 0, bufferSize); // Чтение данных с микрофона в буфер if (AudioRecord.ERROR_INVALID_OPERATION != read) { totalDataSize += data.length; sendPacket(PackageType.client_send_data, data); // Отправка буфера на сервер } } closeSocket(); // Закрытие соединения с сервером}

Подробный код ты можешь посмотреть в файле WavStreamer.java. Для самого простого клиента этих классов и методов будет достаточно. Создадим экземпляр Socket’a и будем коннектиться к серверу (о котором речь пойдет далее). В случае удачного присоединения к серверу программа ожидает дальнейших указаний пользователя о необходимости записи. Если соединение не установлено, пользователь должен быть проинформирован об этом (в нашем случае ошибкой соединения).

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

Читайте также  Почему не включается 3g на андроиде

Для дальнейшего открытия записанного файла в аудиопроигрывателе необходимо записать заголовок, который состоит из определенным образом сформированной последовательности данных (байт).

Схема взаимодействия

Данная последовательность представляет собой определенным образом созданный байтовый массив. Подобный массив описывается во многих интернет-источниках, если тебе не хочется искать его на просторах глобальной сети, то можешь посмотреть в исходниках (он расположен в файле WavStreamer.java).

Казалось бы, все должно работать… Но возникает вопрос: почему не работает? Так как мы пользовались функциями интернета и записи аудио, необходимо сообщить виртуальной Java-машине Dalvik о том, что наше приложение пользуется этими системными функциями. Давай заглянем в файл AndroidManifest.xml и добавим в него следующие строчки:

// Доступ в интернет// Запись звука с микрофона

После этого Java-машина предоставит доступ к запрашиваемым системным функциям, описываемым в манифесте.

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

Сервер

Как и в случае с клиентом, зададимся вопросом: что должен делать сервер? Исходя из задач самого клиента, сервер должен иметь возможность получать данные от клиентов. Данные каждого клиента будут находиться в разных папках и не будут пересекаться с данными других пользователей. Сервер напишем на языке C++ с использованием фреймворка Qt5 (http://qt-project.org/downloads).

Qt — кросс-платформенный инструментарий разработки ПО. Он включает в себя все основные классы, которые могут потребоваться при разработке прикладного программного обеспечения, начиная от элементов графического интерфейса и заканчивая классами для работы с сетью, базами данных и XML.

Одну из основных особенностей Qt составляет повсеместное применение концепции сигналов и слотов, использующихся для взаимодействия между объектами. По своей сути слот — это метод класса, который вызывается, когда происходит какое-либо событие (сигнал). Это сильно облегчает разработку графических интерфейсов или работу с сетью. Достаточно подписаться на какой-то сигнал, который генерирует сам Qt или один из классов программы, и нужная функция-обработчик будет автоматически вызвана при его наступлении.

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

Теперь перейдем к описанию структуры сервера. Основным классом сервера является MyServer, который инкапсулирует в себе объект типа QTcpServer, отвечающий за сетевое взаимодействие. MyServer на вход подается номер порта и IP, на котором будет работать QTcpServer.

В обязанности данного класса входит управление новыми соединениями и перенаправление подключенных клиентов на другой класс. Для начала запустим QTcpServer, передав ему входные данные, и установим обработчик (слот) на сигнал типа newConnection(). Этот сигнал генерируется объектом класса QTcpServer при появлении нового соединения. В случае успешного запуска сервер переходит в режим сканирования порта.

Обработчик новых подключений передает задачу по считыванию поступающих данных на объект типа User.

void MyServer::connection() { from = server — > nextPendingConnection(); User * client = new User; connect(from, SIGNAL(readyRead()), client, SLOT(getMessage()));}

Класс User при помощи функции getMessage() обрабатывает поступающие данные и вызывает соответствующую функцию для обработки запроса от клиента.

void User::getMessage() { static qint32 size_msg = 0, cmd; from = (QTcpSocket * ) sender(); if ((from — > bytesAvailable() > 0 && size_msg) || (from — > bytesAvailable() > 2 * sizeof(qint32))) { QDataStream getm(from); if (size_msg == 0) { getm >> size_msg >> cmd; size_msg -= sizeof(qint32); buf.clear(); } qint8 ch; while (!getm.atEnd() && size_msg > 0) { —size_msg; getm >> ch; buf.append(ch); } if (size_msg * point_func[cmd])(); buf.clear(); getMessage(); }}

Для каждого клиента создается новый каталог, в который записываются файлы клиента. Таким образом, два клиента не будут иметь возможность записывать данные в один и тот же каталог. Файлы, хранящиеся на сервере, могут быть открыты с использованием любого аудиоплеера (для примера был использован VLC media player (https://www.videolan.org) ), который поддерживает воспроизведение файлов формата WAV.

Нет предела совершенству

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

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

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

Заключение

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

Читайте также  Как восстановить переписку в whatsapp android

Источник: https://xakep.ru/2014/09/25/voice-from-sleep-smartphone/

Телефон на Android в качестве беспроводной звуковой карты ноутбука

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

Протестировав несколько приложений для трансляции звука по Wi-Fi, я сделал вывод, что самым гибким из такого рода программ является SoundWire, позволяющее добиться задержки звука не более 100 миллисекунд (при условиях, что телефон довольно мощный, с версией Android 4.2+ и поддерживает режим native audio). А это означает, что уже можно смотреть фильмы без заметного отставания звука.

Примечание: конечно же, в первую очередь, все зависит от мощности и аппаратных возможностей Вашего Android-телефона. Протестировав данное приложение на разных устройствах я сделал вывод, что на старом Android-телефоне (Процессор: 1 ядро, 600 МГц; Память: 256 Мб; Режим аудио: standard_audio) не удается сделать задержку звука меньше 100 миллисекунд и при просмотре фильма чувствуется явное отставание звука.

Приложение обладает достаточно большим набором настроек под любой тип Wi-Fi сети (в плане скорости соединения). В Google Play Маркете есть платная и бесплатная версии. В платной версии доступна возможность установки размера буфера в миллисекундах (в бесплатной только в килобайтах), функция сжатия звука и функция стабилизации размера буфера, позволяющие максимально снизить нагрузку на беспроводную сеть и добиться минимальной задержки звука.

Настройка SoundWire Server в Windows

Скачайте программу SoundWire Server, соответствующую вашей версии Windows и установите её на компьютер.

Убедитесь, что она нормально работает, запустив какую-нибудь музыку в плеере или браузере. В окне программы, в поле «Level», должен отображаться индикатор звука. Если он подымается до уровня красного цвета (искажение звука), отрегулируйте ползунком «Audio Output» уровень звука так, чтобы цвет был только зеленым.

В зависимости от версии Windows ползунок регулятора громкости будет регулировать или уровень звука динамиков ноутбука, или трансляции по Wi-Fi. У меня Windows 8.1, и в моем случае реализован первый вариант, поэтому, чтобы звук от самого ноутбука не мешал, я его просто отключил.

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

Настройка SoundWire на Android

Установите с GooglePlay Маркета приложение SoundWire.

Убедитесь, что Ваш телефон на Android и ноутбук находятся в одной сети Wi-Fi. Откройте приложение SoundWire и нажмите на кнопку с изображением спирали.

После небольшого ожидания спираль должна изменить цвет на золотистый, и Вы должны услышать звук на вашем Android-телефоне. Если этого не произойдет, попробуйте вручную прописать в приложении на Android IP-адрес, который показывает программа SoundWire Server в Windows и снова нажмите на кнопку со спиралью.

Если и в этот раз Вы ничего не услышите, тогда откройте в Windows через кнопку «Пуск» приложение «Командная строка», наберите команду «ipconfig» и нажмите клавишу «Enter». Введите в поле адреса в приложении SoundWire на Android IP-адрес, указанный в строке «IPv4-адрес» командной строки и снова нажмите на кнопку со спиралью.

Уменьшение задержки звука

Для уменьшения задержки звука в приложении SoundWire предусмотрен целый набор инструментов.

Бесплатная версия:

  • Настройка буферизации (Audio buffer size);
  • Сжатие звукового потока, только демо на несколько минут (Audio compression);
  • Включение альтернативного звукового тракта (Android native audio).

Платная версия:

  • Настройка буферизации в миллисекундах (Audio buffer size);
  • Сжатие звукового потока (Audio compression);
  • Включение альтернативного звукового тракта (Android native audio);
  • Уменьшение «плавания» размера буфера (Latency steering amount).

А теперь более подробно о каждой опции.

Audio buffer size

Первое, что можно сделать, чтобы уменьшить задержку звука, это уменьшить размер буфера входящего звукового потока. Для этого нажмите кнопку меню, затем выберите опцию «Settings», в открывшихся настройках нажмите на пункт «Audio buffer size» и выберите желаемый размер буфера.

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

Audio compression (платная версия)

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

Чтобы включить сжатие звукового потока, поставьте в настройках галочку рядом с опцией «Audio compression», нажмите на опцию «Compression bitrate» и выберите битрейт сжимаемого аудиопотока.

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

Как видно из рисунка выше, в моем случае при битрейте 64 кБит/с (как мне кажется, самом оптимальном) скоростьWi-Fi соединения, затрачиваемая на передачу звука, уменьшилась от ~167 до ~18 кБайт/с, то есть примерно в 10 раз!

Android native audio

Внимание: Эта опция поддерживается не всеми устройствами!

При включении опции «Android native audio» выбирается альтернативный внутренний звуковой тракт (OpenSL ES native audio), который может работать лучше и позволяет получить более низкие времена задержки звука на некоторых устройствах, поддерживающих «Android native audio». Опция «Android native audio» имеет три переключателя:

  • Auto – используется native audio с малыми размерами буфера (32 кБ / 190 мс или меньше), а также standard audio с более крупными размерами буфера. Рекомендуется для устройств, которые поддерживают низкую задержку звука (Android 4.2+).
  • Standard audio – рекомендуется для устройств, которые не поддерживают низкую задержку звука. Стандартный звуковой тракт является более надежным, на большинстве устройств Android.
  • Android native audio – выберите, если альтернативный внутренний звуковой тракт работает лучше на устройстве даже при больших размерах буфера, например, если при использовании Auto или Standard audio есть проблемы.
Читайте также  Как настроить плей маркет на телефоне андроид

На некоторых современных телефонах для корректной работы функции «Android native audio» необходимо транслировать звук с частотой дискретизации не 44.1 кГц, а 48 кГц. Требуемая частота дискретизации будет отображаться при нажатии на опцию «Android native audio». Если нужно, перенастройте SoundWire Server и Windows на использование частоты дискретизации 48 кГц (см. документацию).

Latency steering amount (платная версия)

Опция «Latency steering amount» позволяет контролировать, насколько агрессивно SoundWire будет пытаться достичь установленной задержки звука (примерно размер буфера, деленный на 2). Опция имеет три режима: Normal (нормальный), Tight (сжатый), Very Tight (сильно сжатый).

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

Источник: https://it-handbook.ru/android/telefon-na-android-v-kachestve-besprovodnoj-zvukovoj-karty-noutbuka.html

Как организовать стрим аудио с PC на Android через Wi-Fi

Представьте себе такую ситуацию, вы настроили компьютера для домашнего кинотеатра HTPC ( Home Theatre Personal Computer), чтобы смотреть кино с объемным звуком на стационарной акустической системе и изображением на большом экране HD телевизора. Теперь вы можете наслаждаться любимыми фильмами и играми с качественным аудио звуком.

Для обеспечения качественного звука, вы можете подобрать и приобрести оптом портативные колонки на сайте интернет-магазина Смартфокс http://smartfox.net.ua/portativnie_kolonki. Это отличный вариант для небольших помещений.

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

Для подключения наушников, от вашего телевизора или компьютера до кровати или кресла, требуются дополнительные вложения в длинный провод. Можно использовать беспроводные наушники или Bluetooth гарнитуру, но они достаточно дороги для редкого использования. Хуже того, если с вами в такой ситуации оказалось несколько человек, им тоже нужны наушники. Почему бы не использовать другой бесплатный вариант?

Необходимое оборудование: Android телефон, беспроводной маршрутизатор или беспроводная сеть, ПК, программное обеспечение сервера и приложение для Android.

Приложение-сервер может быть установлен на ПК с Windows или Linux. Простое Android приложение SoundWire, которое транслирует аудио потоки с вашего ПК на Android устройство с помощью локальной беспроводной сети.

Идея заключается в том, чтобы превратить ваше Android устройство в беспроводную аудио гарнитуру с помощью беспроводной сети (Wi-Fi). Все, что требуется, это приложение установленное на одном или нескольких Android устройствах и сервер на HTPC.

Сервер SoundWire

Сервер поддерживает такие операционные системы, как Windows XP (и выше) и Linux. Настройка сервера является простой, и производится одним щелчком мыши. Загрузите сервер , для вашей операционной системы с сайт http://georgielabs.net/ и установите его. Просто дважды щелкните на ярлык приложения на рабочем столе, и сервер готов к трансляции потокового аудио.

Окно сервера будет отображать IP-адрес сервера (ПК), количество устройств (Android-устройств), подключенных к нему, регулятор громкости и селектор входного аудиосигнала.

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

Если вы используете автономный DVD-плеер или внешний медиа-плеер, вы можете выбрать режим ввода и маршрут аудио сигнала с проигрывателя к линейному входу компьютера. Сервер также имеет возможность записи потокового аудио в WAV или MP3-файл на жесткий диск.

Приложение SoundWire

Переходя к мобильному приложению, просто зайдите в Google Play и установите бесплатное приложение SoundWire. Существует также платная версия.

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

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

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

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

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

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

Используя этот метод, вы можете наслаждаться музыкой или фильмами, используя высококачественные наушники на вашем Android смартфоне, без использования беспроводных (Bluetooth) наушников.

Источник: http://CataMobile.org.ua/kak-organizovat-strim-audio-s-pc-na-android-cherez-wi-fi.html

Понравилась статья? Поделить с друзьями: