[Libav-user] Decode audio using libavcodec and play using libAO?

ashika umanga umanga.forums at gmail.com
Wed Mar 21 07:24:17 CET 2012


I use following code snippet to decode audio files (tested with
MP3,WAV,WMV).

But when it plays the audio , it just gives static sounds and crashes time
to time. Any hints on what i am doing wrong here ?

-----------------------------------------------------------------------------------------------------

#include <stdlib.h>
#include <stdio.h>
#include <string.h>
#include <math.h>


extern "C" {
#include "libavutil/mathematics.h"
#include "libavformat/avformat.h"
#include "libswscale/swscale.h"
#include <ao/ao.h>

}

void die(const char *msg)
{
 fprintf(stderr,"%s\n",msg);
 exit(1);
}

int main(int argc, char **argv)
{

 const char* input_filename=argv[1];

 //avcodec_register_all();
 av_register_all();
 //av_ini

 AVFormatContext* container=avformat_alloc_context();
 if(avformat_open_input(&container,input_filename,NULL,NULL)<0){
  die("Could not open file");
 }

 if(av_find_stream_info(container)<0){
  die("Could not find file info");
 }
 av_dump_format(container,0,input_filename,false);

 int stream_id=-1;
 int i;
 for(i=0;i<container->nb_streams;i++){
  if(container->streams[i]->codec->codec_type==AVMEDIA_TYPE_AUDIO){
   stream_id=i;
   break;
  }
 }
 if(stream_id==-1){
  die("Could not find Audio Stream");
 }

 AVDictionary *metadata=container->metadata;

 AVCodecContext *ctx=container->streams[stream_id]->codec;
 AVCodec *codec=avcodec_find_decoder(ctx->codec_id);

 if(codec==NULL){
  die("cannot find codec!");
 }

 if(avcodec_open(ctx,codec)<0){
  die("Codec cannot be found");
 }

 //ctx=avcodec_alloc_context3(codec);

 //initialize AO lib
 ao_initialize();

 int driver=ao_default_driver_id();

 ao_sample_format sformat;
 sformat.bits=16;
 sformat.channels=2;
 sformat.rate=44100;
 sformat.byte_format=AO_FMT_NATIVE;
 sformat.matrix=0;

 ao_device *adevice=ao_open_live(driver,&sformat,NULL);
 //end of init AO LIB

 AVPacket packet;
 av_init_packet(&packet);

 AVFrame *frame=avcodec_alloc_frame();

 int buffer_size=AVCODEC_MAX_AUDIO_FRAME_SIZE;
 uint8_t buffer[buffer_size];
 packet.data=buffer;
 packet.size =buffer_size;



 int len;
 int frameFinished=0;
 while(av_read_frame(container,&packet)>=0)
 {

  if(packet.stream_index==stream_id){
   //printf("Audio Frame read  \n");
   int len=avcodec_decode_audio4(ctx,frame,&frameFinished,&packet);
   //frame->
   if(frameFinished){
    //printf("Finished reading Frame %d %d\n",packet.size,len);
    ao_play(adevice, (char*)frame->data, len);
   }

  }


 }

 av_close_input_file(container);
 ao_shutdown();
 return 0;
}
-------------- next part --------------
An HTML attachment was scrubbed...
URL: <http://ffmpeg.org/pipermail/libav-user/attachments/20120321/4b82c04c/attachment.html>


More information about the Libav-user mailing list