Получить аудиофайл через сокет - PullRequest
2 голосов
/ 04 апреля 2011

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

Есть мысли?

Спасибо,

Робин

Ответы [ 2 ]

4 голосов
/ 04 апреля 2011

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

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

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

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

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

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

Дополнительная информация:

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

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

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

2 голосов
/ 04 апреля 2011

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

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

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

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

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

...