gpt4 book ai didi

Linux ALSA snd_pcm_writei 时序

转载 作者:太空宇宙 更新时间:2023-11-04 03:52:10 28 4
gpt4 key购买 nike

我正在尝试以重复的方式播放 1000 毫秒的 wav 文件。因此,播放 1000 毫秒,然后播放 1000 毫秒的静音,然后再次播放 1000 毫秒的音频,...

但是当我在此过程中打印计时时,我注意到 snd_pcm_writei() 在播放声音后占用了一些时间,因此是 ~1600ms 而不是 1000ms。我正在使用阻止模式。

Play Sound:    ~1600ms
Silence: ~1000ms
Play Sound: ~1600ms
....

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

wav 文件的属性:

RIFF (little-endian) data, WAVE audio, Microsoft PCM, 16 bit, mono 8000 Hz

PCM 设置:

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);

具有 1000ms 音频样本的缓冲区是 16000 字节,似乎是正确的,因为 (8000 个样本/秒) * 2 字节/样本 (单声道 + 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

END 和 PLAY 之间的时间约为 1000ms,PLAY 和 END 之间的时间在 800ms 到 1900ms 之间,所以一点也不准确。

最佳答案

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

是的,我总是听到声音。我首先按照您的建议将长度更改为 8000。它并没有真正帮助,但显然是一个错误。

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

之前

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;

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

关于Linux ALSA snd_pcm_writei 时序,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/26010426/

28 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com