2011-06-23 137 views
0

您好請幫助sox。我的想法是通過ffmpeg解碼音頻部分,然後通過sox進行處理。即只解碼使用FFMPEG。 以下是我已經離開:在= sox_open_mem_read(pAudioBuffer,DATA_SIZE,NULL,NULL,NULL)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++; 
          } 




     } 


    } 

功能; 給出了一個錯誤:

格式:無法確定文件`」

我應該做什麼類型的?如何解決問題?請幫忙!!!

回答

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