#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, который устойчив к потере пакетов.