Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/cplusplus/149.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/qt/7.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++ Qt缓冲区欠载播放原始音频_C++_Qt_Audio_Qbuffer - Fatal编程技术网

C++ Qt缓冲区欠载播放原始音频

C++ Qt缓冲区欠载播放原始音频,c++,qt,audio,qbuffer,C++,Qt,Audio,Qbuffer,我尝试播放存储在void*data中的音频,其长度data\u size但得到消息:“缓冲区下溢!” int回调(无效*数据,长数据大小){ QBuffer音频缓冲区; 音频缓冲区设置数据(静态播放(数据)、数据大小); 音频缓冲区打开(QIODevice::ReadOnly); QAudioFormat格式; 格式设置示例(16); 格式:setSampleRate(44100); 格式。setChannelCount(1); 格式化.setCodec(“音频/pcm”); setByteOr

我尝试播放存储在
void*data
中的音频,其长度
data\u size
但得到消息:“缓冲区下溢!”

int回调(无效*数据,长数据大小){
QBuffer音频缓冲区;
音频缓冲区设置数据(静态播放(数据)、数据大小);
音频缓冲区打开(QIODevice::ReadOnly);
QAudioFormat格式;
格式设置示例(16);
格式:setSampleRate(44100);
格式。setChannelCount(1);
格式化.setCodec(“音频/pcm”);
setByteOrder格式(QAudioFormat::LittleEndian);
format.setSampleType(QAudioFormat::SignedInt);
//获取默认输出设备
QAudioDeviceInfo信息(QAudioDeviceInfo::defaultOutputDevice());
//开始播放
QAudioOutput输出(信息、格式);
输出。启动(&音频缓冲区);
//…然后等待声音结束
QEventLoop循环;
QObject::connect(&output),信号(stateChanged(QAudio::State)),&loop,插槽(quit());
做{
loop.exec();
}while(output.state()==QAudio::ActiveState);
}
尝试下面的一些更改

.pro文件

QT+=  multimedia
同时检查是否支持格式

  // get default output device
  QAudioDeviceInfo info(QAudioDeviceInfo::defaultOutputDevice());

  if (!info.isFormatSupported(format))
    format = info.nearestFormat(format);

  // start playback
  QAudioOutput output(info, format);
  output.start(&audio_buffer);

缓冲区通常有多大?对于音频,它通常是一个小的缓冲区,不断地被重新填充,你的缓冲区有点奇怪,因为你只做了一次。你听到音频了吗?是否多次调用回调?这是一个非常令人惊讶的函数…是的,回调被调用多次。-如果我先将其写入一个文件,然后从文件播放,我会听到音频,但也会出现声音不足。如果回调被重复调用,您应该保留并重新使用配置,而不是在每次调用时都重新创建配置。@gro这对您来说仍然是个问题。
数据大小的值是否如您预期的那样?
  // get default output device
  QAudioDeviceInfo info(QAudioDeviceInfo::defaultOutputDevice());

  if (!info.isFormatSupported(format))
    format = info.nearestFormat(format);

  // start playback
  QAudioOutput output(info, format);
  output.start(&audio_buffer);