[FFmpeg-user] Problem with playing audio with ao

יוסף אלון yos104104 at gmail.com
Sun Apr 2 14:59:40 EEST 2017


Hi
I am trying to play an audio udp (HE-AAC) using libavcodec and ao player.
.While trying to play I hear a very noisy channel.

This is my code: What am i am doing worng?


#include <libavformat/avformat.h>
#include <libavcodec/avcodec.h>
#include <libavutil/avutil.h>
#include <libavutil/rational.h>
#include <libavutil/samplefmt.h>
#include <ao/ao.h>

#include <stdio.h>


#define AVCODEC_MAX_AUDIO_FRAME_SIZE 19200

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

int main(int argc, char** argv)
{
    //SpectralBandReplication *sbr;
    //int id_aac;
//    sbr_dequant(sbr, id_aac);
    av_register_all();
   avformat_network_init();


    const char* input_filename=argv[1];

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

    if(avformat_find_stream_info(container,NULL)<0)
        die("Could not find file info");


   av_dump_format(container,0,input_filename,0);

    int stream_id=-1;
    int i;
    for(i=0;i<container->nb_streams;i++)
    {
       /* AVStream *stream;
        AVCodecContext *codec_ctx;
        stream = container->streams[i];//Get current stream
        codec_ctx = stream->codec;//Get current stream codec*/
        if(container->streams[i]->codec->codec_type==AVMEDIA_TYPE_AUDIO)
        {
            stream_id=i;//audio stream index
            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);

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


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

    //initialize AO lib
    ao_initialize();

    int driver = ao_default_driver_id();//ao_driver_id("wav");

    ao_sample_format sformat;

    enum AVSampleFormat sfmt=ctx->sample_fmt;
   memset(&sformat, 0, sizeof(sformat));
    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;
    }
   else if(sfmt==AV_SAMPLE_FMT_FLTP){
        sformat.bits=32;
   }
    //sformat.bits = sformat.bits;
    sformat.channels = 2;//ctx->channels;
    sformat.rate =48000;//ctx->sample_rate;
    sformat.byte_format = AO_FMT_LITTLE; // Samples are in little-endian
order
    sformat.matrix = "L,R";
    printf("Sformat:\nBits: %d, Channels:%d\nRate: %d, byte_format:%d
matrix:%s\n",sformat.bits, ctx->channels, sformat.rate,
sformat.byte_format,sformat.matrix);

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

    // prepare to read data
    AVPacket packet;
    av_init_packet(&packet);

    AVFrame *frame=av_frame_alloc();
    if (!frame)
    {
        fprintf(stderr, "Error allocating the frame\n");
        return -1;
    }

    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;
    packet.pos = 0; //addede from
https://lists.ffmpeg.org/pipermail/ffmpeg-user/2013-August/017040.html

    int len;
    int frameFinished=0;
    i = 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] );
                if (i == 0)
                {
                    printf("play\n");
                    i++;
                }
            }else
            {
                printf("Not Finished\n");
            }

        }else {
            printf("Some other packet possibly Video\n");
        }


    }

    avformat_close_input(&container);
    ao_shutdown();
    return 0;
}


--


More information about the ffmpeg-user mailing list