2011-06-23 32 views
0

こんにちはsoxで助けてください。私の考えは、オーディオ部分をffmpegでデコードし、次にsoxを通して処理することです。つまり、FFMPEGだけをデコードすることです。ここ は、私が残したものです:SoxとFFMPEGデコード


    av_register_all(); 

    char *str = "/home/user/spoon_-_got_nuffin.mp3"; 
printf("hdhd2"); 

    if(av_open_input_file(&pFormatCtx, str, NULL, 0, NULL)!=0) 
    return -150; // Couldn't open file 
printf("hdhd3"); 
    // Retrieve stream information 
    if(av_find_stream_info(pFormatCtx)nb_streams; i++) { 

    if(audioStream streams[audioStream]->codec; 

    ReSampleContext* rsc = av_audio_resample_init(
    1, aCodecCtx->channels, 
    8000, aCodecCtx->sample_rate, 
     av_get_sample_fmt("u8"), aCodecCtx->sample_fmt, 
     1, 1, 1, 1); 


    aCodec = avcodec_find_decoder(aCodecCtx->codec_id); 


    if(!aCodec) { 
    fprintf(stderr, "Unsupported codec!\n"); 
    return -45; 
    } 

    avcodec_open(aCodecCtx, aCodec); 
    c=avcodec_alloc_context(); 

    int source_sample_size = av_get_bits_per_sample_format(av_get_sample_fmt("u8")); 
    int number = 0; 

    int decoded = 0; 

    while (av_read_frame(pFormatCtx, &packet)>= 0) { 
     if (aCodecCtx->codec_type == AVMEDIA_TYPE_AUDIO) { 

        int data_size = AVCODEC_MAX_AUDIO_FRAME_SIZE * 2; 
        int size=packet.size; 


        while(size > 0) { 

          int len = avcodec_decode_audio3(aCodecCtx, (int32_t)pAudioBuffer, &data_size, &packet); 

          int argc; 
          char * args[3]; 
          sox_effects_chain_t * chain; 
          sox_effect_t * e; 



          size_t number_read; 

          /* All libSoX applications must start by initialising the SoX library */ 
          sox_init(); 

          /* Open the input file (with default parameters) */ 
          in = sox_open_mem_read(pAudioBuffer, data_size, NULL, NULL, NULL); 


          decoded +=data_size; 
          size -= data_size; 
          number++; 
          } 




     } 


    } 

機能= sox_open_mem_read(pAudioBuffer、DATA_SIZE、NULL、NULL、NULL)で;

形式: はエラーを与え、ファイルの種類を判断することはできません `」

を私は何をすべき?どのように問題を解決するには?助けてください!!! OUとして

答えて

1

自分を見ることができ、sox_open_mem_readは、このように定義されています

SOX_API sox_open_mem_read(
    LSX_PARAM_IN_BYTECOUNT(buffer_size) void * buffer,  /* Pointer to audio data buffer (required). */ 
    size_t          buffer_size,/* Number of bytes to read from audio data buffer. */ 
    LSX_PARAM_IN_OPT sox_signalinfo_t const * signal,  /* Information already known about audio stream, or NULL if none. */ 
    LSX_PARAM_IN_OPT sox_encodinginfo_t const * encoding, /* Information already known about sample encoding, or NULL if none. */ 
    LSX_PARAM_IN_OPT_Z char    const * filetype); /* Previously-determined file type, or NULL to auto-detect. */ 

あなたはlibsoxを使用したいコーデックを示すためにfiletypeを指定したい場合があります。場合によっては、コーデックによってはヘッダーがなく、libsoxはどのフォーマットになるか予測できません。

そうしないと、データを正しくデコードせずに、ヘッダー付きのデータがあると、libsoxが混乱する可能性があります。

+0

どのコーデックを書きますか?私はffmpegを解読すれば、何を書くべきか分からない。 – Kyborg2011

関連する問題