Chinaunix首页 | 论坛 | 博客
  • 博客访问: 320162
  • 博文数量: 71
  • 博客积分: 1450
  • 博客等级: 上尉
  • 技术积分: 762
  • 用 户 组: 普通用户
  • 注册时间: 2006-03-14 13:31
文章分类

全部博文(71)

文章存档

2014年(3)

2013年(8)

2011年(9)

2010年(38)

2009年(13)

我的朋友

分类:

2010-03-02 15:46:14

http://blog.sina.com.cn/s/blog_5be1061c0100azwt.html

TCPMP是一个功能强大开放式的开源多媒体播放器,播放器主要由核心框架模块(common工程)和解码器分离器插件组成。
    TCPMP的插件非常多,、libmad我们联合几个最常用的插件(ffmpeg、splitter)来说明,其中interface插件实现TCPMP的界面,由于他和媒体播放没有什么关系,这部分可以完全被替换掉,替换成自己的界面。
    ffmpeg工程是系统主要的音视频解码模块,ffmpeg是一个集录制、转换、音/视频编码解码功能为一体的完整的开源解决方案。FFmpeg的开发是 基于Linux操作系统,但是可以在大多数操作系统中编译和使用。ffmpeg支持MPEG、DivX、MPEG4、AC3、DV、FLV等40多种编 码,AVI、MPEG、OGG、Matroska、ASF等90多种解码。很多开源播放器都用到了ffmpeg。但是ffmpeg程序解码效率不是很高, 系统仅仅使用了FFmpeg的部分解码功能。

libmad工程用于MP3文件解码,该工程包含两个功能模块,一个负责解析MP3文件格式,包括MPEG1音频文件 (MP1,MP2,MP3,MPA),读取每一帧音频数据;另一个负责解码MPEG1音频数据,解码代码在libmad子目录中。

libmad是一个开源的高精度 MPEG1音频解码库,支持 MPEG-1(Layer I, Layer II 和 LayerIII,也就是 MP3)。libmad提供 24-bit 的 PCM 输出,完全是定点计算,非常适合没有浮点支持的平台上使用。使用 libmad 提供的一系列 API,就可以非常简单地实现 MP3 数据解码工作。在 libmad 的源代码文件目录下的 mad.h 文件中,可以看到绝大部分该库的数据结构和 API 等。libmad是用的fixed-integer,通过整数模拟小数计算的,精度只能保证到小数点后第9位(大于0的最小值 0.00000000372529),虽然解码精度会有损失,但是极大提高了解码效率,特别是在嵌入式设备上也可以实现高码率MP3文件的解码。

common工程是核心模块,是一个开放的集数据输入、转换、音/视频解码、信号输出等功能为一体的完整的多媒体播放框架。这个框架自身不包含任何的 Decode和Split功能,这些功能由插件实现,核心模块以一个树状结构管理所有的功能模块和插件模块,实现数据Render功能,对输入、转换、输 出流程的控制,接受播放过程中的操作和对事件进行处理,同时也实现系统运行中经常使用的一些共用函数,比如解码过程中经常使用的逆离散余弦变换,内存操 作,界面中需要使用的多语言字符处理等。common工程的主目录下主要有:blit、dyncode、overlay、pcm、softidct、 win32、zlib等子目录。其中blit和overlay存放是视频信号渲染模块,pcm存放PCM音频信号转换模块,softidct存放逆离散余 弦变换函数,win32存放内存操作等常用模块,dyncode这个目录的代码比较晦涩,存放的是程序运行是动态生成代码模块,针对不同的CPU指令 集,PCM数据数据声道和采样率不同,视频渲染数据格式和色深等不同情况动态生成不同的优化代码(这段代码非常精彩,不能不让人佩服TCPMP作者的高超 水平)。核心模块有一个上下文对象context,该对象在初始化函数bool_t Context_Init(……)中候创建了一个该对象实例。该对象实例记录管理各个功能模块,用户界面可以通过该对象和核心模块交互,管理控制播放过 程。
阅读(970) | 评论(0) | 转发(0) |
给主人留下些什么吧!~~