[Libav-user] Playing audio file with libavcodec
Anitha Susan Varghese
anithasusan at tataelxsi.co.in
Wed Aug 21 07:15:59 CEST 2013
Hi
Myself trying to play an audio file using libavcodec in qt5 .While trying to play i am unable to play the the file.
while decoding the file using av_read_frame()
audioStream->index=0
and packet.stream_index is some higher nos .so avcodec_decode_audio4() is not getting executed.Why is it so?
This is my program. My output is also given below.Please help me in solving this.
-------------------------------------------------------------------------------------------------------------------------------------
#include <QApplication>
#include <QtDebug>
#include <ao/ao.h>
extern "C" {
#include "libavutil/samplefmt.h"
#include "libavcodec/avcodec.h"
#include "libavutil/mathematics.h"
#include "libavutil/avutil.h"
#include "libavformat/avformat.h"
#include "libswscale/swscale.h"
#include "libavutil/dict.h"
#include <ao/ao.h>
#include "libavformat/version.h"
}
#define AVCODEC_MAX_AUDIO_FRAME_SIZE 192000
#define CODEC_TYPE_VIDEO AVMEDIA_TYPE_VIDEO
void die( const char* msg)
{
qDebug() << msg ;
}
int main(int argc, char *argv[])
{
QApplication app(argc, argv);
const char* input_filename=argv[1];
static int driver;
static ao_device *audio_device;
int i;
int stream_id=-1;
av_register_all();
avcodec_register_all();
AVFormatContext* container=NULL;
AVStream* audioStream=NULL;
//container=avformat_alloc_context();
if(avformat_open_input(&container,input_filename,NULL,NULL)<0){
die("Could not open file");
}
else
die("File Opend");
if(avformat_find_stream_info(container,NULL)<0){
die("Could not find file info");
}
av_dump_format(container,0,input_filename,false);
for(i=0; i < container->nb_streams; i++){
if(container->streams[i]->codec->codec_type==AVMEDIA_TYPE_AUDIO){
stream_id=i;
audioStream=container->streams[i];
qWarning() <<"audioStream"<<audioStream;
qWarning() <<"Stream id:"<<stream_id;
break;
}
}
if(stream_id==-1){
die("Could not find Audio Stream");
}
AVCodecContext *ctx=container->streams[stream_id]->codec;
qWarning() <<"Codec ptr:"<< ctx;
AVCodec *codec=avcodec_find_decoder(ctx->codec_id);
if(codec==NULL){
die("cannot find codec!");
}
if(avcodec_open2(ctx,codec,NULL)<0){
die("Codec cannot be opended!");
}
else
qWarning()<<"Codec Opened";
ao_initialize();
driver = ao_default_driver_id();
qWarning()<<"DRIVER ID" <<driver;
ao_sample_format sformat;
AVPacket dummy_packet;
av_read_frame(container,&dummy_packet);
AVSampleFormat sfmt=ctx->sample_fmt;
//assign device sample rate depend on the input stream
qWarning()<<"Sample format"<<sfmt;
if(sfmt==AV_SAMPLE_FMT_U8){
sformat.bits=8;
qWarning()<<"Sample format"<<sformat.bits;
}
else if(sfmt==AV_SAMPLE_FMT_S16){
sformat.bits=16;
qWarning()<<"Sample format"<<sformat.bits;
}
else if(sfmt==AV_SAMPLE_FMT_S32){
sformat.bits=32;
qWarning()<<"Sample format:AV_SAMPLE_FMT_S32"<<sformat.bits;
}
else if(sfmt==AV_SAMPLE_FMT_FLT){
sformat.bits=32;
qWarning()<<"Sample format:AV_SAMPLE_FMT_FLT"<<sformat.bits;
else if(sfmt==AV_SAMPLE_FMT_DBL){
sformat.bits=64;
qWarning()<<"Sample format"<<sformat.bits;
}
else if(sfmt==AV_SAMPLE_FMT_U8P){
sformat.bits=8;
qWarning()<<"Sample format"<<sformat.bits;
}
else if(sfmt==AV_SAMPLE_FMT_S16P){
sformat.bits=16;
qWarning()<<"Sample format"<<sformat.bits;
}
else if(sfmt==AV_SAMPLE_FMT_S32P){
sformat.bits=32;
qWarning()<<"Sample format:AV_SAMPLE_FMT_S32P"<<sformat.bits;
}
else if(sfmt==AV_SAMPLE_FMT_FLTP){
sformat.bits=32;
qWarning()<<"Sample format:AV_SAMPLE_FMT_FLTP"<<sformat.bits;
}
else if(sfmt==AV_SAMPLE_FMT_DBLP){
sformat.bits=64;
qWarning()<<"Sample format"<<sformat.bits;
}
sformat.channels=ctx->channels;
//sformat.channels=2;
qWarning()<<"Sample format channels"<<sformat.channels;
sformat.rate=ctx->sample_rate;
qWarning()<<"Sample format rate"<<sformat.rate;
sformat.byte_format=AO_FMT_NATIVE;
qWarning()<<"Sample format "<<sformat.byte_format;
sformat.matrix=0;
//seek back to the beginning of stream
av_seek_frame(container,stream_id,0,AVSEEK_FLAG_ANY);
audio_device=ao_open_live(driver,&sformat,NULL);
//end of init AO LIB
//data packet read from the stream
AVPacket packet;
av_init_packet(&packet);
int buffer_size=AVCODEC_MAX_AUDIO_FRAME_SIZE+ FF_INPUT_BUFFER_PADDING_SIZE;;
qWarning()<<"buffersize "<<buffer_size;
uint8_t buffer[buffer_size];
packet.data=buffer;
packet.size =buffer_size;
//frame ,where the decoded data will be written
AVFrame *frame=avcodec_alloc_frame();
int len;
int frameFinished=0;
qWarning()<<"CODEC"<<audioStream->codec;
while(av_read_frame(container,&packet)>=0)
{
// qWarning()<<audioStream->index;
if(packet.stream_index==audioStream->index){
len=avcodec_decode_audio4(ctx,frame,&frameFinished,&packet);
qWarning()<<"Enterd if loop";
// qWarning() <<len;
if(frameFinished){
//play the decoded byteis
qWarning()<<"PLAYING";
ao_play(audio_device, (char*)frame->extended_data[0],frame->linesize[0] );
}else{
}
}
avformat_close_input(&container);
ao_shutdown();
return app.exec();
}
----------------------------------------------------------------------------------------------------------------------------------
My output
-------------------------------------------------------------------------------------------------------------------- File Opend
Input #0, ogg, from '/home/tel/Downloads/desktop-login.ogg':
Duration: 00:00:07.72, start: 0.000000, bitrate: 108 kb/s
Stream #0:0: Audio: vorbis, 44100 Hz, stereo, fltp, 112 kb/s
audioStream 0x88b3f20
Stream id: 0
Codec ptr: 0x88b4100
Codec Opened
DRIVER ID 1
Sample format 3
Sample format:AV_SAMPLE_FMT_FLT 32
Sample format channels 0
Sample format rate 0
Sample format 4
buffersize 192008
CODEC 0x88b4100
--------------------------------------------------------------------------------------------------------------
Regards,
Anitha Susan Varghese
-------------- next part --------------
An HTML attachment was scrubbed...
URL: <http://ffmpeg.org/pipermail/libav-user/attachments/20130821/947651d7/attachment.html>
More information about the Libav-user
mailing list