首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >Linux snd_pcm_writei定时

Linux snd_pcm_writei定时
EN

Stack Overflow用户
提问于 2014-09-24 06:54:12
回答 1查看 1.4K关注 0票数 0

,我试图重复播放1000毫秒的wav文件。所以播放1000毫秒,然后1000毫秒的静音,然后再播放1000毫秒的音频,.

但是,当我在这个过程中打印时间时,我注意到snd_pcm_writei()在播放声音之后占用了一些时间,因此是~1600 is而不是1000 is。我用的是阻塞模式。

代码语言:javascript
复制
Play Sound:    ~1600ms
Silence:       ~1000ms
Play Sound:    ~1600ms
....

如果我使用非阻塞模式,声音播放的时间很短,几毫秒。

wav的属性-文件:

代码语言:javascript
复制
RIFF (little-endian) data, WAVE audio, Microsoft PCM, 16 bit, mono 8000 Hz

PCM的设置:

代码语言:javascript
复制
err = snd_pcm_hw_params_set_rate_resample(PCM, params, 0);
err = snd_pcm_nonblock(PCM, 0);
err = snd_pcm_hw_params_set_access(PCM, params, SND_PCM_ACCESS_RW_INTERLEAVED);
err = snd_pcm_hw_params_set_format(PCM, params, SND_PCM_FORMAT_S16_LE);
err = snd_pcm_hw_params_set_channels(PCM, params, 1);
err = snd_pcm_hw_params_set_rate_near(PCM, params, &rrate, 0);
err = snd_pcm_hw_params_set_buffer_size_near(PCM, params, &buffer_size);
err = snd_pcm_hw_params_set_period_size_near(PCM, params, &period_size, &dir);
err = snd_pcm_hw_params(PCM, params);

snd_pcm_sw_params_current(PCM, swparams);
snd_pcm_sw_params_set_start_threshold(PCM, swparams, (buffer_size / period_size) * period_size);
snd_pcm_sw_params_set_avail_min(PCM, swparams, period_event ? buffer_size : period_size);
snd_pcm_sw_params(PCM, swparams);

带有1000 is音频样本的缓冲区是16000字节,因为(8,000个样本/s)*2字节/样本(mono + S16_LE)似乎是正确的。

要开始播放wav文件,我使用以下代码:

代码语言:javascript
复制
qDebug() << QTime::currentTime().toString("hh:mm:ss:zzz") << " Play sound";
err = snd_pcm_writei(PCM, Buffer, 16000);
qDebug() << QTime::currentTime().toString("hh:mm:ss:zzz") << " End sound";

有人有解释或技巧来实现这一点吗?可能是设置错误,或者我需要使用非阻塞模式。

谢谢

编辑:

返回值或rrate是8000,所以看起来不错。这是当时的一些真实的指纹。

代码语言:javascript
复制
"10:48:54:893"  Play sound 
"10:48:56:794"  End sound 
"10:48:57:802"  Play sound 
"10:48:58:913"  End sound 
"10:48:59:923"  Play sound 
"10:49:01:853"  End sound 
"10:49:02:862"  Play sound 
"10:49:04:793"  End sound 
"10:49:05:803"  Play sound 
"10:49:06:593"  End sound 
"10:49:07:602"  Play sound 

结束和播放之间的时间大约是1000毫秒,游戏和结束之间的时间是800到1900毫秒,所以根本不准确。

EN

回答 1

Stack Overflow用户

发布于 2014-09-25 11:20:53

@ГеннадийКазачёк:

是的,我总是听到声音。我第一次按照你的建议把长度改为8000。它并没有真正的帮助,但很明显是一个bug。

然后,我更改了缓冲区大小和周期大小:

在此之前

代码语言:javascript
复制
snd_pcm_uframes_t buffer_size = 768;
snd_pcm_uframes_t period_size = 256;

之后

代码语言:javascript
复制
snd_pcm_uframes_t buffer_size = 768*2;
snd_pcm_uframes_t period_size = 256*2;

我不知道为什么,但调整后的时间是正确的。谢谢你的帮助!

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/26010426

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档