当前位置: 首页 > 图文教程 > 操作系统 > Unix/Linux > 基于libmad 的简单MP3流媒体播放器的实现

Unix/Linux
Linux 网管 123 --- 第6章. 一般系统管理问题 -3.变更使用者密码
Linux 网管 123 --- 第6章. 一般系统管理问题 -4.关闭删除使用者帐号
Linux 网管 123 --- 第6章. 一般系统管理问题 -5.Linux 密码及 S
Linux 网管 123 --- 第6章. 一般系统管理问题 -6.关闭系统及重新启动
Linux 网管 123 --- 第7章. 自订的组态及管理内容 -1.HTTP
Linux 网管 123 --- 第7章. 自订的组态及管理内容 -2.DNS
Linux 网管 123 --- 第7章. 自订的组态及管理内容 -3.使用 TACACS
Linux 网管 123 --- 第7章. 自订的组态及管理内容 -4.使用 Samba
Linux 网管 123 --- 第7章. 自订的组态及管理内容 -5.使用 Netata
Linux 网管 123 --- 第7章. 自订的组态及管理内容 -6.NFS
Linux 网管 123 --- 第13章. 其他的问题 2.哪里可以找到帮助
Linux 网管 123 --- 第13章. 其他的问题 3.附带文件的指示
RedHat 6.2 中文显示与输入的设置
RedHat 6.2 中文 TrueType 字体的使用
Linux 网管 123 --- 第13章. 其他的问题 1.系统损毁
Linux系统中网络配置详解
如何配置linux与win2000/NT 双重引导
kernel hacking简单入门
Linux下如何刻录任何文件系统格式的光盘?
编译内核make dep 是啥意思 ?

Unix/Linux 中的 基于libmad 的简单MP3流媒体播放器的实现


出处:互联网   整理: 软晨网(RuanChen.com)   发布: 2009-11-01   浏览: 168 ::
收藏到网摘: n/a

1.介绍

    本文在 Fedora 5 Linux 下实现了一个基于 libmad 的 MP3 流媒体播放器。此流媒体播放器可以播放基于 HTTP 1.1 协议传输的 MP3 流媒体数据。

    基本原理是:从 HTTP 服务器获得 MP3 媒体信息,然后通过网络传输把 MP3 数据以数据流的形式接收到 MP3 流媒体播放器客户端,由客户端通过 libmad 解码 MP3 数据流,得到 PCM 音频数据,写入音频设备,播放音乐。本文的流媒体播放器只是实现了必要的简单功能,没有考虑太多情况。比如,没有考虑实时播放控制,这样的话就不能随意选取播放点进行播放。

    本文的 MP3 流媒体播放器创建两个线程,使用两个缓冲区保存 MP3 数据,可以一边下载数据,一边播放音乐。编译运行此 MP3 流媒体播放器需要安装 libmad (www.underbit.com/products/mad/) 以及 ALSA(Advanced Linux Sound Architecture) (http://www.alsa-project.org)相关的软件。ALSA包括4部分,分别是 sound driver, sound library , sound utilities 以及 tools。至少应该安装 sound driver, sound library 。编译程序时连接库的选项是:-lmad -lasound -lpthread。

    本文的 MP3 流媒体播放器使用双缓冲区,一个是数据接收缓冲区,另一个是数据解码缓冲区。主程序结构如下图所示,图中的蓝色线表示数据流向。


图 1:MP3 流媒体播放器主程序结构图
MP3 流媒体播放器主程序结构图

2.libmad简介

    MAD (libmad)是一个开源的高精度 MPEG 音频解码库,支持 MPEG-1(Layer I, Layer II 和 LayerIII(也就是 MP3)。LIBMAD 提供 24-bit 的 PCM 输出,完全是定点计算,非常适合没有浮点支持的平台上使用。使用 libmad 提供的一系列 API,就可以非常简单地实现 MP3 数据解码工作。在 libmad 的源代码文件目录下的 mad.h 文件中,可以看到绝大部分该库的数据结构和 API 等。

    本文用到的 libmad 中的主要数据结构有:struct mad_stream, struct mad_synth, struct mad_frame。它们的定义如下:


清单 1:libmad 中的主要数据结构

 struct mad_stream { unsigned char const *buffer; /* input bitstream buffer */ unsigned char const *bufend; /* end of buffer */ unsigned long skiplen; /* bytes to skip before next frame */ int sync; /* stream sync found */ unsigned long freerate; /* free bitrate (fixed) */ unsigned char const *this_frame; /* start of current frame */ unsigned char const *next_frame; /* start of next frame */ struct mad_bitptr ptr; /* current processing bit pointer */ struct mad_bitptr anc_ptr; /* ancillary bits pointer */ unsigned int anc_bitlen; /* number of ancillary bits */ unsigned char (*main_data)[MAD_BUFFER_MDLEN];/* Layer III main_data() */ unsigned int md_len; /* bytes in main_data */ int options; /* decoding options (see below) */ enum mad_error error; /* error code (see above) */}; 

 

[1] [2] [3] [4] [5] [6] [7] 下一页