2011-12-29 15 views
4

xcodeプロジェクトにLibFlacが追加されました。次に、プロジェクトのLibflacからdecode/main.cを追加しました。 私はinfile.flacに合格し、プロジェクトの実行可能ファイルを実行しますが、それは次のようなエラーにwacから/へflacのデコード/エンコード中にエラーが発生しました

デコード与えている:FAILED状態:FLAC__STREAM_DECODER_END_OF_STREAMは

トンここ

はmain.cの

int main(int argc, char *argv[]) 
{ 
    FLAC__bool ok = true; 
    FLAC__StreamDecoder *decoder = 0; 
    FLAC__StreamDecoderInitStatus init_status; 
    FILE *fout; 

    const char *infile = "infile.flac"; 
    const char *outfile = "outfile.wav"; 

    /* 
    if(argc != 3) { 
     fprintf(stderr, "usage: %s infile.flac outfile.wav\n", argv[0]); 
     return 1; 
    } 
    */ 

    if((fout = fopen("infile.flac", "wb")) == NULL) { 
     fprintf(stderr, "ERROR: opening %s for output\n", argv[2]); 
     return 1; 
    } 

    if((decoder = FLAC__stream_decoder_new()) == NULL) { 
     fprintf(stderr, "ERROR: allocating decoder\n"); 
     fclose(fout); 
     return 1; 
    } 

    (void)FLAC__stream_decoder_set_md5_checking(decoder, true); 

    init_status = FLAC__stream_decoder_init_file(decoder, infile, write_callback, metadata_callback, error_callback, /*client_data=*/fout); 
    if(init_status != FLAC__STREAM_DECODER_INIT_STATUS_OK) { 
     fprintf(stderr, "ERROR: initializing decoder: %s\n", FLAC__StreamDecoderInitStatusString[init_status]); 
     ok = false; 
    } 

    if(ok) { 
     ok = FLAC__stream_decoder_process_until_end_of_stream(decoder); 
     fprintf(stderr, "decoding: %s\n", ok? "succeeded" : "FAILED"); 
     fprintf(stderr, " state: %s\n", FLAC__StreamDecoderStateString[FLAC__stream_decoder_get_state(decoder)]); 
    } 

    FLAC__stream_decoder_delete(decoder); 
    fclose(fout); 

    return 0; 
} 
ですlogouを

私を助けてください。なぜこのエラーが発生していますか?

+0

FLACファイルは正しいですか?メタデータを最初に処理するには 'FLAC__stream_decoder_process_until_end_of_metadata()'を呼び出す必要があります。 – stativ

+0

ok ..返信ありがとう、私はflacファイルをチェックしてこの関数を呼び出します – iProgrammer

+0

@stativこんにちは? – iProgrammer

答えて

3

"wb"で入力ファイルを開くと、それを開いたときにあなたのファイルが切り捨てられます。それはあなたが望むものではありませんよね? 私はあなたが本当に意味すると思います。

if((fout = fopen(outfile, "wb")) == NULL) { 

FLACサンプルがどのように動作するかは多少混乱しているようです。

FLAC__stream_decoder_init_file 

ファイルを開き、ファイル名をデコード用に指定し、デコード用のコールバックを設定します。

FLAC__stream_decoder_process_until_end_of_stream 

は、ファイルを復号化し、すべてのために、それはそれの最後のパラメータとして与えられたパラメータを持つFLAC__stream_decoder_init_fileへの呼び出しで提供write_callback関数を呼び出すフレームデコード。

つまり、ファイルを書き込むすべての作業は、write_callbackで行われます。これでデコードされたデータが提供され、出力ファイルをフレームごとに生成して書き込む必要があります。 http://flac.cvs.sourceforge.net/viewvc/flac/flac/examples/c/decode/file/main.c?view=markupのサンプルを見ると、最初にコピーしたものと思われますが、それはまさにそれがしていることです。

+0

私はflacをwavに変換したいと思いますが、ここではinfile not outfileを渡すべきです – iProgrammer

+0

あなたは入力ファイル名をFLAC__stream_decoder_init_fileに渡しています。そのメソッドはあなたが入力した名前を使って入力ファイルを開きます。あなたの問題を理解する限り、出力ファイルに書き込むだけで、コールバックに渡すために使用されます。 –

+0

また、そこに入力ファイルを開く必要がある場合は、読み込みには "rb"、切り詰めと上書きには "wb"を使用して開く必要があります。 –

関連する問題