从 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 的原始输出与您收到的进行比较,您应该就能看出差异。
我正在尝试实现一个从广播服务器读取 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 的原始输出与您收到的进行比较,您应该就能看出差异。