<html><head><meta http-equiv="Content-Type" content="text/html; charset=utf-8"></head><body style="word-wrap: break-word; -webkit-nbsp-mode: space; line-break: after-white-space;" class="">Alex,<div class=""><br class=""></div><div class="">Today I have got somewhere I haven’t been before but still having a problem. </div><div class=""><br class=""></div><div class="">If producing half of the frames, it seems to work. Of course is not perfect but 15 frames instead of 30 fps has to have some noticeable harsh effect. However, when producing all the frames it is supposed to produce, the program stops with the message:</div><div class=""><br class=""></div><div class=""><div style="color: rgb(54, 54, 54); background-color: rgb(255, 255, 255); font-family: Menlo, Monaco, "Courier New", monospace; line-height: 18px; white-space: pre;" class=""><div class="">get_video_frame - <span style="color: rgb(63, 151, 223);" class="">timestamp</span> <span style="color: rgb(73, 104, 57);" class="">236</span> pts <span style="color: rgb(73, 104, 57);" class="">7</span></div><div class="">get_video_frame - <span style="color: rgb(63, 151, 223);" class="">timestamp</span> <span style="color: rgb(73, 104, 57);" class="">301</span> pts <span style="color: rgb(73, 104, 57);" class="">9</span></div><div class="">get_video_frame - <span style="color: rgb(63, 151, 223);" class="">timestamp</span> <span style="color: rgb(73, 104, 57);" class="">308</span> pts <span style="color: rgb(73, 104, 57);" class="">9</span></div><div class="">get_video_frame - <span style="color: rgb(63, 151, 223);" class="">timestamp</span> <span style="color: rgb(73, 104, 57);" class="">342</span> pts <span style="color: rgb(73, 104, 57);" class="">10</span></div><div class=""><span style="color: rgb(63, 151, 223);" class="">int</span> write_frame - pts <span style="color: rgb(73, 104, 57);" class="">3584</span> dts <span style="color: rgb(73, 104, 57);" class="">2560</span></div><div class="">get_video_frame - <span style="color: rgb(63, 151, 223);" class="">timestamp</span> <span style="color: rgb(73, 104, 57);" class="">376</span> pts <span style="color: rgb(73, 104, 57);" class="">11</span></div><div class="">get_video_frame - <span style="color: rgb(63, 151, 223);" class="">timestamp</span> <span style="color: rgb(73, 104, 57);" class="">408</span> pts <span style="color: rgb(73, 104, 57);" class="">12</span></div><div class=""><span style="color: rgb(63, 151, 223);" class="">int</span> write_frame - pts <span style="color: rgb(73, 104, 57);" class="">4608</span> dts <span style="color: rgb(73, 104, 57);" class="">3584</span></div><div class="">get_video_frame - <span style="color: rgb(63, 151, 223);" class="">timestamp</span> <span style="color: rgb(73, 104, 57);" class="">452</span> pts <span style="color: rgb(73, 104, 57);" class="">13</span></div><div class=""><span style="color: rgb(63, 151, 223);" class="">int</span> write_frame - pts <span style="color: rgb(73, 104, 57);" class="">4608</span> dts <span style="color: rgb(73, 104, 57);" class="">3584</span></div><br class=""><div class="">[mp4 @ 0x7fb86a98cc00] <span style="color: rgb(63, 151, 223);" class="">Application</span> provided invalid, non monotonically increasing dts <span style="color: rgb(63, 151, 223);" class="">to</span> muxer <span style="color: rgb(63, 151, 223);" class="">in</span> stream <span style="color: rgb(73, 104, 57);" class="">0</span>: <span style="color: rgb(73, 104, 57);" class="">3584</span> >= <span style="color: rgb(73, 104, 57);" class="">3584</span></div><div class=""><br class=""></div></div></div><div class=""><br class=""></div><div class="">This is the relevant code:</div><div class=""><br class=""></div><div class=""><div style="color: rgb(54, 54, 54); background-color: rgb(255, 255, 255); font-family: Menlo, Monaco, "Courier New", monospace; line-height: 18px; white-space: pre;" class=""><div class="">AVFrame* get_video_frame(<span style="color: rgb(99, 99, 36);" class="">int</span> timestamp, OutputStream *ost, const QImage &image)</div><div class="">{</div><div class="">    ...</div><div class="">    ost->frame->pts = (timestamp*_fps)/1000;</div><div class="">    // print timestamp and frame pts to console</div><div class="">    <span style="color: rgb(157, 78, 150);" class="">return</span> ost->frame;</div><div class="">}</div></div></div><div class=""><br class=""></div><div class=""><div style="color: rgb(54, 54, 54); background-color: rgb(255, 255, 255); font-family: Menlo, Monaco, "Courier New", monospace; line-height: 18px; white-space: pre;" class=""><div class=""><span style="color: rgb(63, 151, 223);" class="">int</span> <span style="color: rgb(99, 99, 36);" class="">write_frame</span>(AVFormatContext *<span style="color: rgb(9, 89, 132);" class="">fmt_ctx</span>, AVCodecContext *<span style="color: rgb(9, 89, 132);" class="">c</span>, AVStream *<span style="color: rgb(9, 89, 132);" class="">st</span>, AVFrame *<span style="color: rgb(9, 89, 132);" class="">frame</span>)</div><div class="">{</div><div class="">    <span style="color: rgb(63, 151, 223);" class="">int</span> ret = <span style="color: rgb(99, 99, 36);" class="">avcodec_send_frame</span>(c, frame);</div><br class=""><div class="">    <span style="color: rgb(157, 78, 150);" class="">if</span> (ret<<span style="color: rgb(73, 104, 57);" class="">0</span>) <span style="color: rgb(99, 99, 36);" class="">exit</span>(<span style="color: rgb(73, 104, 57);" class="">1</span>);</div><br class=""><div class="">    <span style="color: rgb(157, 78, 150);" class="">while</span> (ret >= <span style="color: rgb(73, 104, 57);" class="">0</span>)</div><div class="">    {</div><div class="">        AVPacket pkt = { <span style="color: rgb(73, 104, 57);" class="">0</span> };</div><div class=""><br class=""></div><div class=""><pre style="margin-top: 0px; margin-bottom: 0px;" class=""><span style="font-family: Menlo, Monaco, "Courier New", monospace;" class="">        ret = </span><span style="font-family: Menlo, Monaco, "Courier New", monospace; color: rgb(99, 99, 36);" class="">avcodec_receive_packet</span><span style="font-family: Menlo, Monaco, "Courier New", monospace;" class="">(c, &pkt);</span></pre></div><br class=""><div class="">        <span style="color: rgb(157, 78, 150);" class="">if</span> (ret == <span style="color: rgb(99, 99, 36);" class="">AVERROR</span>(EAGAIN) || ret == AVERROR_EOF)</div><div class="">        {</div><div class="">            <span style="color: rgb(157, 78, 150);" class="">break</span>;</div><div class="">        }</div><div class="">        <span style="color: rgb(157, 78, 150);" class="">else</span> <span style="color: rgb(157, 78, 150);" class="">if</span> (ret<<span style="color: rgb(73, 104, 57);" class="">0</span>)</div><div class="">        {</div><div class="">            <span style="color: rgb(99, 99, 36);" class="">fprintf</span>(stderr, <span style="color: rgb(162, 86, 55);" class="">"Error encoding a frame: </span><span style="color: rgb(9, 89, 132);" class="">%s</span><span style="color: rgb(152, 116, 40);" class="">\n</span><span style="color: rgb(162, 86, 55);" class="">"</span>, <span style="color: rgb(99, 99, 36);" class="">av_err2str</span>(ret));</div><div class="">            <span style="color: rgb(99, 99, 36);" class="">exit</span>(<span style="color: rgb(73, 104, 57);" class="">1</span>);</div><div class="">        }</div><br class=""><div class="">        <span style="color: rgb(9, 89, 132);" class="">pkt</span>.<span style="color: rgb(9, 89, 132);" class="">stream_index</span> = <span style="color: rgb(9, 89, 132);" class="">st</span>-><span style="color: rgb(9, 89, 132);" class="">index</span>;</div><br class=""><div class="">        <span style="color: rgb(157, 78, 150);" class="">if</span> (<span style="color: rgb(9, 89, 132);" class="">pkt</span>.<span style="color: rgb(9, 89, 132);" class="">pts</span> != AV_NOPTS_VALUE)</div><div class="">            <span style="color: rgb(9, 89, 132);" class="">pkt</span>.<span style="color: rgb(9, 89, 132);" class="">pts</span> = <span style="color: rgb(99, 99, 36);" class="">av_rescale_q</span>(<span style="color: rgb(9, 89, 132);" class="">pkt</span>.<span style="color: rgb(9, 89, 132);" class="">pts</span>, <span style="color: rgb(9, 89, 132);" class="">c</span>-><span style="color: rgb(9, 89, 132);" class="">time_base</span>, <span style="color: rgb(9, 89, 132);" class="">st</span>-><span style="color: rgb(9, 89, 132);" class="">time_base</span>);</div><br class=""><div class="">        <span style="color: rgb(157, 78, 150);" class="">if</span> (<span style="color: rgb(9, 89, 132);" class="">pkt</span>.<span style="color: rgb(9, 89, 132);" class="">dts</span> != AV_NOPTS_VALUE)</div><div class="">            <span style="color: rgb(9, 89, 132);" class="">pkt</span>.<span style="color: rgb(9, 89, 132);" class="">dts</span> = <span style="color: rgb(99, 99, 36);" class="">av_rescale_q</span>(<span style="color: rgb(9, 89, 132);" class="">pkt</span>.<span style="color: rgb(9, 89, 132);" class="">dts</span>, <span style="color: rgb(9, 89, 132);" class="">c</span>-><span style="color: rgb(9, 89, 132);" class="">time_base</span>, <span style="color: rgb(9, 89, 132);" class="">st</span>-><span style="color: rgb(9, 89, 132);" class="">time_base</span>);</div><div style="color: rgb(54, 54, 54); background-color: rgb(255, 255, 255); font-family: Menlo, Monaco, "Courier New", monospace; line-height: 18px; white-space: pre;" class=""><br class=""></div><span class="Apple-tab-span" style="white-space:pre">        </span>// print packet pts and packet dts to console<br class=""><div class="">        ret = <span style="color: rgb(99, 99, 36);" class="">av_interleaved_write_frame</span>(fmt_ctx, &pkt);</div><div class="">        <span style="color: rgb(99, 99, 36);" class="">av_packet_unref</span>(&pkt);</div><br class=""><div class="">        <span style="color: rgb(157, 78, 150);" class="">if</span> (ret < <span style="color: rgb(73, 104, 57);" class="">0</span>) <span style="color: rgb(99, 99, 36);" class="">exit</span>(<span style="color: rgb(73, 104, 57);" class="">1</span>);</div><div class="">    }</div><br class=""><div class="">    <span style="color: rgb(157, 78, 150);" class="">return</span> ret == AVERROR_EOF ? <span style="color: rgb(73, 104, 57);" class="">1</span> : <span style="color: rgb(73, 104, 57);" class="">0</span>;</div><div class="">}</div></div></div><div class=""><br class=""></div><div class="">What I missing?</div><div class=""><br class=""></div><div class="">Thank you very much!</div><div class=""><br class=""></div><div class="">Regards,</div><div class=""><br class=""></div><div class="">Nuno</div><div class=""><div><br class=""><blockquote type="cite" class=""><div class="">On 9 Sep 2021, at 11:34, Nuno Santos <<a href="mailto:nuno.santos@imaginando.pt" class="">nuno.santos@imaginando.pt</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; line-break: after-white-space;" class="">Hi,<div class=""><br class=""></div><div class="">I’m still finding the solution to this problem.</div><div class=""><br class=""></div><div class="">I have tried to summarise the problem the best way I could in a stack overflow question, with code snippets:</div><div class=""><br class=""></div><div class=""><a href="https://stackoverflow.com/questions/69109263/how-to-compensate-frame-rate-underrun-while-muxing-video-to-mp4-container-with-l" class="">https://stackoverflow.com/questions/69109263/how-to-compensate-frame-rate-underrun-while-muxing-video-to-mp4-container-with-l</a></div><div class=""><br class=""></div><div class="">Lib-av is definitively a complex topic with a lot of background knowledge and history that we can’t simply catch up in a snap. </div><div class=""><br class=""></div><div class="">Thanks for your help and comprehension</div><div class=""><br class=""></div><div class="">Best regards,</div><div class=""><br class=""></div><div class="">Nuno<br class=""><div class=""><br class=""><blockquote type="cite" class=""><div class="">On 5 Sep 2021, at 19:55, Nuno Santos <<a href="mailto:nuno.santos@imaginando.pt" class="">nuno.santos@imaginando.pt</a>> wrote:</div><br class="Apple-interchange-newline"><div class=""><div class="">Alex,<br class=""><br class="">Thanks for your reply. <br class=""><br class="">I’m still puzzled how to do this.<br class=""><br class="">I’ve just tried to do this in the get_video_frame of muxing.c example<br class=""><br class="">ost->frame->pkt_dts = av_rescale_q(timestamp, AVRational{1, 1000}, ost->st->time_base);<br class="">ost->frame->pts = ost->frame->pkt_dts;<br class=""><br class="">But the program crashes even more quickly:<br class=""><br class="">[mp4 @ 0x7fc9a6242600] pts (817920) < dts (841472) in stream 0<br class=""><br class=""><br class="">There is another place in the muxing.c example that uses a rescale function, av_packet_rescale_ts actually, on the write_frame function. But this function is used for both video and audio frames writing. Since the problem with frame producing is only for video, I would say that the rescale must be on the video side only, so it kind makes sense doing this adjustment on the get_video_frame function.<br class=""><br class="">Any tips? <br class=""><br class="">Thanks!<br class=""><br class="">Regards,<br class=""><br class="">Nuno<br class=""><br class=""><blockquote type="cite" class="">On 2 Sep 2021, at 22:06, Alexandr Kasyan <<a href="mailto:a.kasyan@ntechlab.com" class="">a.kasyan@ntechlab.com</a>> wrote:<br class=""><br class="">Nuno, <br class=""><br class="">I was too wordy. Assign dts, make dts = pts, they come together in the case.<br class="">Is it getting better or do you still need a better way to calculate pts?<br class=""><br class="">Regards, Alex<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="https://ffmpeg.org/mailman/listinfo/libav-user" class="">https://ffmpeg.org/mailman/listinfo/libav-user</a><br class=""><br class="">To unsubscribe, visit link above, or email<br class="">libav-user-request@ffmpeg.org with subject "unsubscribe".<br class=""></blockquote><br class=""></div></div></blockquote></div><br class=""></div></div></div></blockquote></div><br class=""></div></body></html>