0

マイクから録音し、libsndfile を使用して OGG ファイルにエンコードするプログラムを作成しています。

約 1 か月前に、このプログラムのコンソール バージョンを作成して、記録とエンコード機能が優れていることを確認しました。そして今、このプログラムをウィンドウ アプリケーションとして使い始めたとき、間違っているのは ogg にエンコードする関数だけであることがわかりました。

これはコンパイラまたはリンカのエラーではなく、実行時エラーです。関数を呼び出すとsf_format_checkfalse が返されるため、出力ファイルのパラメーターに問題があります。それで、それが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 ;
}
4

1 に答える 1

0

構造体の直接割り当てを使用する代わりに、sf_in から sfinfo に各値を割り当てます (sfinfo=sf_in;)

sfinfo.sf_count_t=sf_in.sf_count_t;
...
sfinfo.seekable=sf_in.seekable;


typedef struct
      {    sf_count_t  frames ;     /* Used to be called samples. */
           int         samplerate ;
           int         channels ;
           int         format ;
           int         sections ;
           int         seekable ;
       } SF_INFO ;
于 2013-01-15T22:11:52.517 に答える