1

LAME(win7,vs2010,c++)を使ってWAVファイルをMP3ファイルに変換しようとしています。

私はこのコードを見つけました:

lameを使ってwavをmp3に変換

変換は正常に機能しますが、Windows Media Player を使用してファイルを開こうとすると、ファイルの長さが正しくありません。

lame libを使用してこれを修正する方法はありますか?(別のプログラム、別のlib、またはコマンドラインではなく、c++コードのみ...)

EDITED:いくつか読んだ後、sellibitzeが提案したように、lame_get_lametag_frame関数を使用しようとしました。ここに私のコードがあります:

#include <stdio.h>
#include <lame/lame.h>

int main(void)
{
  int read, write;

  FILE *pcm = fopen("in.pcm", "rb");
  FILE *mp3 = fopen("out.mp3", "wb");

  const int PCM_SIZE = 8192;
  const int MP3_SIZE = 8192;

  short int pcm_buffer[PCM_SIZE*2];
  unsigned char mp3_buffer[MP3_SIZE];

  lame_t lame = lame_init();
  lame_set_in_samplerate(lame, 44100);
  lame_set_VBR(lame, vbr_default);
  lame_set_write_id3tag_automatic(lame, 0);
  lame_init_params(lame);

  char buffer[256];
  int imp3=lame_get_id3v2_tag(gfp, buffer, sizeof(buffer));
  fwrite(buffer, 1, imp3, outf);
  long audio_pos=ftell(outf); // store beginning of audio data

  do {
    read = fread(pcm_buffer, 2*sizeof(short int), PCM_SIZE, pcm);
    if (read == 0)
        write = lame_encode_flush(lame, mp3_buffer, MP3_SIZE);
    else
        write = lame_encode_buffer_interleaved(lame, pcm_buffer, read, mp3_buffer, MP3_SIZE);
    fwrite(mp3_buffer, write, 1, mp3);
  } while (read != 0);

  imp3=lame_get_id3v1_tag(gfp, buffer, sizeof(buffer));
  fwrite(buffer, 1, imp3, outf);

  imp3=lame_get_lametag_frame(gfp, buffer, sizeof(buffer));
  fseek(outf,audio_pos,SEEK_SET); // remember beginning of audio data
  fwrite(buffer, 1, imp3, outf);

  lame_close(lame);
  fclose(mp3);
  fclose(pcm);

  return 0;
}

固定:

問題を修正することはできましたが、どのように修正するのかよくわかりません。mp3ファイルの名前を「out.mp3」から他の名前に変更すると、wmpは正しい長さを表示します。また、既に作成されているファイルの名前を out から別の名前に変更しようとしましたが、うまくいきました。誰かが私にそれが起こった方法を説明できますか? 名前 out.mp3 は保存されていますか?

4

1 に答える 1

0

あなたが気に入ったコード例では、VBR モードを使用しています。その場合の長さ情報は通常、メタデータとして最初のフレームに入れられます。これは、Xing/VBR ヘッダーとして知られています。また、精度の低いシーク テーブルも含まれます。しかし、この情報は明らかに、すべての音声データを LAME に渡した後にしか利用できません。Xing/VBR ヘッダーを更新して正しい長さを反映し、テーブルをシークして、ファイルを閉じる前に呼び出すことができる関数を LAME API で探すことをお勧めします。

lame_encode_flush は FILE* を取得しないため、ファイルの先頭に戻ってシークし、最初の mp3 フレームを Xing/VBR ヘッダーで更新することはできません。

于 2013-04-07T18:17:34.440 に答える