2011-06-23 92 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