diff --git a/image_view/src/nodes/video_recorder.cpp b/image_view/src/nodes/video_recorder.cpp
index 3b3420eeb..708f90057 100644
--- a/image_view/src/nodes/video_recorder.cpp
+++ b/image_view/src/nodes/video_recorder.cpp
@@ -39,6 +39,7 @@ double min_depth_range;
 double max_depth_range;
 bool use_dynamic_range;
 int colormap;
+cv::Mat image;
 
 
 void callback(const sensor_msgs::ImageConstPtr& image_msg)
@@ -83,15 +84,7 @@ void callback(const sensor_msgs::ImageConstPtr& image_msg)
       options.min_image_value = min_depth_range;
       options.max_image_value = max_depth_range;
       options.colormap = colormap;
-      const cv::Mat image = cv_bridge::cvtColorForDisplay(cv_bridge::toCvShare(image_msg), encoding, options)->image;
-      if (!image.empty()) {
-        outputVideo << image;
-        ROS_INFO_STREAM("Recording frame " << g_count << "\x1b[1F");
-        g_count++;
-        g_last_wrote_time = image_msg->header.stamp;
-      } else {
-          ROS_WARN("Frame skipped, no data!");
-      }
+      image = cv_bridge::cvtColorForDisplay(cv_bridge::toCvShare(image_msg), encoding, options)->image;
     } catch(cv_bridge::Exception)
     {
         ROS_ERROR("Unable to convert %s image to %s", image_msg->encoding.c_str(), encoding.c_str());
@@ -99,6 +92,18 @@ void callback(const sensor_msgs::ImageConstPtr& image_msg)
     }
 }
 
+void timercallback(const ros::TimerEvent&)
+{
+    if (!image.empty()) {
+      outputVideo << image;
+      ROS_INFO_STREAM("Recording frame " << g_count << "\x1b[1F");
+      g_count++;
+      g_last_wrote_time = ros::Time::now();
+    } else {
+      ROS_WARN("Frame skipped, no data!");
+    }
+}
+
 int main(int argc, char** argv)
 {
     ros::init(argc, argv, "video_recorder", ros::init_options::AnonymousName);
@@ -134,6 +139,7 @@ int main(int argc, char** argv)
     image_transport::ImageTransport it(nh);
     std::string topic = nh.resolveName("image");
     image_transport::Subscriber sub_image = it.subscribe(topic, 1, callback);
+    ros::Timer timer = nh.createTimer(ros::Duration(1.0 / fps), timercallback);
 
     ROS_INFO_STREAM("Waiting for topic " << topic << "...");
     ros::spin();