Воспроизведение аудио файла WAV в C ++ и QT

Я читаю WAV-файл на C, а затем пытаюсь воспроизвести аудиофайл, используя некоторые функции QT. Вот как я читаю файл:

FILE *fhandle=fopen("myAudioFile.wav","rb");
fread(ChunkID,1,4,fhandle);
fread(&ChunkSize,4,1,fhandle);
fread(Format,1,4,fhandle);
fread(Subchunk1ID,1,4,fhandle);
fread(&Subchunk1Size,4,1,fhandle);
fread(&AudioFormat,2,1,fhandle);
fread(&NumChannels,2,1,fhandle);
fread(&SampleRate,4,1,fhandle);
fread(&ByteRate,4,1,fhandle);
fread(&BlockAlign,2,1,fhandle);
fread(&BitsPerSample,2,1,fhandle);
fread(&Subchunk2ID,1,4,fhandle);
fread(&Subchunk2Size,4,1,fhandle);
Data=new quint16 [Subchunk2Size/(BitsPerSample/8)];
fread(Data,BitsPerSample/8,Subchunk2Size/(BitsPerSample/8),fhandle);
fclose(fhandle);

Так что мой аудио файл находится внутри Data, Каждый элемент Data 16-разрядное целое число без знака.

Для воспроизведения звука я делю каждое 16-разрядное целое число без знака на два символа, а затем каждые 3 мс (используя таймер) отправляю 256 символов на звуковую карту.
Предполагать myData массив символов из 256 символов, который я делаю (каждые 3 мс) для воспроизведения звука:

m_output->write(myData, 256);

Также m_output определяется как:

m_output = m_audioOutput->start();

а также m_audioOutput определяется как:

m_audioOutput = new QAudioOutput(m_Outputdevice, m_format, this);

И аудио формат правильно установлен как:

m_format.setFrequency(44100);
m_format.setChannels(2);
m_format.setSampleSize(16);
m_format.setSampleType(QAudioFormat::UnSignedInt );
m_format.setByteOrder(QAudioFormat::LittleEndian);
m_format.setCodec("audio/pcm");

Однако, когда я пытаюсь запустить код, я слышу шум, который сильно отличается от реального аудиофайла.
Есть ли что-нибудь, что я делаю, wronge?

Спасибо,
TJ

1

Решение

Я думаю, что проблема в том, что вы используете QTimer. QTimer абсолютно не позволяет вам запускать код каждые три миллисекунды независимо от используемой вами платформы. И если вы используете только один сэмпл, ваш звук будет звучать ужасно. Согласно QTimer docs:

…для них не гарантируется тайм-аут по точному указанному значению. В
во многих ситуациях они могут задержаться на некоторое время
зависит от точности системных таймеров.

а также

…точность таймера не будет равна [1 мс] во многих реальных ситуациях.

Как бы я ни любил Qt, я бы не стал использовать его для обработки сигналов. Я бы использовал другую структуру, такую ​​как Джюс.

3

Другие решения

Других решений пока нет …

По вопросам рекламы [email protected]