<html><head><meta http-equiv="Content-Type" content="text/html charset=utf-8"></head><body style="word-wrap: break-word; -webkit-nbsp-mode: space; -webkit-line-break: after-white-space;" class="">I finally found the problem and solved it.<div class=""><br class=""></div><div class="">Paul, your tip was very helpfull, thanks for that!</div><div class=""><br class=""></div><div class="">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.</div><div class=""><br class=""></div><div class="">Changing the sample amount of the frame made it work.</div><div class=""><br class=""></div><div class="">Ruurd</div><div class=""><br class=""><div><blockquote type="cite" class=""><div class="">On 15 Jul 2015, at 20:06, Ruurd Adema <<a href="mailto:ruurdadema@me.com" class="">ruurdadema@me.com</a>> wrote:</div><br class="Apple-interchange-newline"><div class=""><meta http-equiv="Content-Type" content="text/html charset=utf-8" class=""><div style="word-wrap: break-word; -webkit-nbsp-mode: space; -webkit-line-break: after-white-space;" class="">Yes, I tried that, I used an audio_fifo for that. Unfortunately makes no difference:<div class=""><div class=""><br class=""></div><div class=""><div class=""><font face="Courier" class="">// This part works well</font></div><div class=""><font face="Courier" class="">if (CODEC_TYPE == AV_CODEC_ID_PCM_S16LE)</font></div><div class=""><font face="Courier" class="">{</font></div><div class=""><font face="Courier" class=""> audiopacket->GetPacketTime(&audio_pts, audio_stream->time_base.den);</font></div><div class=""><font face="Courier" class=""> </font></div><div class=""><font face="Courier" class=""> pkt.pts = audio_pts;</font></div><div class=""><font face="Courier" class=""> pkt.dts = pkt.pts; </font></div><div class=""><font face="Courier" class=""> pkt.flags |= AV_PKT_FLAG_KEY; </font></div><div class=""><font face="Courier" class=""> pkt.stream_index = audio_stream->index;</font></div><div class=""><font face="Courier" class=""> pkt.data = (uint8_t *)audiopacket_data;</font></div><div class=""><font face="Courier" class=""> pkt.size = audiopacket_size;</font></div><div class=""><font face="Courier" class=""><br class=""></font></div><div class=""><font face="Courier" class=""> av_interleaved_write_frame(output_fmt_ctx, &pkt);</font></div><div class=""><font face="Courier" class="">} </font></div><div class=""><font face="Courier" class="">// This part doesn't work</font></div><div class=""><font face="Courier" class="">else if (CODEC_TYPE == AV_CODEC_ID_AAC)</font></div><div class=""><font face="Courier" class="">{</font></div><div class=""><font face="Courier" class=""> frame = av_frame_alloc();</font></div><div class=""><font face="Courier" class=""> frame->format = audio_stream->codec->sample_fmt;</font></div><div class=""><font face="Courier" class=""> frame->channel_layout = audio_stream->codec->channel_layout;</font></div><div class=""><font face="Courier" class=""> frame->sample_rate = audio_stream->codec->sample_rate;</font></div><div class=""><font face="Courier" class=""> frame->nb_samples = audiopacket_sample_count;</font></div><div class=""><font face="Courier" class=""><br class=""></font></div><div class=""><font face="Courier" class=""> requested_size = av_samples_get_buffer_size(NULL, audio_stream->codec->channels, audio_stream->codec->frame_size, audio_stream->codec->sample_fmt, 1);</font></div><div class=""><font face="Courier" class=""><br class=""></font></div><div class=""><font face="Courier" class=""> result = av_audio_fifo_write(audio_fifo, &audiopacket_data, audiopacket_sample_count);</font></div><div class=""><font face="Courier" class=""><br class=""></font></div><div class=""><font face="Courier" class=""> audiopacket->GetPacketTime(&audio_pts, audio_stream->time_base.den);</font></div><div class=""><font face="Courier" class=""> </font></div><div class=""><font face="Courier" class=""> frame->pts = audio_pts;</font></div><div class=""><font face="Courier" class=""><br class=""></font></div><div class=""><font face="Courier" class=""> frame_buf = av_malloc(requested_size);</font></div><div class=""><font face="Courier" class=""><br class=""></font></div><div class=""><font face="Courier" class=""> // Check if there are enough samples to feed the encoder</font></div><div class=""><font face="Courier" class=""> if (av_audio_fifo_size(audio_fifo) >= audio_stream->codec->frame_size)</font></div><div class=""><font face="Courier" class=""> {</font></div><div class=""><font face="Courier" class=""> result = av_audio_fifo_read(audio_fifo, &frame_buf, audio_stream->codec->frame_size);</font></div><div class=""><font face="Courier" class=""><br class=""></font></div><div class=""><font face="Courier" class=""> if (avcodec_fill_audio_frame(frame, audiopacket_channel_count, audio_stream->codec->sample_fmt, (const uint8_t *)frame_buf, requested_size, 1) < 0)</font></div><div class=""><font face="Courier" class=""> {</font></div><div class=""><font face="Courier" class=""> fprintf(stderr, "[ERROR] Filling audioframe failed!\n");</font></div><div class=""><font face="Courier" class=""> exit(-1);</font></div><div class=""><font face="Courier" class=""> }</font></div><div class=""><font face="Courier" class=""> </font></div><div class=""><font face="Courier" class=""> if (avcodec_encode_audio2(audio_stream->codec, &pkt, frame, &got_packet) != 0)</font></div><div class=""><font face="Courier" class=""> {</font></div><div class=""><font face="Courier" class=""> fprintf(stderr, "[ERROR] Encoding audio failed\n");</font></div><div class=""><font face="Courier" class=""> }</font></div><div class=""><font face="Courier" class=""><br class=""></font></div><div class=""><font face="Courier" class=""> if (got_packet) </font></div><div class=""><font face="Courier" class=""> {</font></div><div class=""><font face="Courier" class=""> pkt.stream_index = audio_stream->index;</font></div><div class=""><font face="Courier" class=""> pkt.flags |= AV_PKT_FLAG_KEY; </font></div><div class=""><font face="Courier" class=""><br class=""></font></div><div class=""><font face="Courier" class=""> av_interleaved_write_frame(output_fmt_ctx, &pkt);</font></div><div class=""><font face="Courier" class=""> }</font></div><div class=""><font face="Courier" class=""> }</font></div><div class=""><font face="Courier" class=""> free(frame_buf);</font></div><div class=""><font face="Courier" class=""> av_frame_free(&frame); </font></div><div class=""><font face="Courier" class="">}</font></div><div class=""><font face="Courier" class="">av_free_packet(&pkt);</font></div></div><div class=""><br class=""></div><div class="">Thank, Ruurd</div><div class=""><br class=""><div class=""><blockquote type="cite" class=""><div class="">On 14 Jul 2015, at 21:16, Paul B Mahol <<a href="mailto:onemda@gmail.com" class="">onemda@gmail.com</a>> wrote:</div><br class="Apple-interchange-newline"><div class=""><p class=""><br class="">
Dana 14. 7. 2015. 20:49 osoba "Ruurd Adema" <<a href="mailto:ruurdadema@me.com" class="">ruurdadema@me.com</a>> napisala je:<br class="">
><br class="">
> I'm trying to write live incoming audiopackets into a mov file with AAC encoding using the FFmpeg api.<br class="">
><br class="">
> 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.<br class="">
><br class="">
> 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?<br class="">
><br class="">
> audiopacket_sample_count = audiopacket->GetSampleFrameCount();<br class="">
> audiopacket_channel_count = decklink_config()->audio_channel_count;<br class="">
> audiopacket_size = audiopacket_sample_count * (decklink_config()->audio_sampletype/8) * audiopacket_channel_count;<br class="">
><br class="">
> audiopacket->GetBytes(&audiopacket_data);<br class="">
><br class="">
> av_init_packet(&pkt); <br class="">
><br class="">
> if (AUDIO_TYPE == AV_CODEC_ID_PCM_S16LE)<br class="">
> {<br class="">
> audiopacket->GetPacketTime(&audio_pts, audio_stream->time_base.den);<br class="">
><br class="">
> pkt.pts = audio_pts;<br class="">
> pkt.dts = pkt.pts; <br class="">
> pkt.flags |= AV_PKT_FLAG_KEY; <br class="">
> pkt.stream_index = audio_stream->index;<br class="">
> pkt.data = (uint8_t *)audiopacket_data;<br class="">
> pkt.size = audiopacket_size;<br class="">
><br class="">
> av_interleaved_write_frame(output_fmt_ctx, &pkt);<br class="">
> } <br class="">
> else if (AUDIO_TYPE == AV_CODEC_ID_AAC)<br class="">
> {<br class="">
> frame = av_frame_alloc();<br class="">
> frame->format = audio_stream->codec->sample_fmt;<br class="">
> frame->channel_layout = audio_stream->codec->channel_layout;<br class="">
> frame->sample_rate = audio_stream->codec->sample_rate;<br class="">
> frame->nb_samples = audiopacket_sample_count;<br class="">
><br class="">
> audiopacket->GetPacketTime(&audio_pts, audio_stream->time_base.den);<br class="">
><br class="">
> frame->pts = audio_pts;<br class="">
><br class="">
> if (avcodec_fill_audio_frame(frame, audiopacket_channel_count, audio_stream->codec->sample_fmt, (const uint8_t *)audiopacket_data, audiopacket_size, 0) < 0)<br class="">
> {<br class="">
> fprintf(stderr, "[ERROR] Filling audioframe failed!\n");<br class="">
> exit(-1);<br class="">
> }<br class="">
><br class="">
> if (avcodec_encode_audio2(audio_stream->codec, &pkt, frame, &got_packet) != 0)<br class="">
> {<br class="">
> fprintf(stderr, "[ERROR] Encoding audio failed\n");<br class="">
> }<br class="">
><br class="">
> if (got_packet) <br class="">
> {<br class="">
> pkt.stream_index = audio_stream->index;<br class="">
> pkt.flags |= AV_PKT_FLAG_KEY; <br class="">
><br class="">
> av_interleaved_write_frame(output_fmt_ctx, &pkt);<br class="">
> }<br class="">
> av_frame_free(&frame); <br class="">
> }<br class="">
> av_free_packet(&pkt);<br class="">
><br class="">
><br class="">
><br class="">
> _______________________________________________<br class="">
> Libav-user mailing list<br class="">
> <a href="mailto:Libav-user@ffmpeg.org" class="">Libav-user@ffmpeg.org</a><br class="">
> <a href="http://ffmpeg.org/mailman/listinfo/libav-user" class="">http://ffmpeg.org/mailman/listinfo/libav-user</a><br class="">
></p><p class="">Do you send exact same number of samples that aac encoder request? You need to buffer samples....<br class="">
</p>
_______________________________________________<br class="">Libav-user mailing list<br class=""><a href="mailto:Libav-user@ffmpeg.org" class="">Libav-user@ffmpeg.org</a><br class=""><a href="http://ffmpeg.org/mailman/listinfo/libav-user" class="">http://ffmpeg.org/mailman/listinfo/libav-user</a><br class=""></div></blockquote></div><br class=""></div></div></div>_______________________________________________<br class="">Libav-user mailing list<br class=""><a href="mailto:Libav-user@ffmpeg.org" class="">Libav-user@ffmpeg.org</a><br class="">http://ffmpeg.org/mailman/listinfo/libav-user<br class=""></div></blockquote></div><br class=""></div></body></html>