这些天,我正在研究iPhone流的软件体系结构(基于彩信协议)。
据我们所知,要回放彩信音频流,需要调用libMMS从远程媒体服务器读取wma流数据,然后调用FFmpeg将wma格式的流数据解码为PCM数据缓冲区,最后将PCM数据缓冲区排队到iPhone的音频队列中以产生真实的声音。
上面的介绍只是描述了iPhone流的工作过程。如果我们只需要实现这个简单的功能,那就不难了。只要按照上面的介绍,一步一步的调用libMMS、FFMpeg和音频队列,就可以实现流媒体功能。实际上,我上周已经实现了这个代码。
但是,我需要的不仅仅是一个简单的流功能!我需要一个软件架构,使FFmpeg访问libMMS就像访问本地文件系统一样!
有人知道如何将mms_read/mms_ libMMS这样的libMMS接口连接到FFmpeg文件系统接口上,比如av_read_frame/av_read_frame?
发布于 2011-11-08 02:50:24
我想我必须再次回答我自己的问题,这次……
经过几个星期的反复研究和初试,我终于得到了真相。
实际上,我们不需要将libMMS“钩”到FFMpeg上。为什么?因为FFMpeg已经有了它的本机彩信协议处理模块“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模块中仍然存在许多用于处理mms协议的bug。我花了一个星期的时间来调试它,但是,我认为对于像你这样聪明的人来说,它要短得多:-)
https://stackoverflow.com/questions/7751393
复制相似问题