如何获取 mp3 音频数据包以在 C/C++ 中流式传输

How to obtain mp3 audio packets for streaming in C/C++

本文关键字:C++ 传输 数据包 何获取 获取 音频 mp3      更新时间:2023-10-16

我希望能够将一首歌分成数据包并访问这些单独的数据包。原因是我想使用称为命名数据网络的实验性网络协议通过网络发送每个单独的数据包。

当数据包到达目的地时,我想播放它们。所以我想实现一个流媒体功能。唯一的区别是我将使用的网络层。此网络层不基于 IP。

有谁知道将歌曲文件分解成碎片然后单独播放这些数据包的任何 C/C++ 实现?我查看了 Gstreamer,但从其管道结构中获取单个数据包似乎很复杂。我找到了这个最接近我想要的参考,但是对我来说不是很清楚:如何使用gstreamer解析音频原始数据记录器?

总结我需要的几点:

  1. 将歌曲分成数据包
  2. 播放单个数据包(或一小组数据包)的音频内容。

非常感谢您的帮助!

MP3 文件只是一系列 MP3 帧。每个帧由一个标头和一个数据块组成。

将 MP3 文件拆分为 MP3 帧将涉及解析 MP3 文件。您可以参考此文档来了解格式的良好说明。

请注意,对于 mpeg 第 3 层编解码器,帧不是独立的。在最坏的情况下,可能需要 9 个输入帧才能解码一个帧。

我会做什么而不是这个

我想您可能会忽略其中的大部分细节,而专注于流媒体问题本身。以下是我将首先尝试构建的内容:

  • 在发送方,将文件拆分为数据包,然后使用系统逐个发送。命令示例:send_stream test.mp3

  • 在接收方端,接收数据包并重建原始文件。命令示例:receive_stream test.mp3

一旦你工作正常,修改接收器程序,使其按顺序写入标准输出上的数据包。这将允许您将标准输出重定向到文件

# sender side did not change
send_stream test.mp3
# receiver side
receive_stream > test.mp3

然后,您可以使用madplay接收 mp3 时播放 mp3,只需将输出重定向到 madplay receive_stream

# madplay - tells madplay to read its input from standard input.
receive_stream | madplay -

对于一个好的mp3解码器,看看MAD。