“将”libMMS“挂钩”到FFmpeg for iPhone Streaming

时间:2011-10-13 08:33:35

标签: streaming ffmpeg audio-streaming libmms

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

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

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

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

有没有人知道如何将mms_read / mms_seek等libMMS接口挂钩到FFmpeg文件系统接口,如av_read_frame / av_seek_frame?

1 个答案:

答案 0 :(得分:1)

我想这次我必须再次回答我自己的问题......

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

实际上,我们不需要将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版本中,libAVFormat模块中仍有许多bug用于处理mms协议。我花了一个星期的时间对它进行调试,但是,我认为对于像你这样聪明的家伙来说会更短: - )