[FFmpeg-user] How to seek frame-acurate into the very end of video-file
Peter Rennert
mailinglists at rennert.io
Tue Sep 8 19:36:32 CEST 2015
I am working on a player that needs to be able to seek frame-acurrate. My approach is to seek use av_seek_frame and then decode more packets until I reach the pts I am looking for. This works more or less for frames that are not flushed from cache.
Optimally I would like to be able to seek also into the last frames/packets that are flushed from the cache (like in line 290 in the demuxing example (https://ffmpeg.org/doxygen/trunk/demuxing_8c_source.html#l00290 <https://ffmpeg.org/doxygen/trunk/demuxing_8c_source.html#l00290>)). The problem here is that the pts of these last decoded packets seems to be -9223372036854775808. So they themselves do not give me a timestamp I can work on after seeking.
Is there any way of fixing that?
Cheers,
Peter
PS Output of a slightly modified demuxing_decoding.c example, where I inserted prints to check the dts and pts of the video file:
/* read frames from the file */
while (av_read_frame(fmt_ctx, &pkt) >= 0) {
AVPacket orig_pkt = pkt;
do {
ret = decode_packet(&got_frame, 0);
if (ret < 0)
break;
pkt.data += ret;
pkt.size -= ret;
printf("packet dts: '%d' \n", pkt.dts);
printf("packet pts: '%d' \n", pkt.pts);
} while (pkt.size > 0);
av_free_packet(&orig_pkt);
}
/* flush cached frames */
pkt.data = NULL;
pkt.size = 0;
do {
decode_packet(&got_frame, 1);
printf("frame number: '%d' \n", frame->coded_picture_number);
printf("packet dts: '%d' \n", pkt.dts);
printf("packet pts: '%d' \n", pkt.pts);
} while (got_frame);
printf("Demuxing succeeded.\n”);
You can see that as soon as the frames are flushed at the end (frame 996 and onwards), dts and pts go to 0.
packet dts: '0'
packet pts: '0'
packet dts: '512'
packet pts: '512'
packet dts: '1024'
packet pts: '1024'
packet dts: '1536'
packet pts: '1536'
video_frame n:0 coded_n:0 pts:NOPTS
packet dts: '2048'
packet pts: '2048'
video_frame n:1 coded_n:1 pts:NOPTS
packet dts: '2560'
packet pts: '2560'
video_frame n:2 coded_n:2 pts:NOPTS
packet dts: '3072'
packet pts: '3072'
video_frame n:3 coded_n:3 pts:NOPTS
packet dts: '3584'
packet pts: '3584'
video_frame n:4 coded_n:4 pts:NOPTS
..
video_frame n:990 coded_n:990 pts:NOPTS
packet dts: '508928'
packet pts: '508928'
video_frame n:991 coded_n:991 pts:NOPTS
packet dts: '509440'
packet pts: '509440'
video_frame n:992 coded_n:992 pts:NOPTS
packet dts: '509952'
packet pts: '509952'
video_frame n:993 coded_n:993 pts:NOPTS
packet dts: '510464'
packet pts: '510464'
video_frame n:994 coded_n:994 pts:NOPTS
packet dts: '510976'
packet pts: '510976'
video_frame n:995 coded_n:995 pts:NOPTS
packet dts: '511488'
packet pts: '511488'
video_frame(cached) n:996 coded_n:996 pts:NOPTS
frame number: '996'
packet dts: '0'
packet pts: '0'
video_frame(cached) n:997 coded_n:997 pts:NOPTS
frame number: '997'
packet dts: '0'
packet pts: '0'
video_frame(cached) n:998 coded_n:998 pts:NOPTS
frame number: '998'
packet dts: '0'
packet pts: '0'
video_frame(cached) n:999 coded_n:999 pts:NOPTS
frame number: '999'
packet dts: '0'
packet pts: '0'
frame number: '0'
packet dts: '0'
packet pts: '0'
Demuxing succeeded.
More information about the ffmpeg-user
mailing list