Я читаю 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
Я думаю, что проблема в том, что вы используете QTimer. QTimer абсолютно не позволяет вам запускать код каждые три миллисекунды независимо от используемой вами платформы. И если вы используете только один сэмпл, ваш звук будет звучать ужасно. Согласно QTimer docs:
…для них не гарантируется тайм-аут по точному указанному значению. В
во многих ситуациях они могут задержаться на некоторое время
зависит от точности системных таймеров.
а также
…точность таймера не будет равна [1 мс] во многих реальных ситуациях.
Как бы я ни любил Qt, я бы не стал использовать его для обработки сигналов. Я бы использовал другую структуру, такую как Джюс.
Других решений пока нет …