2

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

有什么想法吗?

谢谢,

罗宾

4

2 回答 2

4

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

一种方法是封装音频块(例如,50 ms 块)以通过网络发送。

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

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

一旦你正确地序列化了数据(或者没有,如果两台计算机都使用相同的字节序!),你可以发送()它和 rcev()它,然后将它传递给解码器来处理。

我很乐意提供更多信息,但这是关于我对该主题的了解程度。这实际上取决于您到底在做什么,因此如果没有关于您在做什么的更多细节(例如关于音频格式),很难提供更多信息。

更多信息:

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

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

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

于 2011-04-03T23:35:24.517 回答
2

buffer将是一个指向您分配的数组的指针,该数组用于存储通过网络传输的数据。

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

你可能会做这样的事情:

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

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

于 2011-04-03T23:41:25.920 回答