C++ 通过套接字接收音频文件

C++ 通过套接字接收音频文件,c++,c,sockets,audio,recv,C++,C,Sockets,Audio,Recv,我正在尝试从C中的套接字接收文件(音频,.CAF)(C++解决方案也可以)。我已经用字符串测试了套接字通信。我的问题是我不知道向recv中的第二个参数提供什么(套接字、缓冲区、缓冲区大小,0)。我应该制作什么类型的“缓冲区”?我基本上想接收一个音频文件,然后播放它。但不知道如何接收音频文件本身 有什么想法吗 谢谢 Robin通常,您将以某种格式对音频进行编码。为了简单起见,我们假设它是Wave格式 一种方法是封装音频块(例如,50毫秒块)以便通过网络发送 但是,您不能盲目地通过网络发送数据,并期

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

有什么想法吗

谢谢


Robin

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

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

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

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

一旦您正确地序列化了数据(如果两台计算机使用相同的endianess,也可以不序列化!),您就可以发送()和rcev()数据,然后将其传递给解码器处理

我很想提供更多的信息,但这只是我在这方面的知识范围。这实际上取决于你到底在做什么,因此如果没有更多关于你在做什么的细节,就很难给出更多的信息(比如音频格式)

更多信息:


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

缓冲区将是一个指针,指向您分配用于存储跨线数据的数组

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

您可以这样做:

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

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

我认为序列化/结尾问题应该由文件格式本身解决,除非它不是设计为跨平台文件格式。因此,可以安全地假设,如果我通过网络传输一些波形帧,我可以合理地期待它在另一端以正确的方式出现?我以前从未真正处理过这个问题,因为我只做过基本的联网。你可以期望endianness与文件格式中指定的一样。这使您可以使用任何方法从端部不同的平台传输文件。文件格式的结尾可能不同于目标平台的结尾,但解码器应注意这一点。