我希望能够将歌曲分解为数据包并可以访问这些单独的数据包。
原因是我想使用称为命名数据网络的实验性网络协议(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/

    10-12 00:18
    查看更多