c - 为什么 ALSA 播放速度过快?
问题描述
我正在使用 lame 解码一个 mp3 文件。MP3 正在通过 ALSA 播放,但音频播放速度过快。我正在用 C 语言编写代码。我尝试更改赋予 snd_pcm_writei 的帧的大小,但它仍然不起作用。
if((err = snd_pcm_open(&handle, device, SND_PCM_STREAM_PLAYBACK, 0))
< 0)
{
printf("Playback open error: %s\n", snd_strerror(err));
exit(EXIT_FAILURE);
}
if((err = snd_pcm_set_params(handle, SND_PCM_FORMAT_S16_LE,
SND_PCM_ACCESS_RW_INTERLEAVED, 2, 44100, 1, 500000))
< 0)
{ /* 0.5sec */
printf("Playback open error: %s\n", snd_strerror(err));
exit(EXIT_FAILURE);
}
fin = fopen("mpeg_dump.mp3", "rb");
if (!fin)
{
printf("Could not open input file\n");
return 1;
}
int headerSize = get_header_size("mpeg_dump.mp3");
printf("Header Size = %d\n", headerSize);
fseek(fin,headerSize,SEEK_SET);
hipVal = hip_decode_init();
do
{
len = fread(buffer, 1, 4096, fin);
total += len;
if(len>0)
{
ret = hip_decode(hipVal, buffer, 4096, pcmlBuffer, pcmrBuffer);
frames = snd_pcm_writei(handle, pcmrBuffer, ret);
if(frames < 0)
frames = snd_pcm_recover(handle, frames,
0);
if(frames < 0)
{
printf("snd_pcm_writei failed: %s\n",
snd_strerror(err));
}
}
}while(len>0);
解决方案
推荐阅读
- python - 尝试使用获取“列表”对象的模型表单集工厂保存没有属性“事件”
- reactjs - 有没有办法在 React-Leaflet 中渲染地图后注册事件监听器?
- java - java.lang.IllegalArgumentException 正在发生
- regex - 正则表达式替换任何与捕获组不匹配的内容
- java - Hibernate 中的关系映射
- xamarin - Xamarin Forms Android Views Inflate 异常
- ffmpeg - 将多个ffmpeg命令转换为一行(刻录字幕和水印)
- android - 有没有办法将图像存储为带有工作 url 链接的字符串?
- c++ - 调用函数时的 C++ 未定义引用
- html - 不知何故,我无法覆盖 normalize.css?