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