diff --git a/CHANGELOG.md b/CHANGELOG.md
--- a/CHANGELOG.md
+++ b/CHANGELOG.md
@@ -1,3 +1,6 @@
+# 0.12.2.2
+* Fix a video playback framerate issue in the `vplay` demo (@gelisam)
+
 # 0.12.2
 * Better support for ffmpeg-3.4.2 API changes
 
diff --git a/demo/VPlay.hs b/demo/VPlay.hs
--- a/demo/VPlay.hs
+++ b/demo/VPlay.hs
@@ -15,6 +15,8 @@
 import Data.ByteString.Unsafe (unsafePackCStringFinalizer)
 import Data.Text (Text)
 
+import Data.IORef
+
 import Foreign.C.Types
 import Foreign.Ptr
 
@@ -195,18 +197,21 @@
 
   (renderTexture, getTexture, cleanup) <- textureReader src
 
+  -- First frame begins.
+  timeRef <- liftIO . newIORef =<< SDL.time
+
   liftIO $ whileJust_ (nothingOnQuit getTexture) $
     \ (next, time) -> do
 
       {- Rendering. -}
 
       -- Rendering start time.
-      rStartTime <- SDL.time
+      rStartTime <- liftIO $ readIORef timeRef
 
       renderTexture next
 
       -- Finish time of rendering.
-      rFinishTime <- SDL.time
+      rFinishTime <- SDL.time :: IO Double
 
       {- Synchronizing. -}
 
@@ -219,6 +224,9 @@
       when ( time > 0 && rTotalTime < frameTime) $ do
         -- Sleep their difference.
         SDL.delay $ frameTime - rTotalTime
+
+      -- Next frame begins.
+      liftIO . writeIORef timeRef =<< SDL.time
 
   {- Cleanup. -}
 
diff --git a/ffmpeg-light.cabal b/ffmpeg-light.cabal
--- a/ffmpeg-light.cabal
+++ b/ffmpeg-light.cabal
@@ -1,5 +1,5 @@
 name:                ffmpeg-light
-version:             0.12.2.1
+version:             0.12.2.2
 synopsis:            Minimal bindings to the FFmpeg library.
 
 description:         Stream frames from an encoded video, or stream frames to
