我希望能够将歌曲分解为数据包并可以访问这些单独的数据包。
原因是我想使用称为命名数据网络的实验性网络协议(protocol)通过网络发送每个单独的数据包。
当数据包到达目的地时,我要播放它们。所以我想实现流功能。唯一的区别是我将使用的网络层。该网络层不基于IP。
有谁知道将歌曲文件分解成小块然后分别播放这些数据包的任何C / C++实现吗?我查看了Gstreamer,但从其管道结构中获取单个数据包似乎很复杂。
我发现此引用文献与我想要的引用文献最接近,但是对我来说却不太清楚:how can I parse audio raw data recorder with gstreamer?
总结我需要指出的几点:
非常感谢你的帮助!
最佳答案
MP3文件只是succession of MP3 frames。每个帧都由标题和数据块组成。
将MP3文件拆分为MP3帧将涉及解析MP3文件。您可以引用to this documentation for a good description of the format。
请注意,在mpeg第3层编解码器的情况下,帧不是独立的。 In the worst case, 9 input frames may be needed before beeing able to decode one single frame.
我会怎么做而不是这个
我想您可能会忽略其中大多数细节,而将注意力放在流问题本身上。这是我将首先尝试构建的:
发送方的
send_stream test.mp3
receive_stream test.mp3
一旦可以正常工作,请修改接收器程序,以便将数据包按顺序写到标准输出上。这将允许您将标准输出重定向到文件
# sender side did not change
send_stream test.mp3
# receiver side
receive_stream > test.mp3
然后,只需将
madplay
输出重定向到madplay,即可使用receive_stream
播放mp3时播放的mp3:# madplay - tells madplay to read its input from standard input.
receive_stream | madplay -
对于一个好的mp3解码器,take a look at MAD。
关于c++ - 如何获取mp3音频数据包以C/C++流式传输,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/27112357/