Hi Guys

I am trying to encode raw PCM audio from the microphone to AAC audio using LibAv. I am using the output_example.c as a reference but I'm still hitting a brick wall. Here is what I am doing:

Creating the AAC codec and opening it (the input format matches what I am setting the context to)
AVStream* FLVTranscoder::AddAudioStream(AVFormatContext *oc, CodecID codec_id)
    {
        AVCodecContext *c;
        AVStream *st;

        st = av_new_stream(oc, 1);
        if (!st) {
            fprintf(stderr, "Could not alloc stream\n");
            exit(1);
        }

        c = st->codec;
        c->codec_id = codec_id;
        c->codec_type = AVMEDIA_TYPE_AUDIO;

        /* put sample parameters */
        c->sample_fmt = SAMPLE_FMT_S16;
        c->bit_rate = 32000;
        c->sample_rate = 8000;
        c->channels = 1;

        // some formats want stream headers to be separate
        if(oc->oformat->flags & AVFMT_GLOBALHEADER)
            c->flags |= CODEC_FLAG_GLOBAL_HEADER;

        return st;
    }

Open the Audio Codec....


Write the audio (note that the input is a 2048 length byte array)

void Transcoder::WriteAudio(IntPtr data, int length)
    {
        array<int16_t>^ shortArray = gcnew array<int16_t>(length/2);
        Marshal::Copy(data, shortArray, 0, shortArray->Length);

        pin_ptr<int16_t> dataSegment = &shortArray[0];
        WriteAudioFrame(oc, audio_st, dataSegment, shortArray->Length);
    }

void Transcoder::WriteAudioFrame(AVFormatContext *oc, AVStream *st, int16_t* data, int length)
    {
        AVCodecContext *c;
        AVPacket pkt;
        av_init_packet(&pkt);

        c = st->codec;
pkt.size = avcodec_encode_audio(c, audio_outbuf, audio_outbuf_size, data);

        if (c->coded_frame && c->coded_frame->pts != AV_NOPTS_VALUE)
pkt.pts= av_rescale_q(c->coded_frame->pts, c->time_base, st->time_base);

        pkt.flags |= AV_PKT_FLAG_KEY;
        pkt.stream_index = st->index;
        pkt.data = audio_outbuf;

        /* write the compressed frame in the media file */
        if (av_write_frame(oc, &pkt) != 0)
        {
            fprintf(stderr, "Error while writing audio frame\n");
            exit(1);
        }
    }

But I keep getting assertion failed when calling av_write_frame.

Anyone have any suggestions?

Thanks,
Mark.

_______________________________________________
libav-api mailing list
[email protected]
https://lists.libav.org/mailman/listinfo/libav-api

Reply via email to