1

生のオーディオを含むファイルを読み取り、 FLACを使用してエンコードしようとしています。プログラムを実行すると、「バスエラー」が発生します。何が間違っている可能性がありますか?
次の行を使用してOSX10.6.8でコンパイルしています。

gcc nsFlacEncoder.c -I/opt/local/include -lflac -m32 -o flac_enc

#include "FLAC/stream_encoder.h"
#define READSIZE 40000
char buffer[READSIZE];
FLAC__int32 pcm[READSIZE/2];

FLAC__StreamEncoderWriteStatus write_callback(const FLAC__StreamEncoder *encoder, const  FLAC__byte buffer[], size_t bytes, unsigned samples, unsigned current_frame, void *client_data)
{
    FILE * fp;
    fp = fopen("rec.flac","rw");
    fwrite(buffer, 1, bytes, fp);
    fclose(fp);
    return 0;
}

int rawToFlac()
{
    FLAC__bool ok = true;
    FLAC__StreamEncoder *encoder = 0;
    FLAC__StreamEncoderInitStatus init_status;
    unsigned sample_rate = 16000;
    unsigned channels = 1;
    unsigned bps = 16;

    if((encoder=FLAC__stream_encoder_new()) == NULL){
        printf("Error!");
        return 1;
    }

    ok &= FLAC__stream_encoder_set_verify(encoder, true);
    ok &= FLAC__stream_encoder_set_compression_level(encoder, 5);
    ok &= FLAC__stream_encoder_set_channels(encoder, channels);
    ok &= FLAC__stream_encoder_set_bits_per_sample(encoder, bps);
    ok &= FLAC__stream_encoder_set_sample_rate(encoder, sample_rate);
    ok &= FLAC__stream_encoder_set_total_samples_estimate(encoder, READSIZE);

    if(ok){
        init_status = FLAC__stream_encoder_init_stream(encoder, &write_callback, NULL, NULL, NULL, /*client_data=*/NULL);
        if(init_status != FLAC__STREAM_ENCODER_INIT_STATUS_OK){
            printf("Encoder not initiated");
            return 1;
        }
    }

    if(ok){
        while(ok)
        {       
            /* convert the packed little-endian 16-bit PCM samples from WAVE into an interleaved FLAC__int32 buffer for libFLAC */
            size_t i;
            for(i = 0; i < 20000; i++) {
                /* inefficient but simple and works on big- or little-endian machines */
                pcm[i] = (FLAC__int32)(((FLAC__int16)(FLAC__int8)buffer[2*i+1] << 8) | (FLAC__int16)buffer[2*i]);
            }
            /* feed samples to encoder */
            ok = FLAC__stream_encoder_process_interleaved(encoder, pcm, 20000);
        }
    }

    ok &= FLAC__stream_encoder_finish(encoder);
    printf("Finished.");

    FLAC__stream_encoder_delete(encoder);   
    return 0;
}

int main()
{

    FILE *file;
    file = fopen("recording","rb");
    fread(buffer,2, 20000, file);
    rawToFlac();
    fclose(file);
    return 0;
}

実行gdb flac_encすると、これが得られます。

warning: Could not find object file "/Users/benski/Desktop/flac-1.2.1/src/libFLAC/.libs/bitmath.o" - no debug information available for "bitmath.c".
warning: Could not find object file "/Users/benski/Desktop/flac-1.2.1/src/libFLAC/.libs/bitreader.o" - no debug information available for "bitreader.c".
warning: Could not find object file "/Users/benski/Desktop/flac-1.2.1/src/libFLAC/.libs/bitwriter.o" - no debug information available for "bitwriter.c".
warning: Could not find object file "/Users/benski/Desktop/flac-1.2.1/src/libFLAC/.libs/cpu.o" - no debug information available for "cpu.c".
warning: Could not find object file "/Users/benski/Desktop/flac-1.2.1/src/libFLAC/.libs/crc.o" - no debug information available for "crc.c".
warning: Could not find object file "/Users/benski/Desktop/flac-1.2.1/src/libFLAC/.libs/fixed.o" - no debug information available for "fixed.c".
warning: Could not find object file "/Users/benski/Desktop/flac-1.2.1/src/libFLAC/.libs/format.o" - no debug information available for "format.c".
warning: Could not find object file "/Users/benski/Desktop/flac-1.2.1/src/libFLAC/.libs/lpc.o" - no debug information available for "lpc.c".
warning: Could not find object file "/Users/benski/Desktop/flac-1.2.1/src/libFLAC/.libs/md5.o" - no debug information available for "md5.c".
warning: Could not find object file "/Users/benski/Desktop/flac-1.2.1/src/libFLAC/.libs/memory.o" - no debug information available for "memory.c".
warning: Could not find object file "/Users/benski/Desktop/flac-1.2.1/src/libFLAC/.libs/metadata_iterators.o" - no debug information available for "metadata_iterators.c".
warning: Could not find object file "/Users/benski/Desktop/flac-1.2.1/src/libFLAC/.libs/metadata_object.o" - no debug information available for "metadata_object.c".
warning: Could not find object file "/Users/benski/Desktop/flac-1.2.1/src/libFLAC/.libs/stream_decoder.o" - no debug information available for "stream_decoder.c".
warning: Could not find object file "/Users/benski/Desktop/flac-1.2.1/src/libFLAC/.libs/stream_encoder.o" - no debug information available for "stream_encoder.c".
warning: Could not find object file "/Users/benski/Desktop/flac-1.2.1/src/libFLAC/.libs/stream_encoder_framing.o" - no debug information available for "stream_encoder_framing.c".
warning: Could not find object file "/Users/benski/Desktop/flac-1.2.1/src/libFLAC/.libs/window.o" - no debug information available for "window.c".
warning: Could not find object file "/Users/benski/Desktop/flac-1.2.1/src/libFLAC/.libs/ogg_decoder_aspect.o" - no debug information available for "ogg_decoder_aspect.c".
warning: Could not find object file "/Users/benski/Desktop/flac-1.2.1/src/libFLAC/.libs/ogg_encoder_aspect.o" - no debug information available for "ogg_encoder_aspect.c".
warning: Could not find object file "/Users/benski/Desktop/flac-1.2.1/src/libFLAC/.libs/ogg_helper.o" - no debug information available for "ogg_helper.c".
warning: Could not find object file "/Users/benski/Desktop/flac-1.2.1/src/libFLAC/.libs/ogg_mapping.o" - no debug information available for "ogg_mapping.c".

