如何获取 mp3 音频数据包以在 C/C++ 中流式传输
How to obtain mp3 audio packets for streaming in C/C++
我希望能够将一首歌分成数据包并访问这些单独的数据包。原因是我想使用称为命名数据网络的实验性网络协议通过网络发送每个单独的数据包。
当数据包到达目的地时,我想播放它们。所以我想实现一个流媒体功能。唯一的区别是我将使用的网络层。此网络层不基于 IP。
有谁知道将歌曲文件分解成碎片然后单独播放这些数据包的任何 C/C++ 实现?我查看了 Gstreamer,但从其管道结构中获取单个数据包似乎很复杂。我找到了这个最接近我想要的参考,但是对我来说不是很清楚:如何使用gstreamer解析音频原始数据记录器?
总结我需要的几点:
- 将歌曲分成数据包
- 播放单个数据包(或一小组数据包)的音频内容。
非常感谢您的帮助!
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。
- 通过套接字[TCP]传输数据 如何在C / C ++中打包多个整数并使用send() recv()传输数据
- Angelscript从C++传输数组
- 如何将图像传输到c++(dll)中的缓冲区,然后在c#的缓冲区中读/写
- 从服务器传输到客户端的消息不会出现
- USB传输的LibUSB C++格式不同
- 在本地网络中通过OpenCV(C++)实时流式传输图像
- 将相机数据从服务器实时流式传输到客户端
- 加密在 Windows、C++ 和 Java 中传输中的数据
- 如何从网站获取数据并将其传输到数据库?
- 使用蓝牙组件将数据从Android手机传输到串行设备时出现问题
- 在 OpenCV 中应用公式并传输图像
- 在不传输的情况下更改 Win32 中的串行端口波特率
- Vulkan 的传输队列系列功能和显卡支持:条件检查是否准确?
- 如何使用CAPL的诊断功能获取CAN传输的数据(256字节)?
- 如何通过ROS将realsense数据传输到其他设备
- 将音频从浏览器流式传输到WebRTC本机C++应用程序
- 将FFMpeg AVFrame对象从C++应用程序流式传输到Python的最佳方法?
- 使用IMFSourceReader(Microsoft媒体基金会)进行音频流传输
- 在PROGMEM中添加更多数据会中断Arduino Mega 2560上的SPI传输
- QTcpSocket 在 RemoteHostClosedError 后重新连接到服务器时无法传输数据