Получить аудиофайл через сокет

Я пытаюсь получить файл (аудио, .CAF) из сокета в C (решение C++ также подходит). У меня работает связь через сокет, протестировав ее со строками. Моя проблема в том, что я не знаю, что передать второму аргументу в recv (socket, buffer, buffer_size, 0). Какой тип я должен сделать "буфер"? Я в основном хочу получить аудиофайл, а затем воспроизвести его. Но не знаю, как получить сам аудиофайл.

Есть предположения?

Спасибо,

Робин


person Robin    schedule 03.04.2011    source источник


Ответы (2)


Как правило, у вас будет звук, закодированный в каком-либо формате. Для простоты предположим, что это формат Wave.

Один из способов сделать это — инкапсулировать фрагменты аудио (скажем, фрагменты по 50 мс) для отправки по сети.

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

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

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

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

Еще немного информации:

http://en.wikipedia.org/wiki/Сериализация

http://en.wikipedia.org/wiki/Endianness

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

person Mike Bailey    schedule 03.04.2011
comment
Я считаю, что проблемы сериализации/порядка байтов должны решаться самим форматом файла, если только он не предназначен для кроссплатформенного формата файла. - person user470379; 04.04.2011
comment
Таким образом, можно было бы с уверенностью предположить, что если я передал несколько волновых кадров по своей сети, я могу разумно ожидать, что на другом конце они придут в правильном направлении? Я никогда раньше не сталкивался с этой проблемой, так как занимался только базовыми сетями. - person Mike Bailey; 04.04.2011
comment
Вы можете ожидать, что порядок следования байтов останется таким же, как указано в формате файла. Это позволяет передавать файл любым способом с платформ, различающихся порядком байтов. Порядок байтов формата файла может отличаться от порядка байтов целевой платформы, но об этом должен позаботиться декодер. - person user470379; 04.04.2011

buffer будет указателем на массив, который вы выделили для хранения данных, поступающих по сети.

Это зависит от используемой вами библиотеки сокетов, но обычно ожидается void* (это просто общий тип указателя).

Вы можете сделать что-то вроде этого:

uint8[1000] myBuffer;
recv(sock,myBuffer,1000,0);

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

person Alan    schedule 03.04.2011