[FFmpeg-user] Problems getting the very last frames of videos using av_read_frame

Peter Rennert p.rennert at cs.ucl.ac.uk
Thu Oct 30 13:15:34 CET 2014


Hi,

I am having a problem with reading video files with the ffmpeg api. I am 
building on a python wrapper, that someone else wrote. I noticed a bug, 
but the creator could not solve the issue. So I am trying to hunt it 
down by myself.

The problem is that the wrapper truncates any video I tried it with.

The basic idea of the wrapper is, to use

av_read_frame()

to read frames until it returns a value < 0. That seems to work, and I 
get the right frames back all the time (even using seek of the wrapper), 
except for the last frames. It seems as av_read_frame only reads until 
the last key frame and does not go beyond it.

FFMPEG command line tools, on the other hand, can extract the full video 
sequence and do not omit anything.


I am not sure whether the information I give here is enough to start 
hunting down the bug. I am not experienced at all with the ffmpeg api 
and I am working with the code I have got from the other guy. Let me 
know if you need something else to start tracing the problem.

Thanks,

Peter


Stuff to test the problem:

Wrapper code with line calling av_read_frame:
===========================

https://bitbucket.org/groakat/ffvideo/src/b45143f755ac8da1e6ed4f52a11217af1e093d54/ffvideo/ffvideo.pyx?at=default#cl-231

( you can install the wraper with pip install 
https://bitbucket.org/groakat/ffvideo/get/b45143f755ac.zip)


Rendered test Video (1000 frames numbered from 1..1000):
====================================

https://www.dropbox.com/s/guu33jyy4t7sq53/test.avi?dl=0


Script to generate the video:
=================

First generate frames:

#!/bin/bash
for i in $(seq -f "%05g" 1 1000)
do
         convert -size 51x18 -pointsize 16 -font 
/usr/share/fonts/truetype/freefont/FreeMono.ttf label:$i $i.png
done

Then use to create a video from the image sequence:

ffmpeg -y -f image2 -r 30 -i "%05d.png" -r 30 test.avi


Then test whether ffmpeg can read all frames:

ffmpeg -i "test.avi" -an -f image2 "output_%05d.png"


Python script using the wrapper from above to extract the frames:
========================================

from ffvideo import VideoStream
from scipy.misc import imsave
vs = VideoStream('test.avi', exact_seek=True)

cnt = 0
for frame in vs:
     f = frame.ndarray()
     imsave("frame {0:05d}.png".format(cnt), f)
     cnt += 1


My ffmpeg version
===========

$ ffmpeg
ffmpeg version 2.2.git Copyright (c) 2000-2014 the FFmpeg developers
   built on Apr  9 2014 16:32:16 with gcc 4.8 (Ubuntu/Linaro 
4.8.1-10ubuntu9)
   configuration: --prefix=/home/peter/ffmpeg_build 
--extra-cflags=-I/home/peter/ffmpeg_build/include 
--extra-ldflags=-L/home/peter/ffmpeg_build/lib --bindir=/home/peter/bin 
--extra-libs=-ldl --enable-gpl --enable-libass --enable-libfdk-aac 
--enable-libfreetype --enable-libmp3lame --enable-libopus 
--enable-libtheora --enable-libvorbis --enable-libvpx --enable-libx264 
--enable-nonfree --enable-x11grab --enable-shared
   WARNING: library configuration mismatch
   avutil      configuration: --enable-gpl --enable-libmp3lame 
--enable-libtheora --enable-libvorbis --enable-libvpx --enable-libx264 
--enable-nonfree --enable-shared
   avcodec     configuration: --enable-gpl --enable-libmp3lame 
--enable-libtheora --enable-libvorbis --enable-libvpx --enable-libx264 
--enable-nonfree --enable-shared
   avformat    configuration: --enable-gpl --enable-libmp3lame 
--enable-libtheora --enable-libvorbis --enable-libvpx --enable-libx264 
--enable-nonfree --enable-shared
   avdevice    configuration: --enable-gpl --enable-libmp3lame 
--enable-libtheora --enable-libvorbis --enable-libvpx --enable-libx264 
--enable-nonfree --enable-shared
   avfilter    configuration: --enable-gpl --enable-libmp3lame 
--enable-libtheora --enable-libvorbis --enable-libvpx --enable-libx264 
--enable-nonfree --enable-shared
   swscale     configuration: --enable-gpl --enable-libmp3lame 
--enable-libtheora --enable-libvorbis --enable-libvpx --enable-libx264 
--enable-nonfree --enable-shared
   swresample  configuration: --enable-gpl --enable-libmp3lame 
--enable-libtheora --enable-libvorbis --enable-libvpx --enable-libx264 
--enable-nonfree --enable-shared
   postproc    configuration: --enable-gpl --enable-libmp3lame 
--enable-libtheora --enable-libvorbis --enable-libvpx --enable-libx264 
--enable-nonfree --enable-shared
   libavutil      52. 74.100 / 52. 75.100
   libavcodec     55. 58.102 / 55. 58.103
   libavformat    55. 36.102 / 55. 36.102
   libavdevice    55. 11.100 / 55. 11.100
   libavfilter     4.  3.100 /  4.  3.100
   libswscale      2.  6.100 /  2.  6.100
   libswresample   0. 18.100 /  0. 18.100
   libpostproc    52.  3.100 / 52.  3.100
Hyper fast Audio and Video encoder
usage: ffmpeg [options] [[infile options] -i infile]... {[outfile 
options] outfile}...

Use -h to get full help or, even better, run 'man ffmpeg'



More information about the ffmpeg-user mailing list