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