<div dir="ltr">Update - <div>I added some code after my main while loop to flush remaining frames from codec. </div><div>Also i have added one more variable while configuring my encoder ie gop_size. these two changes have improved the situation.</div><div>the lost amount of video has come down to approx 0.9 secs. </div><div><br></div><div><i>Question- what codec settings i have missed which are required to make sure that input and output files are identical. </i></div><div>my current encoder setting code looks like - </div><div><br></div><div><div> <font face="georgia, serif">c->codec_id = inputStream->codec->codec_id;</font></div><div><font face="georgia, serif"> c->bit_rate = inputStream->codec->bit_rate;</font></div><div><font face="georgia, serif"><br></font></div><div><font face="georgia, serif"> /* Resolution must be a multiple of two. */</font></div><div><font face="georgia, serif"> c->width = inputStream->codec->width;</font></div><div><font face="georgia, serif"> c->height = inputStream->codec->height;</font></div><div><font face="georgia, serif"> c->gop_size = inputStream->codec->gop_size;</font></div><div><font face="georgia, serif"> </font></div><div><font face="georgia, serif"> c->time_base = inputStream->codec->time_base;</font></div><div><font face="georgia, serif"> out_stream->time_base = inputStream->time_base;</font></div><div><font face="georgia, serif"> av_stream_set_r_frame_rate(out_stream,av_stream_get_r_frame_rate(inputStream));</font></div><div><font face="georgia, serif"> </font></div><div><font face="georgia, serif"> c->pix_fmt = AV_PIX_FMT_YUV420P;</font></div><div><font face="georgia, serif"> c->sample_aspect_ratio.num = inputStream->codec->sample_aspect_ratio.num;</font></div><div><font face="georgia, serif"> c->sample_aspect_ratio.den = inputStream->codec->sample_aspect_ratio.den;</font></div></div><div><div><font face="georgia, serif"> if (oc->oformat->flags & AVFMT_GLOBALHEADER)</font></div><div><font face="georgia, serif"> c->flags |= CODEC_FLAG_GLOBAL_HEADER;</font></div></div><div><br></div><div><br></div><div>following are line from ffmpeg -i </div><div><b>for input file -</b> </div><div>
<p class=""><span class=""><font face="georgia, serif"> Duration: 00:00:30.92, start: 0.040000, bitrate: 998 kb/s</font></span></p><p class=""><span class=""><font face="georgia, serif"> Stream #0:0(eng): Video: h264 (Main) (avc1 / 0x31637661), yuv420p(tv), 1280x720 [SAR 1:1 DAR 16:9], 996 kb/s, 25 fps, 25 tbr, 25k tbn, 50 tbc (default)</font></span></p><p class=""><span class=""><font face="georgia, serif"> Metadata:</font></span></p><p class="">
</p><p class=""><span class=""><font face="georgia, serif"> handler_name : VideoHandler</font></span></p><p class=""><span class=""><br></span></p><p class=""><b>for output file - </b></p><p class=""><font face="georgia, serif">Duration: 00:00:30.02, start: 0.000000, bitrate: 1022 kb/s</font></p>
<p class=""><span class=""><font face="georgia, serif"> Stream #0:0(und): Video: h264 (High) (avc1 / 0x31637661), yuv420p, 1280x720 [SAR 1:1 DAR 16:9], 1019 kb/s, 25.02 fps, 25 tbr, 25k tbn, 100 tbc (default)</font></span></p>
<p class=""><span class=""><font face="georgia, serif"> Metadata:</font></span></p>
<p class=""><span class=""><font face="georgia, serif"> handler_name : VideoHandler</font></span></p></div><div><br></div></div><div class="gmail_extra"><br><div class="gmail_quote">On Mon, Oct 12, 2015 at 3:13 PM, gaurav mishra <span dir="ltr"><<a href="mailto:gauravmishra.itbhu@gmail.com" target="_blank">gauravmishra.itbhu@gmail.com</a>></span> wrote:<br><blockquote class="gmail_quote" style="margin:0 0 0 .8ex;border-left:1px #ccc solid;padding-left:1ex"><div dir="ltr">Hi,<div>I have written some code which opens up a mp4 file , decodes each frame , does some manipulation on it and encode it back to new container. Issue i am seeing here is i am loosing last 3 sec (approx 65 frames) of video . </div><div>Below is a simplified version of code which i expected to create a identical file.which does no manipulation on frame just decode a frame then encode it back and finally mux it. </div><div><br></div><div><div><font face="georgia, serif">while(1) {</font></div><div><font face="georgia, serif"> </font></div><div><font face="georgia, serif"> ret = av_read_frame(ifmt_ctx, &packet);</font></div><div><font face="georgia, serif"> if(ret < 0) {</font></div><div><font face="georgia, serif"> av_log( NULL , AV_LOG_ERROR , "error reading frame or end of file");</font></div><div><font face="georgia, serif"> break;</font></div><div><font face="georgia, serif"> }</font></div><div><font face="georgia, serif"> AVStream *in_stream = ifmt_ctx->streams[packet.stream_index];</font></div><div><font face="georgia, serif"> AVStream *output_stream = out_stream.format_ctx->streams[packet.stream_index];</font></div><div><font face="georgia, serif"> </font></div><div><font face="georgia, serif"> </font></div><div><font face="georgia, serif"> stream_index = packet.stream_index;</font></div><div><font face="georgia, serif"> frame_decoded = 0;</font></div><div><font face="georgia, serif"> frame = av_frame_alloc();</font></div><div><font face="georgia, serif"> </font></div><div><font face="georgia, serif"><br></font></div><div><font face="georgia, serif"> ret = avcodec_decode_video2(in_stream->codec, frame, &frame_decoded, &packet);</font></div><div><font face="georgia, serif"> </font></div><div><font face="georgia, serif"> if(ret<0){</font></div><div><font face="georgia, serif"> av_frame_free(&frame);</font></div><div><font face="georgia, serif"> fprintf(stderr,"could not decode a packet....");</font></div><div><font face="georgia, serif"> return ret;</font></div><div><font face="georgia, serif"> }</font></div><div><font face="georgia, serif"> </font></div><div><font face="georgia, serif"> if(frame_decoded){</font></div><div><font face="georgia, serif"> </font></div><div><font face="georgia, serif"> ptsFactor = 2;</font></div><div><font face="georgia, serif"> frame->pts = ptsFactor*frameEncodedCount ;</font></div><div><font face="georgia, serif"> frameEncodedCount++;</font></div><div><font face="georgia, serif"> </font></div><div><font face="georgia, serif"> av_init_packet(&encoded_packet);</font></div><div><font face="georgia, serif"> </font></div><div><font face="georgia, serif"> encode_success = 0;</font></div><div><font face="georgia, serif"> </font></div><div><font face="georgia, serif"> ret = avcodec_encode_video2(this->out_stream.format_ctx->streams[0]->codec,</font></div><div><font face="georgia, serif"> &encoded_packet,</font></div><div><font face="georgia, serif"> frame,</font></div><div><font face="georgia, serif"> &encode_success);</font></div><div><font face="georgia, serif"> </font></div><div><font face="georgia, serif"> encoded_packet.stream_index = 0;</font></div><div><font face="georgia, serif"> </font></div><div><font face="georgia, serif"> if(encode_success){</font></div><div><font face="georgia, serif"> </font></div><div><font face="georgia, serif"> av_packet_rescale_ts(&encoded_packet,</font></div><div><font face="georgia, serif"> this->out_stream.format_ctx->streams[0]->codec->time_base,</font></div><div><font face="georgia, serif"> this->out_stream.format_ctx->streams[0]->time_base);</font></div><div><font face="georgia, serif"> </font></div><div><font face="georgia, serif"> </font></div><div><font face="georgia, serif"> ret = av_interleaved_write_frame(this->out_stream.format_ctx, &encoded_packet);</font></div><div><font face="georgia, serif"> }</font></div><div><font face="georgia, serif"> }</font></div><div><font face="georgia, serif"> </font></div><div><font face="georgia, serif"><br></font></div><div><font face="georgia, serif">}</font></div></div><div><br></div><div>I also noticed that the first above code failed to encode first 60 frames of video. ie</div><div>it successfully decoded frames but didnt enter the if(encode_success) block. Any idea what might be going wrong here. </div><div><br></div></div>
</blockquote></div><br></div>