0

这些天,我正在研究 iPhone Streaming(基于 MMS 协议)的软件架构。

众所周知,为了播放彩信音频流,我们应该调用 libMMS 从远程媒体服务器读取 wma 流数据,然后调用 FFmpeg 将流数据从 wma 格式解码到 PCM 数据缓冲区,最后将 PCM 数据入队缓冲到 iPhone 的音频队列中以生成真实的声音。

上面的介绍只是描述了 iPhone 流媒体的工作过程。如果我们只需要实现这个简单的功能,那并不难。只需按照上面的介绍一步步调用libMMS、FFMpeg和audioqueue,就可以实现流功能了。实际上,我上周已经实现了代码。

但是,我需要的不仅仅是一个简单的流媒体功能!我需要一个软件架构,让 FFmpeg 访问 libMMS 就像访问本地文件系统一样!

有人知道如何将像 mms_read/mms_seek 这样的 libMMS 接口挂接到像 av_read_frame/av_seek_frame 这样的 FFmpeg 文件系统接口上吗?

4

1 回答 1

1

我想这一次我必须再次回答我自己的问题……</p>

经过几周的研究和调试,我终于得到了真相。

实际上,我们不需要将 libMMS “挂钩”到 FFMpeg 上。为什么?因为 FFMpeg 已经拥有其原生 mms 协议处理模块“mms_protocol”(参见 FFMpeg 中的 mms_protocol.c)。

我们需要做的只是配置 FFMpeg 以启用 mms 模块,如下所示(参见 FFMpeg 中的 config.h):

#define ENABLE_MMS_PROTOCOL 1
#define CONFIG_MMS_PROTOCOL 1

完成此配置后,FFMpeg 会将 mms 协议添加到其协议列表中。(实际上,协议列表中已经包含了“本地文件系统协议”)。因此,FFMpeg 可以将“mms://hostserver/abc”媒体文件视为本地媒体文件。因此,我们仍然可以使用以下命令打开和读取 mms 媒体文件:

av_open_input_file();
av_read_frame();

就像我们之前在本地媒体文件上所做的一样!

顺便说一句,在我的 ffmpeg 版本中,用于处理 mms 协议的 libAVFormat 模块中仍然存在许多错误。我花了一周的时间调试它,但是,我认为对于像你这样聪明的人来说它会更短:-)

于 2011-11-08T02:50:24.003 回答