Sox и FFMPEG декодируют - PullRequest
       30

Sox и FFMPEG декодируют

0 голосов
/ 23 июня 2011

Здравствуйте. Пожалуйста, помогите с 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++;
                             }




      }


  }

функция in = sox_open_mem_read (pAudioBuffer, data_size, NULL, NULL, NULL); выдает ошибку:

форматы: невозможно определить тип файла `'

Что мне делать? Как решить проблему? ПОЖАЛУЙСТА, ПОМОГИТЕ !!!

1 Ответ

1 голос
/ 18 июля 2011

Как видите, 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. */

Вы можете указать filetype, чтобы указать, какой кодек вы хотите libsox использовать.В зависимости от случая, некоторые кодеки не имеют заголовков, и libsox не может предсказать, в каком формате это будет.

В противном случае, вы можете не декодировать ваши данные должным образом (если вы ожидаете иметь некоторые данные с заголовком), ведущие libsox.до путаницы.

...