我使用Java的SourceDataLine播放声音,但每当我尝试调整音量(增益)时,动作和扬声器中的响应之间会有0.2-0.5秒的延迟。音频数据以4k-16k块(16bit单声道,22kHz~44k / s)写入。
如何更实时地进行音量调节?
write(byte[], int, int)
是否会锁定FloatControl的增益调整?
我是否需要恢复DSP同时调整声音缓冲区数据量的方式或提交较小的块?
JDK7,体面的Windows PC
答案 0 :(得分:2)
声音系统从SourceDataLine获取几个(百...)千字节的数据并缓冲它们。如果更改了params,它将在系统回放缓冲区为空并且从SDL读取新数据后才会生效。
您需要做的是在某处改变系统播放音量(这会产生直接影响),而不是为您提供的数据。
答案 1 :(得分:0)
如果您能以某种方式影响/创建混音器为Line.Info
包含的Line
类,则可以更改其最小和最大缓冲区。然后,您可以将缓冲区设置为您正在为其提供的块的大小,然后您的延迟将减少到无(假设)
答案 2 :(得分:0)
调用SourceDataLine.open()时是否尝试使用自定义(较低)缓冲区大小?
SourceDataLine.open( AudioFormat format, int bufferSize )
这应该可以减少延迟。主播放音量解决方案仍然可能会更快。