基于libmad 的简单MP3流媒体播放器的实现
作者:李 素科 来源:linux.chinaunix.net
点击:
日期:2007-04-22
[收藏] [投稿]
IE是否经常中毒?推荐您
|
|
struct mad_pcm 定义了音频的采样率、每个声道个数以及最后的 PCM 采样数据。这些参数可用来初始化音频设备。
清单 4:struct mad_pcm
struct mad_frame {
struct mad_header header; /* MPEG audio header */
int options; /* decoding options (from stream) */
mad_fixed_t sbsample[2][36][32]; /* synthesis subband filter samples */
mad_fixed_t (*overlap)[2][32][18]; /* Layer III block overlap data */
};
|
mad_frame 是记录 MPEG 帧解码后的数据的数据结构,其中的 mad_header 尤其重要,其用来记录 MPEG 帧的一些基本信息,比如 MPEG 层数、声道模式、流比特率、采样比特率等等。声道模式包括单声道、双声道、联合立体混音声以及一般立体声。
清单 5:mad_frame
enum mad_mode {
MAD_MODE_SINGLE_CHANNEL = 0, /* single channel */
MAD_MODE_DUAL_CHANNEL = 1, /* dual channel */
MAD_MODE_JOINT_STEREO = 2, /* joint (MS/intensity) stereo */
MAD_MODE_STEREO = 3 /* normal LR stereo */
};
struct mad_header {
enum mad_layer layer; /* audio layer (1, 2, or 3) */
enum mad_mode mode; /* channel mode */
int mode_extension; /* additional mode info */
enum mad_emphasis emphasis; /* de-emphasis to use */
unsigned long bitrate; /* stream bitrate (bps) */
unsigned int samplerate; /* sampling frequency (Hz) */
unsigned short crc_check; /* frame CRC accumulator */
unsigned short crc_target; /* final target CRC checksum */
int flags; /* flags */
int private_bits; /* private bits */
mad_timer_t duration; /* audio playing time of frame */
};
|
下面就本文使用的 API 的功能做简单介绍。
在本文中用到的 API 包括:
void mad_stream_init(struct mad_stream *)
void mad_synth_init(struct mad_synth *);
void mad_frame_init(struct mad_frame *);
|
以上3个 API 初始化解码需要的数据结构。
void mad_stream_buffer(struct mad_stream *, unsigned char const *, unsigned long);
|
此函数把原始的未解码的 MPEG 数据和 mad_stream 数据结构关联,以便使用 mad_frame_decode( ) 来解码 MPEG 帧数据。
int mad_frame_decode(struct mad_frame *, struct mad_stream *);
|
把 mad_stream 中的 MPEG 帧数据解码。
void mad_synth_frame(struct mad_synth *, struct mad_frame const *);
|
把解码后的音频数据合成 PCM 采样。
void mad_stream_finish(struct mad_stream *);
void mad_frame_finish(struct mad_frame *);
mad_synth_finish(struct mad_synth);
|
以上 3 个 API 在解码完毕后使用,释放 libmad 占用的资源等。
3.PCM 音频设备的操作
对音频设备的操作主要是初始化音频设备以及往音频设备发送 PCM(Pulse Code Modulation)数据。为了方便,本文使用 ALSA(Advanced Linux Sound Architecture)提供的库和驱动。在编译和运行本文中的 MP3 流媒体播放器的时候,必须先安装 ALSA 相关的文件。
本文用到的主要对 PCM 设备操作的函数分为 PCM 设备初始化的函数以及 PCM 接口的一些操作函数。
PCM 硬件设备参数设置和初始化的函数有:
int snd_pcm_hw_params_malloc (snd_pcm_hw_params_t **ptr)
int snd_pcm_hw_params_any (snd_pcm_t *pcm, snd_pcm_hw_params_t *params)
void snd_pcm_hw_params_free (snd_pcm_hw_params_t *obj)
int snd_pcm_hw_params_set_access ( snd_pcm_t *pcm,
snd_pcm_hw_params_t *params,
snd_pcm_access_t _access)
int snd_pcm_hw_params_set_format ( snd_pcm_t *pcm,
snd_pcm_hw_params_t *params,
snd_pcm_format_t val)
int snd_pcm_hw_params_set_channels(snd_pcm_t *pcm,
snd_pcm_hw_params_t *params,
unsigned int val)
int snd_pcm_hw_params_set_rate_near(snd_pcm_t *pcm,
snd_pcm_hw_params_t *params,
unsigned int *val, int *dir)
如果您对本文有任何疑问或者建议,请到讨论区发表您的意见:
>>
论坛入口 <<
上一页 1 23 4 5 6 下一页
上一篇:Java 2007:新年展望 下一篇:UNIX 目标文件初探
|
|
|
| 【文章评论】
【收藏本文】
【推荐好友】
【打印本文】
【我要投稿】 【论坛讨论】 |
相关文章: |
| ·快速编辑Shell命令行 | ·从2.4到2.6内核发展中的改进·两个很详细的shell实例·内核设计篇·shell技巧·批量添加用户·HowtoCreatingandBootingaNewKernelWitha·利用ip_conntrack表实现封ip的shell脚本,·30分钟搞定BASH脚本编程!·Shell初学者的入门知识
文章评论:(1条) |
|
|
|
|
声明:刊登此文章是为了传递更多信息,文章内容仅供参考,转载请注明出处。 |
|