在C语言中从音频流服务器读取数据
我正在尝试实现一个程序,从无线电服务器读取MP3流并播放它。我这样做是因为我想用ESP8266制作一台收音机,我想确切地了解从web服务器检索流的流程,这样我就能理解为什么它目前工作得不太好 无论如何,现在我有一个小型HTTP客户端C程序,它向无线电台服务器发出GET请求,并将响应输出到文件 这是从套接字读取的部分:在C语言中从音频流服务器读取数据,c,http,audio,stream,mp3,C,Http,Audio,Stream,Mp3,我正在尝试实现一个程序,从无线电服务器读取MP3流并播放它。我这样做是因为我想用ESP8266制作一台收音机,我想确切地了解从web服务器检索流的流程,这样我就能理解为什么它目前工作得不太好 无论如何,现在我有一个小型HTTP客户端C程序,它向无线电台服务器发出GET请求,并将响应输出到文件 这是从套接字读取的部分: while((recived_len = recv(sock, BUF, BUFSIZ-1, 0)) > 0) { BUF[recived_le
while((recived_len = recv(sock, BUF, BUFSIZ-1, 0)) > 0)
{
BUF[recived_len] = '\0';
printf("%s, BUF);
}
这个循环将永远持续下去,将数据写入STDOUT,然后我将其重定向到一个文件。
问题是,由于某些原因,文件有缺陷,MP3播放器无法播放
如果我对curl做同样的事情:
很好,MP3播放器播放得很好
我确实试过检查程序输出的文件。我用它来解析文件,似乎有很多重新同步,也就是说,在计算的帧大小中单步执行不会将您放入下一个MP3头中,并且一些头显示不正确的值,例如layer:1,等等
发生故障的原因可能是什么?我的简单程序和curl有什么区别?当然有很多不同,哈哈,但我的意思是-除了从TCP套接字读取之外还有什么其他的呢
提示:我注意到下载速度有很大不同:curl下载流的速度比我的客户端应用程序快得多。这有关系吗
爱你的帮助 我相信您的代码会在每个接收到的缓冲区包含空字节时截断它
只要将curl的原始输出与您收到的原始输出进行比较,您就应该能够看到差异。如果没有代码,很难判断差异是什么。但我假设这是同一个项目,其中暗示了分块传输编码。在这种情况下,不能只将数据写入文件。它会有HTTP编码信息。我知道,但似乎做了类似的事情。看一看可能会有所帮助。这正是我对curl所做的——只是将它写入一个文件——而且它非常棒。内容类型为audio/mpeg类型,通过检查,我可以看到它是一个MP3文件-它包含MP3标题。@YoavKlein是的,但curl是一个从流中删除此类编码的程序。不,它不会从流中删除该编码。它确实从一个分块传输编码中移除了\r\n\r\n部分,但是当你用原始的方式运行它时,它甚至不这样做。在这种情况下,它也播放MP3文件,只是中间有一些中断。因为内容总是在变化,所以它是一个流——如果我有办法让curl和我的代码同时被读取,我也许可以做到。无论如何,我可以看到我的程序的输出被破坏了-帧的大小不一样,头中的值不简洁等等。为什么你认为我的代码在包含空字节时会截断每个接收到的缓冲区?哦,我知道了,我用printf打印输出,它只输出到空字节!谢谢!!我没有意识到MP3流可能也包含一个空字节:,这就解决了它,谢谢!!
$ curl http://kanliveicy.media.kan.org.il/icy/kanbet_mp3 > curl_stream.mp3
// wait for a while
^C