>From: Libav-user [mailto:[email protected]] On Behalf Of Gustav >González >Sent: Friday, March 01, 2019 12:30 AM >To: This list is about using libavcodec, libavformat, libavutil, libavdevice >and libavfilter. >Subject: [Libav-user] H.264 codec frames lost > >Security Notice: Please be aware that this email was sent by an external >sender. >Hi, >I implemented a basic tool to convertt an array of images into a video file, >following some of the ffmpeg/libav examples available in several forums. >The code works great using the MPEG4 codec, but when I try the H,264 something >strange occurs: I lost 30% of the frames (usually the last ones). >Checking on the code, I found out that this instructions is related to the >issue: > >int ret = avcodec_encode_video2(c, &pkt, videoFrame, &got_output); > >The variable got_output gets NULL value in many of the iterations while I am >creating the video file: > >if (got_output) { > if (c->coded_frame->key_frame) > pkt.flags |= AV_PKT_FLAG_KEY; > pkt.stream_index = video_st->index; > ret = av_interleaved_write_frame(oc, &pkt); > av_free_packet(&pkt); >} else { > ret = 0; > } >So I wonder what I could be missing related to the H,264 codec, understanding >that using exactly the same code, the codec MPEG4 works perfectly. >Any codec settings that I should care about? Any suggestion? > >Thanks! >-- > Gustav Gonzalez > [email protected]
H.264 encoding uses temporal compression techniques. So it queues frames in order to compute compression over multiple frames. That means got_ouput will be 0 at times before producing a compressed packet. Since you observed that the missing packets are at the end I suspect that you are not flushing the codec after feeding it all of the images. See the flush_encoder() function in the transcoding example (https://github.com/FFmpeg/FFmpeg/blob/master/doc/examples/transcoding.c). Regards, Don Bigler _______________________________________________ Libav-user mailing list [email protected] https://ffmpeg.org/mailman/listinfo/libav-user To unsubscribe, visit link above, or email [email protected] with subject "unsubscribe".
