1

Cで.wavファイルを読んでいて、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ビットの符号なし整数を2文字に分割し、3ミリ秒ごとに(タイマーを使用して)256文字をオーディオカードに送信します。myDataサウンドを再生するためにこれを(3ミリ秒ごとに)実行する256文字の文字配列であると想定します。

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

ただし、コードを実行しようとすると、実際のオーディオファイルとは非常に異なるノイズが聞こえます。私が間違っていることはありますか?

ありがとう、TJ

4

1 に答える 1

3

問題は、QTimerを使用していることだと思います。QTimerでは、使用しているプラ​​ットフォームに関係なく、正確に3ミリ秒ごとにコードを実行することは絶対にできません。また、サンプルが1つだけずれていると、オーディオがひどく聞こえます。QTimerドキュメントによると:

...指定された正確な値でタイムアウトすることは保証されていません。多くの場合、システムタイマーの精度に応じて、一定時間遅れてタイムアウトすることがあります。

...多くの実際の状況では、タイマーの精度は[1ms]に等しくなりません。

私はQtが大好きですが、信号処理に使用しようとはしません。JUCEなどの別のフレームワークを使用します。

于 2012-10-14T23:36:26.313 に答える