Я хочу написать что-то вроде Skype, то есть у меня есть постоянный аудиопоток на одном компьютере, а затем перекомпрессировать в формате, подходящем для скрытого подключения к Интернету, получить его на другом конце и воспроизвести это.
Давайте также предположим, что интернет-соединение довольно современное и быстрое, т.е. DSL или аналогичное, без медленных соединений по телефону и тому подобное. Эти компьютеры также будут довольно современными (двухъядерные процессоры Intel с тактовой частотой 2 ГГц или более).
Я знаю, как обращаться с аудио на машинах. Чего я не знаю, так это как эффективно передавать звук.
Проблемы:
Я бы хотел получить хорошее качество звука через линию.
Поток должен быть принят без капель. Однако поток может быть принят с небольшой задержкой (допустима вторая задержка). Я предполагаю, что программное обеспечение транспорта может сначала определить среднюю (и максимальную) задержку, а затем запустить поток и сказать получателю, чтобы он ожидал этой максимальной задержки, прежде чем начать воспроизведение аудио. При этом, если задержка не становится больше, весь поток будет воспроизводиться на другой стороне без заиканий и падений.
Если из-за непредвиденных задержек или блокировок IP поток действительно обрезается, я хочу иметь возможность заметить это, чтобы я мог предпринять действия (например, прервать поток) и в конце концов начать новую передачу.
Какие есть варианты, если я хочу использовать готовое программное обеспечение для сжатия и передачи? На самом деле я не собираюсь писать свой собственный механизм сжатия звука. ОТО, я планирую продавать решение на вертикальном рынке, то есть я могу позволить себе несколько долларов лицензионных сборов за копию, но не 100 долларов.
Полагаю, самым простым решением было бы просто открыть поток TCP, отправить несколько пакетов назад и вперед, чтобы определить их время выполнения (или даже использовать для этого UDP), а затем использовать результаты в качестве руководства для моего значения максимальной задержки затем просто запустите аудиоданные в их необработанном виде (несжатый 16-битный стереозвук) вместе с временным кодом через соединение TCP. Приемник считывает данные и воспроизводит их с заранее определенной задержкой. Это может работать только с ожидаемым типом быстрого соединения.
Мне просто интересно, есть ли лучшие решения для достижения этой цели, с лучшей производительностью (меньшая задержка) и меньшим количеством данных (сжатые).
Кстати, я сначала пытаюсь реализовать это на OS X, но, возможно, захочу сделать это и на Windows, если это окажется успешным.