[Libav-user] Encoding live audiopackets
Ruurd Adema
ruurdadema at me.com
Wed Jul 15 20:06:54 CEST 2015
Yes, I tried that, I used an audio_fifo for that. Unfortunately makes no difference:
// This part works well
if (CODEC_TYPE == AV_CODEC_ID_PCM_S16LE)
{
audiopacket->GetPacketTime(&audio_pts, audio_stream->time_base.den);
pkt.pts = audio_pts;
pkt.dts = pkt.pts;
pkt.flags |= AV_PKT_FLAG_KEY;
pkt.stream_index = audio_stream->index;
pkt.data = (uint8_t *)audiopacket_data;
pkt.size = audiopacket_size;
av_interleaved_write_frame(output_fmt_ctx, &pkt);
}
// This part doesn't work
else if (CODEC_TYPE == AV_CODEC_ID_AAC)
{
frame = av_frame_alloc();
frame->format = audio_stream->codec->sample_fmt;
frame->channel_layout = audio_stream->codec->channel_layout;
frame->sample_rate = audio_stream->codec->sample_rate;
frame->nb_samples = audiopacket_sample_count;
requested_size = av_samples_get_buffer_size(NULL, audio_stream->codec->channels, audio_stream->codec->frame_size, audio_stream->codec->sample_fmt, 1);
result = av_audio_fifo_write(audio_fifo, &audiopacket_data, audiopacket_sample_count);
audiopacket->GetPacketTime(&audio_pts, audio_stream->time_base.den);
frame->pts = audio_pts;
frame_buf = av_malloc(requested_size);
// Check if there are enough samples to feed the encoder
if (av_audio_fifo_size(audio_fifo) >= audio_stream->codec->frame_size)
{
result = av_audio_fifo_read(audio_fifo, &frame_buf, audio_stream->codec->frame_size);
if (avcodec_fill_audio_frame(frame, audiopacket_channel_count, audio_stream->codec->sample_fmt, (const uint8_t *)frame_buf, requested_size, 1) < 0)
{
fprintf(stderr, "[ERROR] Filling audioframe failed!\n");
exit(-1);
}
if (avcodec_encode_audio2(audio_stream->codec, &pkt, frame, &got_packet) != 0)
{
fprintf(stderr, "[ERROR] Encoding audio failed\n");
}
if (got_packet)
{
pkt.stream_index = audio_stream->index;
pkt.flags |= AV_PKT_FLAG_KEY;
av_interleaved_write_frame(output_fmt_ctx, &pkt);
}
}
free(frame_buf);
av_frame_free(&frame);
}
av_free_packet(&pkt);
Thank, Ruurd
> On 14 Jul 2015, at 21:16, Paul B Mahol <onemda at gmail.com> wrote:
>
>
> Dana 14. 7. 2015. 20:49 osoba "Ruurd Adema" <ruurdadema at me.com <mailto:ruurdadema at me.com>> napisala je:
> >
> > I'm trying to write live incoming audiopackets into a mov file with AAC encoding using the FFmpeg api.
> >
> > When using no encoding (AV_CODEC_ID_PCM_S16LE) it works well, when using AAC encoding (AV_CODEC_ID_AAC) it fails. The resulting audiofile plays too fast and sounds distorted.
> >
> > I’m new to the FFmpeg api, (and quite a beginner in programming anyway), so big chance I forgot something or doing something wrong. Is there anyone willing to help me with this one?
> >
> > audiopacket_sample_count = audiopacket->GetSampleFrameCount();
> > audiopacket_channel_count = decklink_config()->audio_channel_count;
> > audiopacket_size = audiopacket_sample_count * (decklink_config()->audio_sampletype/8) * audiopacket_channel_count;
> >
> > audiopacket->GetBytes(&audiopacket_data);
> >
> > av_init_packet(&pkt);
> >
> > if (AUDIO_TYPE == AV_CODEC_ID_PCM_S16LE)
> > {
> > audiopacket->GetPacketTime(&audio_pts, audio_stream->time_base.den);
> >
> > pkt.pts = audio_pts;
> > pkt.dts = pkt.pts;
> > pkt.flags |= AV_PKT_FLAG_KEY;
> > pkt.stream_index = audio_stream->index;
> > pkt.data = (uint8_t *)audiopacket_data;
> > pkt.size = audiopacket_size;
> >
> > av_interleaved_write_frame(output_fmt_ctx, &pkt);
> > }
> > else if (AUDIO_TYPE == AV_CODEC_ID_AAC)
> > {
> > frame = av_frame_alloc();
> > frame->format = audio_stream->codec->sample_fmt;
> > frame->channel_layout = audio_stream->codec->channel_layout;
> > frame->sample_rate = audio_stream->codec->sample_rate;
> > frame->nb_samples = audiopacket_sample_count;
> >
> > audiopacket->GetPacketTime(&audio_pts, audio_stream->time_base.den);
> >
> > frame->pts = audio_pts;
> >
> > if (avcodec_fill_audio_frame(frame, audiopacket_channel_count, audio_stream->codec->sample_fmt, (const uint8_t *)audiopacket_data, audiopacket_size, 0) < 0)
> > {
> > fprintf(stderr, "[ERROR] Filling audioframe failed!\n");
> > exit(-1);
> > }
> >
> > if (avcodec_encode_audio2(audio_stream->codec, &pkt, frame, &got_packet) != 0)
> > {
> > fprintf(stderr, "[ERROR] Encoding audio failed\n");
> > }
> >
> > if (got_packet)
> > {
> > pkt.stream_index = audio_stream->index;
> > pkt.flags |= AV_PKT_FLAG_KEY;
> >
> > av_interleaved_write_frame(output_fmt_ctx, &pkt);
> > }
> > av_frame_free(&frame);
> > }
> > av_free_packet(&pkt);
> >
> >
> >
> > _______________________________________________
> > Libav-user mailing list
> > Libav-user at ffmpeg.org <mailto:Libav-user at ffmpeg.org>
> > http://ffmpeg.org/mailman/listinfo/libav-user <http://ffmpeg.org/mailman/listinfo/libav-user>
> >
>
> Do you send exact same number of samples that aac encoder request? You need to buffer samples....
> _______________________________________________
> Libav-user mailing list
> Libav-user at ffmpeg.org
> http://ffmpeg.org/mailman/listinfo/libav-user
-------------- next part --------------
An HTML attachment was scrubbed...
URL: <http://ffmpeg.org/pipermail/libav-user/attachments/20150715/50b665a7/attachment.html>
More information about the Libav-user
mailing list