<html dir="ltr">
<head>
<meta http-equiv="Content-Type" content="text/html; charset=iso-8859-1">
<style type="text/css" id="owaParaStyle"><!----></style>
</head>
<body fpstyle="1" ocsi="0">
<div style="direction: ltr;font-family: Tahoma;color: #000000;font-size: 10pt;">
<div>Hi</div>
<div><br>
</div>
<div>Myself trying to play an audio file using libavcodec in qt5 .While trying to play i am unable to play the the file.</div>
<div>while decoding the file using av_read_frame()</div>
<div>audioStream->index=0</div>
<div>and packet.stream_index is some higher nos .so avcodec_decode_audio4() is not getting executed.Why is it so?</div>
<div><br>
</div>
<div>This is my program. My output is also given below.Please help me in solving this.</div>
<div>-------------------------------------------------------------------------------------------------------------------------------------</div>
<div>#include <QApplication></div>
<div>#include <QtDebug></div>
<div>#include <ao/ao.h></div>
<div><br>
</div>
<div>extern "C" {</div>
<div>#include "libavutil/samplefmt.h"</div>
<div>#include "libavcodec/avcodec.h"</div>
<div>#include "libavutil/mathematics.h"</div>
<div>#include "libavutil/avutil.h"</div>
<div>#include "libavformat/avformat.h"</div>
<div>#include "libswscale/swscale.h"</div>
<div>#include "libavutil/dict.h"</div>
<div>#include <ao/ao.h></div>
<div>#include "libavformat/version.h"</div>
<div>}</div>
<div>#define AVCODEC_MAX_AUDIO_FRAME_SIZE 192000</div>
<div>#define CODEC_TYPE_VIDEO AVMEDIA_TYPE_VIDEO</div>
<div><br>
</div>
<div><br>
</div>
<div><br>
</div>
<div>void die( const char* msg)</div>
<div>{</div>
<div>qDebug() <<  msg ;</div>
<div>}</div>
<div><br>
</div>
<div>int main(int argc, char *argv[])</div>
<div>{</div>
<div>    QApplication app(argc, argv);</div>
<div>    const char* input_filename=argv[1];</div>
<div><br>
</div>
<div>    static int driver;</div>
<div>    static ao_device *audio_device;</div>
<div>    int i;</div>
<div>    int stream_id=-1;</div>
<div>    av_register_all();</div>
<div>    avcodec_register_all();</div>
<div>
<div>    AVFormatContext* container=NULL;</div>
<div>    AVStream* audioStream=NULL;</div>
<div>       //container=avformat_alloc_context();</div>
<div><br>
</div>
<div>     if(avformat_open_input(&container,input_filename,NULL,NULL)<0){</div>
<div>                die("Could not open file");</div>
<div>        }</div>
<div>       else</div>
<div>       die("File Opend");</div>
<div><br>
</div>
<div><br>
</div>
<div>    if(avformat_find_stream_info(container,NULL)<0){</div>
<div>                die("Could not find file info");</div>
<div>        }</div>
<div><br>
</div>
<div><br>
</div>
<div>    av_dump_format(container,0,input_filename,false);</div>
<div>    for(i=0; i < container->nb_streams; i++){</div>
<div><br>
</div>
<div>        if(container->streams[i]->codec->codec_type==AVMEDIA_TYPE_AUDIO){</div>
<div>                stream_id=i;</div>
<div>                audioStream=container->streams[i];</div>
<div><br>
</div>
<div>                qWarning() <<"audioStream"<<audioStream;</div>
<div>                qWarning() <<"Stream id:"<<stream_id;</div>
<div>                 break;</div>
<div>                 }</div>
<div>        }</div>
<div><br>
</div>
<div>    if(stream_id==-1){</div>
<div>        die("Could not find Audio Stream");</div>
<div>    }</div>
<div><br>
</div>
<div><br>
</div>
<div>    AVCodecContext *ctx=container->streams[stream_id]->codec;</div>
<div>    qWarning() <<"Codec ptr:"<< ctx;</div>
<div>    AVCodec *codec=avcodec_find_decoder(ctx->codec_id);</div>
</div>
<div>
<div> if(codec==NULL){</div>
<div>        die("cannot find codec!");</div>
<div>   }</div>
<div><br>
</div>
<div>  if(avcodec_open2(ctx,codec,NULL)<0){</div>
<div>        die("Codec cannot be opended!");</div>
<div>   }</div>
<div>   else</div>
<div>        qWarning()<<"Codec Opened";</div>
<div><br>
</div>
<div><br>
</div>
<div>    ao_initialize();</div>
<div>    driver = ao_default_driver_id();</div>
<div>    qWarning()<<"DRIVER ID" <<driver;</div>
<div>   ao_sample_format sformat;</div>
<div>   AVPacket dummy_packet;</div>
<div>   av_read_frame(container,&dummy_packet);</div>
<div>   AVSampleFormat sfmt=ctx->sample_fmt;</div>
<div>//assign device sample rate depend on the input stream</div>
<div><br>
</div>
<div>   qWarning()<<"Sample format"<<sfmt;</div>
<div><br>
</div>
<div>   if(sfmt==AV_SAMPLE_FMT_U8){</div>
<div>        sformat.bits=8;</div>
<div>        qWarning()<<"Sample format"<<sformat.bits;</div>
<div>   }</div>
<div>   else if(sfmt==AV_SAMPLE_FMT_S16){</div>
<div>        sformat.bits=16;</div>
<div>        qWarning()<<"Sample format"<<sformat.bits;</div>
<div>  }</div>
<div>  else if(sfmt==AV_SAMPLE_FMT_S32){</div>
<div>        sformat.bits=32;</div>
<div>        qWarning()<<"Sample format:AV_SAMPLE_FMT_S32"<<sformat.bits;</div>
<div>  }</div>
<div>else if(sfmt==AV_SAMPLE_FMT_FLT){</div>
<div>        sformat.bits=32;</div>
<div>        qWarning()<<"Sample format:AV_SAMPLE_FMT_FLT"<<sformat.bits;</div>
</div>
<div>
<div> else if(sfmt==AV_SAMPLE_FMT_DBL){</div>
<div>        sformat.bits=64;</div>
<div>        qWarning()<<"Sample format"<<sformat.bits;</div>
<div>  }</div>
<div>  else if(sfmt==AV_SAMPLE_FMT_U8P){</div>
<div>        sformat.bits=8;</div>
<div>        qWarning()<<"Sample format"<<sformat.bits;</div>
<div>  }</div>
<div>  else if(sfmt==AV_SAMPLE_FMT_S16P){</div>
<div>        sformat.bits=16;</div>
<div>        qWarning()<<"Sample format"<<sformat.bits;</div>
<div>  }</div>
<div><br>
</div>
<div>   else if(sfmt==AV_SAMPLE_FMT_S32P){</div>
<div>        sformat.bits=32;</div>
<div>        qWarning()<<"Sample format:AV_SAMPLE_FMT_S32P"<<sformat.bits;</div>
<div>  }</div>
<div>  else if(sfmt==AV_SAMPLE_FMT_FLTP){</div>
<div>        sformat.bits=32;</div>
<div>        qWarning()<<"Sample format:AV_SAMPLE_FMT_FLTP"<<sformat.bits;</div>
<div>  }</div>
<div> else if(sfmt==AV_SAMPLE_FMT_DBLP){</div>
<div>        sformat.bits=64;</div>
<div>        qWarning()<<"Sample format"<<sformat.bits;</div>
<div>  }</div>
<div><br>
</div>
<div><br>
</div>
<div>   sformat.channels=ctx->channels;</div>
<div><br>
</div>
<div>  //sformat.channels=2;</div>
<div>  qWarning()<<"Sample format channels"<<sformat.channels;</div>
<div><br>
</div>
<div>  sformat.rate=ctx->sample_rate;</div>
<div>  qWarning()<<"Sample format rate"<<sformat.rate;</div>
<div><br>
</div>
<div>  sformat.byte_format=AO_FMT_NATIVE;</div>
<div>  qWarning()<<"Sample format "<<sformat.byte_format;</div>
</div>
<div>
<div> sformat.matrix=0;</div>
<div><br>
</div>
<div> //seek back to the beginning of stream</div>
<div>  av_seek_frame(container,stream_id,0,AVSEEK_FLAG_ANY);</div>
<div><br>
</div>
<div>  audio_device=ao_open_live(driver,&sformat,NULL);</div>
<div>//end of init AO LIB</div>
<div><br>
</div>
<div>//data packet read from the stream</div>
<div>  AVPacket packet;</div>
<div>  av_init_packet(&packet);</div>
<div><br>
</div>
<div>  int buffer_size=AVCODEC_MAX_AUDIO_FRAME_SIZE+ FF_INPUT_BUFFER_PADDING_SIZE;;</div>
<div><br>
</div>
<div>  qWarning()<<"buffersize "<<buffer_size;</div>
<div>  uint8_t buffer[buffer_size];</div>
<div>  packet.data=buffer;</div>
<div>  packet.size =buffer_size;</div>
<div><br>
</div>
<div>//frame ,where the decoded data will be written</div>
<div>  AVFrame *frame=avcodec_alloc_frame();</div>
<div> int len;</div>
<div>  int frameFinished=0;</div>
<div><br>
</div>
<div>  qWarning()<<"CODEC"<<audioStream->codec;</div>
<div>  while(av_read_frame(container,&packet)>=0)</div>
<div>  {</div>
<div>//        qWarning()<<audioStream->index;</div>
<div>        if(packet.stream_index==audioStream->index){</div>
<div>        len=avcodec_decode_audio4(ctx,frame,&frameFinished,&packet);</div>
<div>        qWarning()<<"Enterd if loop";</div>
<div>      //  qWarning() <<len;</div>
<div>        if(frameFinished){</div>
<div>//play the decoded byteis</div>
<div>                qWarning()<<"PLAYING";</div>
<div>                ao_play(audio_device, (char*)frame->extended_data[0],frame->linesize[0] );</div>
<div>  }else{</div>
</div>
<div>}</div>
<div>}</div>
<div>
<div> avformat_close_input(&container);</div>
<div>  ao_shutdown();</div>
<div>  return app.exec();</div>
<div>}</div>
</div>
<div>----------------------------------------------------------------------------------------------------------------------------------</div>
<div>My output</div>
<div>--------------------------------------------------------------------------------------------------------------------                     File Opend</div>
<div>Input #0, ogg, from '/home/tel/Downloads/desktop-login.ogg':</div>
<div>  Duration: 00:00:07.72, start: 0.000000, bitrate: 108 kb/s</div>
<div>    Stream #0:0: Audio: vorbis, 44100 Hz, stereo, fltp, 112 kb/s</div>
<div>audioStream 0x88b3f20</div>
<div>Stream id: 0</div>
<div>Codec ptr: 0x88b4100</div>
<div>Codec Opened</div>
<div>DRIVER ID 1</div>
<div>Sample format 3</div>
<div>Sample format:AV_SAMPLE_FMT_FLT 32</div>
<div>Sample format channels 0</div>
<div>Sample format rate 0</div>
<div>Sample format  4</div>
<div>buffersize  192008</div>
<div>CODEC 0x88b4100</div>
<div>                                                           </div>
<div><br>
</div>
<div>--------------------------------------------------------------------------------------------------------------</div>
<div><br>
<div style="font-family:Tahoma; font-size:13px">
<div>
<div style="margin-top:0px; margin-bottom:0px"><font face="Tahoma,sans-serif">Regards,<br>
Anitha Susan Varghese<br>
</font><br>
</div>
</div>
<div></div>
</div>
</div>
</div>
<br clear=all> 
</body>
</html>