私のシステムにはユーザー「benski」がいないので、これは奇妙です。しかし、サンプルプログラムは完全に機能するので、FLACライブラリは正しくインストールされていると確信しています。

4

3 に答える 3

1

ではmain()、ファイルが正常に開かれたことを確認しません。問題は、操作でnullポインターを使用していることである可能性がありますfread()。同様に、write_callback()関数では、コードは無敵の仮定を示しています。(また、コールバックが複数回呼び出された場合、2番目の呼び出しは、最初の呼び出しによって生成されたデータを上書きします。ただし、これは別の問題です。)

によって読み取られた2バイト単位の数は確認しませんfread()。また、どのくらいのデータが書き込まれているかを確認しませんfwrite()-成功しましたか?

gdbまたは同様のデバッガーを使用して、障害が発生した場所を確認できるはずです。

あなたも問題を見つけるために使うことができるかもしれませvalgrindん。

ifとの両方は必要ありませんwhile

if (ok)
{
    while (ok)
    {
        ...
    }
}

ループだけで十分です。ok最初のサイクルでfalseの場合、ゼロ回実行されます。whileループの後と終了前にステートメントがあった場合はif、両方が必要になります。

一般に、位置がずれているデータオブジェクトにアクセスしようとすると、RISCチップでSIGBUS(バスエラー)が発生します。このコードでどの行がその問題を引き起こしている可能性があるかは明らかではありません。以前の「nullポインタ」についてのコメントにもかかわらず、それは通常、SIGBUSよりもSIGSEGV(セグメンテーション違反)で終わります。

于 2011-07-10T16:13:44.040 に答える
0

あなたは言うことによってコアファイルを見ることができます

gdb <executable name> <corefile name> 

次に、「どこ」と言ってトレースバックを確認します。これは、何が失敗しているかを確認するのに役立ちます(ただし、@ JohnathanLefflerが指摘したように、検査によって発見できるバグがいくつかあります)。

于 2011-07-10T16:17:43.360 に答える
0

どのプラットフォーム、コンパイラ、コンパイラオプション(最適化がオンになっているかどうかなど)など、問題を解決するためのポインタが期待できる場合は、詳細をお知らせください。

アラインされていないメモリアドレスでメモリの読み取りまたは書き込み操作が行われると、「バスエラー」がスローされます。しかし、最近のシステム(コンパイラ、プラットフォーム)では、コードが開発されている専用のハードウェアアーキテクチャでない限り、特定の境界に合わせるためのデータに対するハードで高速な必要性がなくなったため、最近バスエラーは発生していません。

今、あなたが持っているこの特定の問題に関して-

(Linuxで動作していると思います)ので、gccの-gスイッチを使用してコードをビルドします。

次に、gdb[実行可能ファイル]を使用してみてください。これにより、エラー後にコードが終了する関数/コード行がわかります。その関数/行/前後のコードを確認してください!

私の推測(ワイルド推測)は、サンプルをpcm [i]に書き込んだり読み取ったりする場所です。これは、FLAC__int32型のユーザー定義データのように見えるためです。しかし、自分でデバッグするまでは、これははるかに遠い可能性があります。幸運を!

于 2011-07-10T16:24:21.783 に答える