我正在尝试从 C 中的套接字接收文件(音频,.CAF)(C++ 解决方案也可以)。我已经用字符串测试了套接字通信。我的问题是我不知道要为 recv(socket, buffer, buffer_size, 0) 中的第二个参数提供什么。我应该制作什么类型的“缓冲区”?我基本上想接收一个音频文件,然后播放它。但不知道如何接收音频文件本身。
有什么想法吗?
谢谢,
罗宾
通常,您将以某种格式对音频进行编码。为简单起见,我们假设它是 Wave 格式。
一种方法是封装音频块(例如,50 ms 块)以通过网络发送。
但是,您不能盲目地通过网络发送数据并期望它能够正常工作。在您的计算机上,数据可能以一种方式组织(小端或大端),而在另一台计算机上可能以相反的方式组织。
在这种情况下,客户将获得他解释为与您的预期完全不同的数据。因此,您需要以某种方式正确序列化它。
一旦你正确地序列化了数据(或者没有,如果两台计算机都使用相同的字节序!),你可以发送()它和 rcev()它,然后将它传递给解码器来处理。
我很乐意提供更多信息,但这是关于我对该主题的了解程度。这实际上取决于您到底在做什么,因此如果没有关于您在做什么的更多细节(例如关于音频格式),很难提供更多信息。
更多信息:
http://en.wikipedia.org/wiki/Serialization
http://en.wikipedia.org/wiki/Endianness
编辑:正如在这个答案的评论中指出的那样,如果您使用标准格式,您可能根本不应该担心序列化。只需将其以解码器可用的块的形式通过网络传递(例如,一次发送一帧),然后在客户端解码这些单独的帧(或可能是多个帧)。
buffer
将是一个指向您分配的数组的指针,该数组用于存储通过网络传输的数据。
这取决于您使用的套接字库,但通常它需要void*
(这只是一个通用指针类型)。
你可能会做这样的事情:
uint8[1000] myBuffer;
recv(sock,myBuffer,1000,0);
它变得很棘手,因为这只为您提供了足够的 8,000 字节空间,这可能不足以容纳您的音频文件,因此您必须处理多个 recv() 调用,直到获得整个音频文件。