通过套接字接收音频文件

时间:2011-04-03 23:30:16

标签: c++ c sockets audio recv

我正在尝试从C中的套接字接收文件(音频,.CAF)(C ++解决方案也可以)。我有套接字通信工作,用字符串测试它。我的问题是我不知道在recv(socket,buffer,buffer_size,0)中为第二个arg提供什么。我应该用什么类型的“缓冲”?我基本上想要收到一个音频文件,然后播放它。但是不知道如何接收音频文件。

有什么想法吗?

谢谢,

罗宾

2 个答案:

答案 0 :(得分:4)

通常,您将以某种格式编码音频。为简单起见,我们假设它是Wave格式。

一种做法是封装音频块(Say,50 ms块),以便通过网络发送。

但是,您不能盲目地通过网络发送数据并期望它能够正常工作。在您的计算机上,数据可以以单向(小端或大端)组织,并且可以在另一台计算机上以相反的方式组织。

在这种情况下,客户端将获得他解释为与您的预期完全不同的数据。所以,你需要以某种方式正确地序列化它。

一旦你正确地序列化数据(或者不是,如果两台计算机使用相同的endianess!),你可以发送()它和rcev()它,然后将它传递给解码器进行处理。 / p>

我很想提供更多信息,但这是关于我对这个主题的了解程度。这实际上取决于你究竟在做什么,所以如果没有更具体的信息就很难提供更多的信息(关于音频格式)。

更多信息:

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

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

编辑:正如本答案的评论所指出的,如果您使用的是标准格式,则根本不应该担心序列化。只需通过网络以解码器可用的块(例如,一次发送一帧)传递它,然后在客户端解码那些单独的帧(或可能是多个帧)。

答案 1 :(得分:2)

buffer将成为指向您已分配用于存储数据的数组的指针。

这取决于您正在使用的套接字库,但通常需要void*(这只是一种通用的指针类型)。

您可能会这样做:

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

它变得棘手,因为这只能为你提供8,000字节的足够空间,这可能不足以容纳你的音频文件,所以你必须处理多个recv()调用,直到你得到整个音频文件。