Kyborg2011
Kyborg2011

Reputation: 606

Sox and FFMPEG decode

Hello Please help with sox. My idea is to decode the audio portion through ffmpeg and then process it through the sox. Ie to decode only use FFMPEG. Here is what I have left:


   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++;
                             }




      }


  }

function in = sox_open_mem_read (pAudioBuffer, data_size, NULL, NULL, NULL); gives an error:

formats: can't determine type of file `'

What should I do? How to solve the problem? PLEASE HELP!!!

Upvotes: 0

Views: 2168

Answers (1)

kiddouk
kiddouk

Reputation: 421

As ou can see yourself, sox_open_mem_read is defined like this :

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. */

You may want to specify the filetype in order to indicate which codec you want libsox to use. Depending on the case, some codec are headerless and libsox can't predict which format it will be.

Otherwise, you may not decode your data properly (if you expect to have some data with a header) leading libsox to confusion.

Upvotes: 1

Related Questions