Потоковая передача звука с микрофона на Mac на iPhone

#iphone #macos #cocoa #audio #streaming

#iPhone #macos #какао #Аудио #потоковая передача

Вопрос:

Я работаю над личным проектом, в котором iPhone подключается к приложению серверного типа, работающему на Mac. iPhone отправляет и получает текстовые / ASCII-данные через стандартные сокеты. Теперь мне нужно передать микрофон с Mac на iPhone. Я уже проделывал некоторую работу с аудиосервисами раньше, но хотел проверить свои мысли здесь, прежде чем углубляться.

Я думаю, что могу:
1. Создать очередь аудио в стандартном приложении Cocoa на Mac.
2. В моей функции обратного вызова очереди аудио вместо записи в файл запишите его в другой сокет, который я открываю для потоковой передачи аудио.
3. На iPhone получите необработанные сэмплированные / закодированные аудиоданные из потока TCP и сбросьте их в аудиопроигрыватель очереди, который выводит на наушники / динамик.

Я знаю, что это непростая задача, и я значительно упростил то, что мне нужно сделать, но может ли это быть так просто?

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

Ответ №1:

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

  • Буферизация. В конце «запись» вы, вероятно, не хотите блокировать очередь аудио, если буфер заполнен. В конце «воспроизведения» я не думаю, что вы можете просто передать буферы в очередь (IIRC вам нужно будет буферизировать его, пока не получите обратный вызов).
  • Параллелизм. Я почти уверен, что обратные вызовы AQ происходят в их собственном потоке, поэтому вам понадобятся какие-то блокировки / барьеры вокруг ваших обращений к буферу.
  • Буферные пулы, если выделение памяти приводит к большим накладным расходам.
  • Сжатие. Возможно, AQ сможет предоставить вам кадры «IMA4» (IMA ADPCM 4: 1 или около того); Я не уверен, выполняет ли он аппаратную декомпрессию MP3 на iPhone.
  • Пакетирование, если, например, вам нужно чередовать голосовой чат с текстовым чатом.
  • РЕДАКТИРОВАТЬ: синхронизация воспроизведения (или как вы должны это называть). Вы должны иметь возможность обрабатывать различные эффективные тактовые частоты звука, будь то из-за изменения задержки или чего-то еще. Skype делает это, изменяя скорость воспроизведения (с коррекцией высоты тона).
  • РЕДАКТИРОВАТЬ: потеря пакетов. Возможно, вам удастся избежать проблем с использованием TCP по короткому каналу связи, но это во многом зависит от качества вашей беспроводной сети. UDP — это небольшая проблема для правильного использования (особенно если вам нужно обнаружить отверстие MTU).

В зависимости от ваших скоростей передачи данных, возможно, стоит использовать API сокетов более низкого уровня (BSD) и, возможно, даже использовать readv() / writev().

Если все, что вам нужно, это услуга «онлайн-радио», и вас не волнует используемый протокол, возможно, проще использовать AVPlayer / MPMoviePlayer для воспроизведения звука с URL-адреса. Это включает в себя реализацию сервера, который использует потоковый протокол HTTP от Apple; Я полагаю, что у Apple есть некоторый пример кода, который делает это.

Комментарии:

1. Спасибо за идеи, tc. Вы упомянули вещи, которые не приходили мне в голову. Это просто потоковое аудио, но для буферизации требуется низкая задержка. Я читал, что потоковый сервер Quicktime может задерживаться на целых 30 секунд, мне нужно приблизить его к 1 секунде. Почти в реальном времени, что-то вроде задержки VoIP.

2. В этом случае, в зависимости от того, насколько плохое соединение, вы можете захотеть использовать протокол на основе UDP, который устойчив к потере пакетов.