This works for me, using the following code to flush the buffer. It seems that I was looking for the wrong term - there should have been "delayed frames" ...
void VideoFileWriter::Flush(void) { if ( data != nullptr ) { int out_size = 0; int ret = 0; libffmpeg::AVCodecContext* c = data->VideoStream->codec; /* get the delayed frames */ while (1) { libffmpeg::AVPacket packet; libffmpeg::av_init_packet(&packet); out_size = libffmpeg::avcodec_encode_video(c, data->VideoOutputBuffer, data->VideoOutputBufferSize, NULL); if (out_size < 0) { //fprintf(stderr, "Error encoding delayed frame %d\n", out_size); break; } if (out_size == 0) { break; } if (c->coded_frame->pts != AV_NOPTS_VALUE) { packet.pts = av_rescale_q(c->coded_frame->pts, c->time_base, data->VideoStream->time_base); //fprintf(stderr, "Video Frame PTS: %d\n", (int)packet.pts); } else { //fprintf(stderr, "Video Frame PTS: not set\n"); } if (c->coded_frame->key_frame) { packet.flags |= AV_PKT_FLAG_KEY; } packet.stream_index = data->VideoStream->index; packet.data = data->VideoOutputBuffer; packet.size = out_size; ret = libffmpeg::av_interleaved_write_frame( data->FormatContext, &packet ); if (ret != 0) { //fprintf(stderr, "Error writing delayed frame %d\n", ret); break; } } libffmpeg::avcodec_flush_buffers(data->VideoStream->codec); } }
source share