现在,我正在研究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?
答案 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协议。我花了一个星期的时间对它进行调试,但是,我认为对于像你这样聪明的家伙来说会更短: - )