<div style="line-height:1.7;color:#000000;font-size:14px;font-family:Arial">At 2016-12-27 14:06:14, "yoann" <yoann@woozoom.net> wrote:<br> <blockquote id="isReplyContent" style="PADDING-LEFT: 1ex; MARGIN: 0px 0px 0px 0.8ex; BORDER-LEFT: #ccc 1px solid">Hi everyone,<br>I am trying to remux a mp4 RTSP stream (provided by an ffserver) into a mp4 file, but I am struggling to get the file set correctly. I do not want to re-encode the stream for performances reasons.<br><br>Using the remuxing.c example, I met different issues :<br>- if I use the example directly, the PTS and DTS of the firsts frames are mixed up and av_write_interleaved_frames gives me a "Application provided invalid, non monotonically increasing dts to muxer in stream 0: 4752 >= 4752" error.<br>- if I skip a random amount of frames (I would also like to be able to start remuxing from anywhere in the stream and not only from the start), it produces a file which is eventually readable but analyzing it with ffprobe -show_frames, it throws me a "Missing key frame while reordering index according to edit list", which is understandable, I need my first frame to be an keyframe I think.<br>- If I try to use AV_PKT_FLAG_KEY to ensure my first frame is a keyframe, it does not changes anything, and printing the pkt.flags field give me that almost one frame on 2 i a keyframe, which is false, it is around 1 on 10 for my RTSP stream. Am I not using this flag correctly ?</blockquote><blockquote id="isReplyContent" style="PADDING-LEFT: 1ex; MARGIN: 0px 0px 0px 0.8ex; BORDER-LEFT: #ccc 1px solid"><br></blockquote><blockquote id="isReplyContent" style="PADDING-LEFT: 1ex; MARGIN: 0px 0px 0px 0.8ex; BORDER-LEFT: #ccc 1px solid"><br></blockquote><div><br></div><div>I should have precised that it is a h264 stream. And <span style="line-height: 23.8px;">from what I understood from this thread : </span><a href="https://ffmpeg.org/pipermail/libav-user/2013-December/005997.html," _src="https://ffmpeg.org/pipermail/libav-user/2013-December/005997.html," style="line-height: 23.8px;">https://ffmpeg.org/pipermail/libav-user/2013-December/005997.html,</a><span style="line-height: 23.8px;"> AV_PKT_FLAG_KEY is directly read from the h264 stream and not set by libavformat and is not the relevant information, the index entry is.</span></div><div><span style="line-height: 23.8px;"><br></span></div><div><span style="line-height: 23.8px;">So if I want to start the remuxing into a file from any random point, what would be the easiest way to ensure I am starting with a keyframe ? </span></div><div><span style="line-height: 23.8px;"><br></span></div><div><span style="line-height: 23.8px;">I can try to decode the first few frames and than check AVframe->key_frame but the performances will be poor. Is using av_seek_frame here useful is some manner ?</span></div><br style="line-height: 23.8px;"><br style="line-height: 23.8px;"><blockquote style="PADDING-LEFT: 1ex; MARGIN: 0px 0px 0px 0.8ex; BORDER-LEFT: #ccc 1px solid"><br>Here is my modified code for remuxing.c :<br><br>    // same that remuxing.c before, here is around line 130<br>    i = 0;<br>    int have_first_keyframe = 0;<br>    while (1) {<br>        AVStream *in_stream, *out_stream;<br>       <br>        ret = av_read_frame(ifmt_ctx, &pkt);<br>        if (ret < 0)<br>            break;<br>           <br>        i++;       <br>        if(i <= 54){ // random number to start further in the stream<br>            av_packet_unref(&pkt);<br>            continue;<br>        }<br>        fprintf(stderr, "pkt.flags : %d \n", pkt.flags);<br>        if(!have_first_keyframe){<br>            if((pkt.flags & AV_PKT_FLAG_KEY) == 0){<br>                // not a keyframe<br>                av_packet_unref(&pkt);<br>                continue;<br>            } else {<br>                have_first_keyframe = 1;<br>            }<br>        }<br>    // same that remuxing.c after except I use i = 700 to break the loop and stop remuxing<br><br>Here is what the output looks like :<br>pkt.flags : 0<br>No keyframe<br>pkt.flags : 1<br>First keyframe<br>pkt.flags : 1<br>pkt.flags : 0<br>pkt.flags : 1<br>pkt.flags : 1<br>pkt.flags : 0<br>pkt.flags : 1<br>pkt.flags : 0<br>pkt.flags : 1<br>pkt.flags : 1<br>pkt.flags : 1<br>pkt.flags : 0<br>pkt.flags : 1<br>pkt.flags : 1<br>pkt.flags : 0<br>pkt.flags : 1<br>pkt.flags : 1<br>pkt.flags : 0<br>pkt.flags : 1 <br><br>Someone has any advice to record an RTSP stream ?<br>Yoann<br></blockquote></div>