一部のデバイスにオーディオ入力を提供するアプリケーションに取り組んでいます。デバイスは、オーディオ入力が未加工のオーディオ データ ストリーム (16 ビット、48kHz) の形式で提供されることを想定しています。そのため、WAV ファイルのオーディオ データの形式 (8 ビット、16 ビット、24 ビット、32 ビットなど) に関係なく、WAV ファイルから生のオーディオ データを抽出したいと考えています。この目的のためにlibsndFileライブラリを使用する予定でした。以下に示すように、libsndfile の C++ サンプル コードを変更しました。
#include "stdafx.h"
#include <sndfile.hh>
static void create_file (const char * fname, int format, const short* buffer,const unsigned int& len)
{
// file ;
int channels = 1 ; //A Mono wave file.
int srate = 48000 ;
printf ("Creating file named '%s'\n", fname) ;
SndfileHandle file = SndfileHandle (fname, SFM_WRITE, format, channels, srate) ;
int x = file.write (buffer, len) ;
}
static void read_file (const char * fname)
{
SndfileHandle file ;
file = SndfileHandle (fname) ;
const unsigned int uiBuffLen = file.channels() * file.frames();
short* data = new short [uiBuffLen] ;
memset(data,0x00,uiBuffLen);
int x = file.command(SFC_SET_SCALE_FLOAT_INT_READ, (void*)data, uiBuffLen);
file.read (data, uiBuffLen) ; //Read the audio data in the form of 16 bit short integer
//Now create a new wave file with audio data in the form of 16 bit short integers
create_file ("ConvertedFile.wav", SF_FORMAT_WAV | SF_FORMAT_PCM_16,data, (const unsigned int&)uiBuffLen) ;
//Now fill a buffer containing audio data and dump it into a file so that the same can be fed to a device expecting the raw audio data
unsigned char* bytBuffer = new unsigned char[uiBuffLen*2];
memset(bytBuffer, 0x00, uiBuffLen*2);
file.readRaw(bytBuffer, uiBuffLen*2);
FILE * pFile;
pFile = fopen ("RawAudio.dat","w");
if (pFile!=NULL)
{
fwrite(bytBuffer, 1, uiBuffLen*2, pFile);
fclose (pFile);
}
delete [] data;
delete [] bytBuffer;
}
int _tmain(int argc, _TCHAR* argv[])
{
//The sample file is a Mono file containing audio data in float format.
const char * fname = "MonoWavFile.wav" ;
read_file (fname) ;
return 0;
}
さて、上記のコードはひどいものに見えるかもしれませんが、私は今のところそのアイデアを探しています. モノウェーブファイルであり、32ビット浮動小数点値の形式のオーディオデータを持つファイル「MonoWaveFile.wav」を使用します。libsndfile ライブラリを使用して、新しいファイル「ConvertedFile.wav」を作成します。このファイルには、16 ビット PCM 形式の音声データが含まれています。このファイルをメディア プレーヤーで再生すると、変換が適切に行われていることがわかります。
次に、別のファイル "RawAudio.dat" を作成してオーディオ データのみを保存します。これを使用して、オーディオ入力をデバイスに送ります。ファイルが作成され、デバイスに送信すると、オーディオがまったく正しくありません。これは、私がひどく間違ったことをしていることを示しています。誰が私が何をしているのか教えてもらえますか? 私はこれまでにこのような作業をしたことがないので、何か助けがあれば幸いです。