summaryrefslogtreecommitdiff
path: root/avcodec_audio_example.c
diff options
context:
space:
mode:
Diffstat (limited to 'avcodec_audio_example.c')
-rw-r--r--avcodec_audio_example.c114
1 files changed, 114 insertions, 0 deletions
diff --git a/avcodec_audio_example.c b/avcodec_audio_example.c
new file mode 100644
index 0000000..236b976
--- /dev/null
+++ b/avcodec_audio_example.c
@@ -0,0 +1,114 @@
+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;
+ AVSampleFormat sfmt=ctx->sample_fmt;
+ if(sfmt==AV_SAMPLE_FMT_U8){
+ printf("U8\n");
+
+ sformat.bits=8;
+ }else if(sfmt==AV_SAMPLE_FMT_S16){
+ printf("S16\n");
+ sformat.bits=16;
+ }else if(sfmt==AV_SAMPLE_FMT_S32){
+ printf("S32\n");
+ sformat.bits=32;
+ }
+
+ sformat.channels=ctx->channels;
+ sformat.rate=ctx->sample_rate;
+ 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+ FF_INPUT_BUFFER_PADDING_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 len : %d , nb_samples:%d buffer_size:%d line size: %d \n",len,frame->nb_samples,buffer_size,frame->linesize[0]);
+ ao_play(adevice, (char*)frame->extended_data[0],frame->linesize[0] );
+ }else{
+ //printf("Not Finished\n");
+ }
+
+ }else {
+ printf("Someother packet possibly Video\n");
+ }
+
+
+ }
+
+ av_close_input_file(container);
+ ao_shutdown();
+ return 0;
+} \ No newline at end of file