linux下用C语言实现MP3播放器代码
时间: 2024-03-19 19:43:36 浏览: 17
这里提供一个简单的基于 ALSA 库的 MP3 播放器代码,仅供参考:
```
#include <alsa/asoundlib.h>
#include <mpg123.h>
#define BUFFER_SIZE 4096
// 初始化 ALSA 音频设备
snd_pcm_t *init_alsa(char *device_name, unsigned int *sample_rate, unsigned int *channels, snd_pcm_uframes_t *frames)
{
int err;
snd_pcm_t *handle;
snd_pcm_hw_params_t *params;
unsigned int val;
// 打开音频设备
if ((err = snd_pcm_open(&handle, device_name, SND_PCM_STREAM_PLAYBACK, 0)) < 0) {
printf("Error opening PCM device %s: %s\n", device_name, snd_strerror(err));
return NULL;
}
// 初始化硬件参数
snd_pcm_hw_params_alloca(¶ms);
if ((err = snd_pcm_hw_params_any(handle, params)) < 0) {
printf("Error initializing hardware parameters: %s\n", snd_strerror(err));
return NULL;
}
// 设置采样率
if ((err = snd_pcm_hw_params_set_rate_resample(handle, params, 1)) < 0) {
printf("Error setting resample: %s\n", snd_strerror(err));
return NULL;
}
val = *sample_rate;
if ((err = snd_pcm_hw_params_set_rate_near(handle, params, &val, 0)) < 0) {
printf("Error setting sample rate: %s\n", snd_strerror(err));
return NULL;
}
if (val != *sample_rate) {
printf("Warning: sample rate %d Hz not supported, using %d Hz instead.\n", *sample_rate, val);
*sample_rate = val;
}
// 设置声道数
val = *channels;
if ((err = snd_pcm_hw_params_set_channels_near(handle, params, &val)) < 0) {
printf("Error setting channels: %s\n", snd_strerror(err));
return NULL;
}
if (val != *channels) {
printf("Warning: channels count %d not supported, using %d instead.\n", *channels, val);
*channels = val;
}
// 设置采样格式
if ((err = snd_pcm_hw_params_set_format(handle, params, SND_PCM_FORMAT_S16_LE)) < 0) {
printf("Error setting sample format: %s\n", snd_strerror(err));
return NULL;
}
// 设置周期大小
if ((err = snd_pcm_hw_params_get_period_size(params, frames, 0)) < 0) {
printf("Error getting period size: %s\n", snd_strerror(err));
return NULL;
}
// 设置硬件参数
if ((err = snd_pcm_hw_params(handle, params)) < 0) {
printf("Error setting hardware parameters: %s\n", snd_strerror(err));
return NULL;
}
return handle;
}
// 播放 MP3 文件
void play_mp3(char *file_name, snd_pcm_t *handle, unsigned int sample_rate, unsigned int channels, snd_pcm_uframes_t frames)
{
int err;
mpg123_handle *mh;
unsigned char buffer[BUFFER_SIZE];
size_t bytes_read;
off_t samples;
// 初始化 mpg123 解码库
mpg123_init();
mh = mpg123_new(NULL, &err);
mpg123_open(mh, file_name);
mpg123_getformat(mh, &sample_rate, &channels, NULL);
// 循环读取并播放音频数据
while (1) {
mpg123_read(mh, buffer, BUFFER_SIZE, &bytes_read);
if (bytes_read == 0) break;
samples = bytes_read / (channels * 2);
if ((err = snd_pcm_writei(handle, buffer, samples)) < 0) {
printf("Error playing audio: %s\n", snd_strerror(err));
break;
}
}
// 释放资源
mpg123_close(mh);
mpg123_delete(mh);
mpg123_exit();
}
int main(int argc, char *argv[])
{
unsigned int sample_rate = 44100; // 采样率
unsigned int channels = 2; // 声道数
snd_pcm_uframes_t frames = 512; // 周期大小
snd_pcm_t *handle;
// 初始化 ALSA 设备
handle = init_alsa("default", &sample_rate, &channels, &frames);
if (handle == NULL) {
printf("Failed to initialize ALSA device.\n");
return -1;
}
// 播放 MP3 文件
play_mp3(argv[1], handle, sample_rate, channels, frames);
// 关闭 ALSA 设备
snd_pcm_drain(handle);
snd_pcm_close(handle);
return 0;
}
```
这份代码仅实现了 MP3 文件的播放,没有实现 GUI 界面和播放控制等功能。如果需要实现更完整的 MP3 播放器,还需要进一步开发。