diff options
| author | Comment <tim@gray.(none)> | 2013-03-21 22:05:38 +0000 |
|---|---|---|
| committer | Comment <tim@gray.(none)> | 2013-03-21 22:05:38 +0000 |
| commit | 49993e6f9c77bf4c610b53e3abc4ce5651c7700b (patch) | |
| tree | 1243bb08fbdb3f1c8b2c395727e190646c56ae96 /avcodec_audio_example.c | |
| parent | d7b3e313c43420e5914349831fdd14486846e161 (diff) | |
wrestling with libavcodec
Diffstat (limited to 'avcodec_audio_example.c')
| -rw-r--r-- | avcodec_audio_example.c | 114 |
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 |
