Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/http/4.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
在C语言中从音频流服务器读取数据_C_Http_Audio_Stream_Mp3 - Fatal编程技术网

在C语言中从音频流服务器读取数据

在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

我正在尝试实现一个程序,从无线电服务器读取MP3流并播放它。我这样做是因为我想用ESP8266制作一台收音机,我想确切地了解从web服务器检索流的流程,这样我就能理解为什么它目前工作得不太好

无论如何,现在我有一个小型HTTP客户端C程序,它向无线电台服务器发出GET请求,并将响应输出到文件

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

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