I finally found the problem and solved it. Paul, your tip was very helpfull, thanks for that!
Initially I was writing to less samples to the encoder (960). To solve that I added an audio_fifo system, but I didn’t correct the amount of samples in the buffer frame, so the encoder was still processing too less samples. Changing the sample amount of the frame made it work. Ruurd > On 15 Jul 2015, at 20:06, Ruurd Adema <[email protected]> wrote: > > 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 <[email protected] >> <mailto:[email protected]>> wrote: >> >> >> Dana 14. 7. 2015. 20:49 osoba "Ruurd Adema" <[email protected] >> <mailto:[email protected]>> 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 >> > [email protected] <mailto:[email protected]> >> > 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 >> [email protected] <mailto:[email protected]> >> http://ffmpeg.org/mailman/listinfo/libav-user > > _______________________________________________ > Libav-user mailing list > [email protected] > http://ffmpeg.org/mailman/listinfo/libav-user
_______________________________________________ Libav-user mailing list [email protected] http://ffmpeg.org/mailman/listinfo/libav-user
