マイクから録音し、libsndfile を使用して OGG ファイルにエンコードするプログラムを作成しています。
約 1 か月前に、このプログラムのコンソール バージョンを作成して、記録とエンコード機能が優れていることを確認しました。そして今、このプログラムをウィンドウ アプリケーションとして使い始めたとき、間違っているのは ogg にエンコードする関数だけであることがわかりました。
これはコンパイラまたはリンカのエラーではなく、実行時エラーです。関数を呼び出すとsf_format_check
false が返されるため、出力ファイルのパラメーターに問題があります。それで、それがsf_format_check
機能しているかどうかを手動でチェックし始め、すべてが正しい. しかし、古いコンソール バージョンをコンパイルすると、すべて機能しました。
だからここに私の質問があります この行動の理由は何ですか?
これが私の機能です。
static void encodeOgg (const char *infilename, const char *outfilename, int filetype)
{
static short buffer [BUFFER_LEN] ;
SNDFILE *infile, *outfile ;
SF_INFO sfinfo,sf_in ;
int readcount ;
fflush (stdout) ;
sf_in.samplerate=SAMPLE_RATE;//44100
sf_in.channels=NUM_CHANNELS;//1
sf_in.format=SF_FORMAT_RAW | SF_FORMAT_PCM_16 ;
if (! (infile = sf_open (infilename, SFM_READ, &sf_in))){
error("Could not open output file") ;
exit (1) ;
}
sfinfo = sf_in;
sfinfo.format = filetype ;//SF_FORMAT_OGG | SF_FORMAT_VORBIS
if (! sf_format_check (&sfinfo)){ //Here's the place where function exits
sf_close (infile) ;
error("Invalid encoding\n") ;
exit (1) ;
}
if (! (outfile = sf_open (outfilename, SFM_WRITE, &sfinfo))){
error("Error : could not open output file") ;
exit (1) ;
}
while ((readcount = sf_read_short (infile, buffer, BUFFER_LEN)) > 0)
{
sf_write_short (outfile, buffer, readcount) ;
}
sf_close (infile) ;
sf_close (outfile) ;
return ;
}