从 C 中的音频流服务器读取

Reading from an Audio stream server in C

我正在尝试实现一个从广播服务器读取 MP3 流并播放的程序。我这样做是因为我想使用 ESP8266 构建一个收音机,我想确切地了解从 Web 服务器检索流的流程是如何进行的,这样我就能理解为什么它目前工作得不太好..

无论如何,现在我有一个小的 HTTP-Client C 程序,它向广播电台服务器发出 GET 请求并将响应输出到文件。

这是从套接字读取的部分:

while((recived_len = recv(sock, BUF, BUFSIZ-1, 0)) > 0)
    {   
        BUF[recived_len] = '[=10=]';
        printf("%s, BUF);
        
    }

这个循环一直持续下去,将数据写入 STDOUT,然后我将其重定向到一个文件。 问题是由于某种原因文件有缺陷,MP3播放器无法播放。

如果我用 curl 做同样的事情:

$ curl http://kanliveicy.media.kan.org.il/icy/kanbet_mp3 > curl_stream.mp3
// wait for a while
^C

非常棒 - MP3 播放器播放效果很好。

我确实尝试检查从我的程序输出的文件。我用这个 MP3 parser 来解析文件,似乎有很多 resyncing,即单步执行计算的帧大小不会让你进入下一个MP3 header,还有一些 header 显示不正确的值,例如 layer: 1

出现这种故障的原因可能是什么?我的简单程序和curl有什么区别?当然有很多不同之处,哈哈,但我的意思是 - 除了从 TCP 套接字读取之外还有什么?

提示:我注意到下载速度明显不同:curl下载流的速度比我的客户端应用程序快得多。这可能相关吗?

喜欢一些帮助!

相信您的代码会截断每个收到的缓冲区,当它包含一个空字节时。

只需将 curl 的原始输出与您收到的进行比较,您应该就能看出差异。