,我试图重复播放1000毫秒的wav文件。所以播放1000毫秒,然后1000毫秒的静音,然后再播放1000毫秒的音频,.
但是,当我在这个过程中打印时间时,我注意到snd_pcm_writei()在播放声音之后占用了一些时间,因此是~1600 is而不是1000 is。我用的是阻塞模式。
Play Sound: ~1600ms
Silence: ~1000ms
Play Sound: ~1600ms
....如果我使用非阻塞模式,声音播放的时间很短,几毫秒。
wav的属性-文件:
RIFF (little-endian) data, WAVE audio, Microsoft PCM, 16 bit, mono 8000 HzPCM的设置:
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文件,我使用以下代码:
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,所以看起来不错。这是当时的一些真实的指纹。
"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毫秒,所以根本不准确。
发布于 2014-09-25 11:20:53
@ГеннадийКазачёк:
是的,我总是听到声音。我第一次按照你的建议把长度改为8000。它并没有真正的帮助,但很明显是一个bug。
然后,我更改了缓冲区大小和周期大小:
在此之前
snd_pcm_uframes_t buffer_size = 768;
snd_pcm_uframes_t period_size = 256;之后
snd_pcm_uframes_t buffer_size = 768*2;
snd_pcm_uframes_t period_size = 256*2;我不知道为什么,但调整后的时间是正确的。谢谢你的帮助!
https://stackoverflow.com/questions/26010426
复制相似问题