7

LAME を使用して WAV ファイル (オーディオ CD から抽出) を MP3 に変換しています。変換結果は、ファイルの最初に「クリック」音が 1 つあることを除いて、問題ありません。クリックは、曲自体の前にほぼ 0.5 秒かかります。

char *input_file = argv[1];
char *output_file = argv[2];

FILE *pcm = fopen(input_file, "rb");
FILE *mp3 = fopen(output_file, "wb+");

size_t nread;
int ret, nwrite;

const int PCM_SIZE = 1152;
const int MP3_SIZE = 1152;

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

lame_t lame = lame_init();

// Can not put these lines at the end of conversion
id3tag_set_title(lame, "Still reminds me");
id3tag_set_artist(lame, "Anggun");

lame_set_VBR(lame, vbr_mt);
lame_set_VBR_quality(lame, 2);

ret = lame_init_params(lame);

do {
    nread = fread(pcm_buffer, sizeof(short), PCM_SIZE * 2, pcm);

    if (nread != 0) {
        // Is this the cause of the single click?
        int nsamples = nread / 2;
        short buffer_l[nsamples];
        short buffer_r[nsamples];

        int j = 0;
        int i = 0;
        for (i = 0; i < nsamples; i++) {
            buffer_l[i] = pcm_buffer[j++];
            buffer_r[i] = pcm_buffer[j++];

        }

        nwrite = lame_encode_buffer(lame, buffer_l, buffer_r, nsamples,
                mp3_buffer, MP3_SIZE);

    } else {
        nwrite = lame_encode_flush(lame, mp3_buffer, MP3_SIZE);

    }

    fwrite(mp3_buffer, nwrite, 1, mp3);
} while (nread != 0);


lame_close(lame);

fclose(mp3);
fclose(pcm);

どうしたの?ここで何が恋しいですか?

4

3 に答える 3

8

Dave L 以外の回答をまだ探しているかどうかはわかりませんが、オーディオ ファイルのヘッダーを誤ってエンコードした LAME からクリック ノイズが発生しています。作成している WAV ファイルによっては、ヘッダーはおそらく 44 バイトになります。録音した PCM ファイルを変換するときに同様の問題が発生しましたが、私の場合、それらのヘッダーは 4096 バイトです。それが真のwavファイルである場合(したがって44バイトのヘッダーがある場合)、単に使用します

fseek(pcm,44,0);

ファイルを開いた直後に、ヘッダーをスキップします。また、ヘッダーのサイズを確認するために、WAV ファイルの 1 つで Hex エディターを使用することをお勧めします。

それをスキップすると (ここでもヘッダーは 4096b でした)、クリック音は消えました。

于 2013-01-27T20:47:00.770 に答える
3

この問題を解決する運はありますか?

私は同様の問題を抱えていて、出力ファイルに書き込むときに最初の 1024 バイトをスキップしようとしました (つまり、LAME から出力ファイルに出力を書き始める前に、これらのバイトを破棄しています)。これにより、録音開始時の「クリック」が解消されましたが、これはちょっとしたハックですが、問題なく動作しているようです。

于 2012-10-06T03:59:17.923 に答える
0

このようなクリックを回避するには、ヘッダーをスキップすることが重要ですが、固定サイズは. 44 バイトは機能しないソリューションです。

80バイトのヘッダーを持つ私の典型的なWAVファイル。

とにかく、WAV ファイルを解析して、実際のヘッダー サイズを確認する必要があります。これは、サンプルあたりのビット数、チャンネル数など、ラメに適切なパラメーターを設定したり、便利なデフォルトパラメーターを提供したりするために使用できる追加のものを取得することにも意味があります。

物事を簡単にするために、これらすべてをゼロから開発してはなりません。Lame ソースに含まれるフロントエンドを使用できます (ファイル get_audio.c と関数を探します)。parse_wave_header(lame_global_flags * gfp, FILE * sf)

ヘッダー サイズのみが必要な場合は、もちろんこの関数をニーズに合わせて変更できます。

于 2015-06-15T10:22:48.990 に答える