{"id":38842,"date":"2025-10-18T12:10:13","date_gmt":"2025-10-18T19:10:13","guid":{"rendered":"https:\/\/cloudinary.com\/blog\/?p=38842"},"modified":"2025-10-18T12:11:28","modified_gmt":"2025-10-18T19:11:28","slug":"how-to-convert-images-to-video-using-ffmpeg","status":"publish","type":"post","link":"https:\/\/cloudinary.com\/blog\/questions\/how-to-convert-images-to-video-using-ffmpeg\/","title":{"rendered":"How to Convert Images to Video Using FFmpeg"},"content":{"rendered":"\n<p>Turning a folder full of screenshots or design comps into a clean MP4 is a common need for product walk-throughs, social posts, and quick demos. The community often runs into the same hurdles: file ordering, per-slide durations, audio syncing, and best encoding settings for compatibility.\u00a0<\/p>\n\n\n\n<h2 class=\"wp-block-heading\">Question:<\/h2>\n\n\n\n<p><em>Hi all,<\/em><br><em>What is the simplest, repeatable approach for how to convert images to video using FFmpeg?<\/em><br><em>I have a sequence of images and need to create a video with a specific frame rate, make sure files are in the right order even if names are not numbered, optionally add audio, and keep the output compatible with most players and social platforms.<\/em><br><em>Any tips on quality settings, handling different image sizes, and setting per-image durations would be great. Thanks!<\/em><\/p>\n\n\n\n<h2 class=\"wp-block-heading\">Answer:<\/h2>\n\n\n\n<p>This job is best done with FFmpeg, due to its image input, timing, and encoding abilities. Let\u2019s cover the most common workflows, from quick numbered-sequence renders to advanced per-image durations and audio.<\/p>\n\n\n\n<h3 class=\"wp-block-heading\">1) Fast path: numbered files to MP4<\/h3>\n\n\n\n<p>If your files are named consistently (for example frames\/0001.jpg, 0002.jpg&#8230;), this produces a 30 fps 1080p H.264 video that plays everywhere:<\/p>\n\n\n<pre class=\"wp-block-code\" aria-describedby=\"shcb-language-1\" data-shcb-language-name=\"JavaScript\" data-shcb-language-slug=\"javascript\"><span><code class=\"hljs language-javascript shcb-wrap-lines\">ffmpeg -framerate <span class=\"hljs-number\">30<\/span> -i <span class=\"hljs-string\">\"frames\/%04d.jpg\"<\/span> \\\n\u00a0 -vf <span class=\"hljs-string\">\"scale=1920:-2,format=yuv420p,fps=30\"<\/span> \\\n\u00a0 -c:v libx264 -preset medium -crf <span class=\"hljs-number\">20<\/span> -pix_fmt yuv420p \\\n\u00a0 -movflags +faststart output.mp4<\/code><\/span><small class=\"shcb-language\" id=\"shcb-language-1\"><span class=\"shcb-language__label\">Code language:<\/span> <span class=\"shcb-language__name\">JavaScript<\/span> <span class=\"shcb-language__paren\">(<\/span><span class=\"shcb-language__slug\">javascript<\/span><span class=\"shcb-language__paren\">)<\/span><\/small><\/pre>\n\n\n<ul class=\"wp-block-list\">\n<li><code>-framerate<\/code> sets the input frame cadence. <code>-vf fps=30<\/code> ensures a constant output frame rate.<\/li>\n\n\n\n<li><code>scale=1920:-2<\/code> preserves aspect ratio and snaps height to a multiple of 2.<\/li>\n\n\n\n<li><code>libx264<\/code> with <code>-crf <\/code>18 to 23 is a good quality range. Lower CRF means higher quality and larger files.<\/li>\n\n\n\n<li><code>-movflags +faststart <\/code>optimizes MP4s for web playback.<\/li>\n<\/ul>\n\n\n\n<h3 class=\"wp-block-heading\">2) Non-numbered files or custom durations<\/h3>\n\n\n\n<p>For arbitrary filenames and per-image durations, use the concat demuxer. Create a text file:<\/p>\n\n\n<pre class=\"wp-block-code\" aria-describedby=\"shcb-language-2\" data-shcb-language-name=\"PHP\" data-shcb-language-slug=\"php\"><span><code class=\"hljs language-php shcb-wrap-lines\"><span class=\"hljs-comment\"># images.txt<\/span>\nfile <span class=\"hljs-string\">'01.png'<\/span>\nduration <span class=\"hljs-number\">3<\/span>\nfile <span class=\"hljs-string\">'slide-b.jpg'<\/span>\nduration <span class=\"hljs-number\">5<\/span>\nfile <span class=\"hljs-string\">'final.png'<\/span>\nduration <span class=\"hljs-number\">2<\/span>\n<span class=\"hljs-comment\"># repeat last file without duration so the final duration takes effect:<\/span>\nfile <span class=\"hljs-string\">'final.png'<\/span><\/code><\/span><small class=\"shcb-language\" id=\"shcb-language-2\"><span class=\"shcb-language__label\">Code language:<\/span> <span class=\"shcb-language__name\">PHP<\/span> <span class=\"shcb-language__paren\">(<\/span><span class=\"shcb-language__slug\">php<\/span><span class=\"shcb-language__paren\">)<\/span><\/small><\/pre>\n\n\n<p>Then run:<\/p>\n\n\n<pre class=\"wp-block-code\" aria-describedby=\"shcb-language-3\" data-shcb-language-name=\"CSS\" data-shcb-language-slug=\"css\"><span><code class=\"hljs language-css shcb-wrap-lines\"><span class=\"hljs-selector-tag\">ffmpeg<\/span> <span class=\"hljs-selector-tag\">-f<\/span> <span class=\"hljs-selector-tag\">concat<\/span> <span class=\"hljs-selector-tag\">-safe<\/span> 0 <span class=\"hljs-selector-tag\">-i<\/span> <span class=\"hljs-selector-tag\">images<\/span><span class=\"hljs-selector-class\">.txt<\/span> \\\n\u00a0 <span class=\"hljs-selector-tag\">-vsync<\/span> <span class=\"hljs-selector-tag\">vfr<\/span> <span class=\"hljs-selector-tag\">-c<\/span><span class=\"hljs-selector-pseudo\">:v<\/span> <span class=\"hljs-selector-tag\">libx264<\/span> <span class=\"hljs-selector-tag\">-crf<\/span> 20 <span class=\"hljs-selector-tag\">-preset<\/span> <span class=\"hljs-selector-tag\">slow<\/span> <span class=\"hljs-selector-tag\">-pix_fmt<\/span> <span class=\"hljs-selector-tag\">yuv420p<\/span> \\\n\u00a0 <span class=\"hljs-selector-tag\">-movflags<\/span> +<span class=\"hljs-selector-tag\">faststart<\/span> <span class=\"hljs-selector-tag\">slideshow<\/span><span class=\"hljs-selector-class\">.mp4<\/span><\/code><\/span><small class=\"shcb-language\" id=\"shcb-language-3\"><span class=\"shcb-language__label\">Code language:<\/span> <span class=\"shcb-language__name\">CSS<\/span> <span class=\"shcb-language__paren\">(<\/span><span class=\"shcb-language__slug\">css<\/span><span class=\"shcb-language__paren\">)<\/span><\/small><\/pre>\n\n\n<ul class=\"wp-block-list\">\n<li><code>-safe 0 <\/code>allows absolute paths in images.txt if needed.<\/li>\n\n\n\n<li><code>-vsync vfr<\/code> keeps variable frame rate where durations differ.<\/li>\n<\/ul>\n\n\n\n<h3 class=\"wp-block-heading\">3) Add a soundtrack and finish at the shorter stream<\/h3>\n\n\n<pre class=\"wp-block-code\" aria-describedby=\"shcb-language-4\" data-shcb-language-name=\"CSS\" data-shcb-language-slug=\"css\"><span><code class=\"hljs language-css shcb-wrap-lines\"><span class=\"hljs-selector-tag\">ffmpeg<\/span> <span class=\"hljs-selector-tag\">-f<\/span> <span class=\"hljs-selector-tag\">concat<\/span> <span class=\"hljs-selector-tag\">-safe<\/span> 0 <span class=\"hljs-selector-tag\">-i<\/span> <span class=\"hljs-selector-tag\">images<\/span><span class=\"hljs-selector-class\">.txt<\/span> <span class=\"hljs-selector-tag\">-i<\/span> <span class=\"hljs-selector-tag\">music<\/span><span class=\"hljs-selector-class\">.mp3<\/span> \\\n\u00a0 <span class=\"hljs-selector-tag\">-shortest<\/span> <span class=\"hljs-selector-tag\">-c<\/span><span class=\"hljs-selector-pseudo\">:v<\/span> <span class=\"hljs-selector-tag\">libx264<\/span> <span class=\"hljs-selector-tag\">-crf<\/span> 20 <span class=\"hljs-selector-tag\">-preset<\/span> <span class=\"hljs-selector-tag\">slow<\/span> <span class=\"hljs-selector-tag\">-pix_fmt<\/span> <span class=\"hljs-selector-tag\">yuv420p<\/span> \\\n\u00a0 <span class=\"hljs-selector-tag\">-c<\/span><span class=\"hljs-selector-pseudo\">:a<\/span> <span class=\"hljs-selector-tag\">aac<\/span> <span class=\"hljs-selector-tag\">-b<\/span><span class=\"hljs-selector-pseudo\">:a<\/span> 192<span class=\"hljs-selector-tag\">k<\/span> <span class=\"hljs-selector-tag\">-movflags<\/span> +<span class=\"hljs-selector-tag\">faststart<\/span> <span class=\"hljs-selector-tag\">slideshow_with_audio<\/span><span class=\"hljs-selector-class\">.mp4<\/span><\/code><\/span><small class=\"shcb-language\" id=\"shcb-language-4\"><span class=\"shcb-language__label\">Code language:<\/span> <span class=\"shcb-language__name\">CSS<\/span> <span class=\"shcb-language__paren\">(<\/span><span class=\"shcb-language__slug\">css<\/span><span class=\"shcb-language__paren\">)<\/span><\/small><\/pre>\n\n\n<ul class=\"wp-block-list\">\n<li><code>-shortest<\/code> ends the render when either the images or audio finishes.<\/li>\n\n\n\n<li><code>-c:a aac<\/code> is widely compatible for MP4 audio.<\/li>\n<\/ul>\n\n\n\n<h3 class=\"wp-block-heading\">4) Mixed image sizes and letterboxing<\/h3>\n\n\n\n<p>To fit everything into 1920&#215;1080 while preserving aspect ratio:<\/p>\n\n\n<pre class=\"wp-block-code\" aria-describedby=\"shcb-language-5\" data-shcb-language-name=\"JavaScript\" data-shcb-language-slug=\"javascript\"><span><code class=\"hljs language-javascript shcb-wrap-lines\">-vf <span class=\"hljs-string\">\"scale=1920:1080:force_original_aspect_ratio=decrease,\\\npad=1920:1080:(ow-iw)\/2:(oh-ih)\/2,format=yuv420p,fps=30\"<\/span><\/code><\/span><small class=\"shcb-language\" id=\"shcb-language-5\"><span class=\"shcb-language__label\">Code language:<\/span> <span class=\"shcb-language__name\">JavaScript<\/span> <span class=\"shcb-language__paren\">(<\/span><span class=\"shcb-language__slug\">javascript<\/span><span class=\"shcb-language__paren\">)<\/span><\/small><\/pre>\n\n\n<h3 class=\"wp-block-heading\">5) Ordering tips and alternatives<\/h3>\n\n\n\n<ul class=\"wp-block-list\">\n<li>Number your files consistently (0001, 0002&#8230;) and use <code>-start_number<\/code> if needed.<\/li>\n\n\n\n<li>For simple alphabetic ordering: <code>-pattern_type glob -i \"*.jpg\"<\/code> then encode as above.<\/li>\n<\/ul>\n\n\n\n<h3 class=\"wp-block-heading\">Recommended codecs and settings<\/h3>\n\n\n\n<ul class=\"wp-block-list\">\n<li>H.264 is the safest default for broad compatibility.<\/li>\n\n\n\n<li>FFmpeg offers many features beyond the basics.<\/li>\n<\/ul>\n\n\n\n<h3 class=\"wp-block-heading\">Optional: Subtle motion on stills<\/h3>\n\n\n\n<p>You can animate still images with pan and zoom effects for more visual interest. If you like the Ken Burns style, this primer helps you plan tasteful motion: <a href=\"https:\/\/cloudinary.com\/guides\/image-effects\/ken-burns-effect-complete-guide-and-how-to-apply-it\">Ken Burns effect guide<\/a>.<\/p>\n\n\n\n<h3 class=\"wp-block-heading\">Do the same with Cloud tools and speed up delivery<\/h3>\n\n\n\n<p>After rendering, you can upload and deliver the final MP4 efficiently with Cloudinary. This is especially helpful when you manage lots of <a href=\"https:\/\/cloudinary.com\/blog\/\">media assets<\/a> across web and mobile.<\/p>\n\n\n\n<p>Example upload with the Node SDK:<\/p>\n\n\n<pre class=\"wp-block-code\" aria-describedby=\"shcb-language-6\" data-shcb-language-name=\"JavaScript\" data-shcb-language-slug=\"javascript\"><span><code class=\"hljs language-javascript shcb-wrap-lines\"><span class=\"hljs-keyword\">import<\/span> { v2 <span class=\"hljs-keyword\">as<\/span> cloudinary } <span class=\"hljs-keyword\">from<\/span> <span class=\"hljs-string\">\"cloudinary\"<\/span>;\n\ncloudinary.config({\n\u00a0 <span class=\"hljs-attr\">cloud_name<\/span>: <span class=\"hljs-string\">\"YOUR_CLOUD\"<\/span>,\n\u00a0 <span class=\"hljs-attr\">api_key<\/span>: <span class=\"hljs-string\">\"YOUR_KEY\"<\/span>,\n\u00a0 <span class=\"hljs-attr\">api_secret<\/span>: <span class=\"hljs-string\">\"YOUR_SECRET\"<\/span>\n});\n\n<span class=\"hljs-keyword\">await<\/span> cloudinary.uploader.upload(<span class=\"hljs-string\">\"slideshow.mp4\"<\/span>, {\n\u00a0 <span class=\"hljs-attr\">resource_type<\/span>: <span class=\"hljs-string\">\"video\"<\/span>,\n\u00a0 <span class=\"hljs-attr\">folder<\/span>: <span class=\"hljs-string\">\"slideshows\"<\/span>,\n\u00a0 <span class=\"hljs-attr\">public_id<\/span>: <span class=\"hljs-string\">\"demo_show\"<\/span>\n});\n<span class=\"hljs-comment\">\/\/ Delivery (auto quality and format):<\/span>\n<span class=\"hljs-comment\">\/\/ https:\/\/res.cloudinary.com\/YOUR_CLOUD\/video\/upload\/q_auto,f_auto\/slideshows\/demo_show.mp4<\/span><\/code><\/span><small class=\"shcb-language\" id=\"shcb-language-6\"><span class=\"shcb-language__label\">Code language:<\/span> <span class=\"shcb-language__name\">JavaScript<\/span> <span class=\"shcb-language__paren\">(<\/span><span class=\"shcb-language__slug\">javascript<\/span><span class=\"shcb-language__paren\">)<\/span><\/small><\/pre>\n\n\n<ul class=\"wp-block-list\">\n<li>Upload once, deliver globally with optimized formats and bitrates.<\/li>\n\n\n\n<li>Offload transformations and reduce your server work while keeping a simple build step with FFmpeg.<\/li>\n<\/ul>\n\n\n\n<h3 class=\"wp-block-heading\">Common pitfalls<\/h3>\n\n\n\n<ul class=\"wp-block-list\">\n<li><strong>Green or washed-out playback:<\/strong> ensure <code>-pix_fmt yuv420p<\/code>.<\/li>\n\n\n\n<li><strong>Jumpy timing:<\/strong> use the concat demuxer with explicit durations, not just <code>-framerate<\/code>, if slides vary in length.<\/li>\n\n\n\n<li><strong>Large files: <\/strong>increase CRF slightly or choose a slower preset for better compression.<\/li>\n<\/ul>\n\n\n\n<h3 class=\"wp-block-heading\">Summary \/ TL;DR<\/h3>\n\n\n\n<ul class=\"wp-block-list\">\n<li><strong>For numbered files:<\/strong> use <code>-framerate<\/code> on input, scale, libx264, CRF 18 to 23, yuv420p, and <code>+faststart<\/code>.<\/li>\n\n\n\n<li><strong>For custom timings:<\/strong> create a concat file with durations and use <code>-vsync vfr<\/code>.<\/li>\n\n\n\n<li><strong>Add audio:<\/strong> <code>-i music.mp3<\/code> and <code>-shortest<\/code>.<\/li>\n\n\n\n<li><strong>Stick to H.264:<\/strong> It offers better compatibility and follows solid encoding practices.<\/li>\n<\/ul>\n\n\n\n<h2 class=\"wp-block-heading\">Learn More<\/h2>\n\n\n\n<ul class=\"wp-block-list\">\n<li><a href=\"https:\/\/cloudinary.com\/tools\/mkv-to-mp4\">MKV to MP4 Converter<\/a><\/li>\n\n\n\n<li><a href=\"https:\/\/cloudinary.com\/tools\/webm-to-mp4\">WEBM to MP4 Converter<\/a><\/li>\n\n\n\n<li><a href=\"https:\/\/cloudinary.com\/tools\/mp4-to-webm\">MP4 to WEBM Converter<\/a><\/li>\n\n\n\n<li><a href=\"https:\/\/cloudinary.com\/guides\/video\/video-engineering\">Video Engineering Guide<\/a><\/li>\n<\/ul>\n\n\n\n<p>Ready to optimize creation and delivery of your videos at scale? <a href=\"https:\/\/cloudinary.com\/users\/register_free\">Sign up for a free Cloudinary account<\/a> and streamline your workflow from upload to global delivery.<\/p>\n","protected":false},"excerpt":{"rendered":"<p>Turning a folder full of screenshots or design comps into a clean MP4 is a common need for product walk-throughs, social posts, and quick demos. The community often runs into the same hurdles: file ordering, per-slide durations, audio syncing, and best encoding settings for compatibility.\u00a0 Question: Hi all,What is the simplest, repeatable approach for how [&hellip;]<\/p>\n","protected":false},"author":88,"featured_media":38843,"comment_status":"closed","ping_status":"open","sticky":false,"template":"","format":"standard","meta":{"_acf_changed":false,"_cloudinary_featured_overwrite":false,"footnotes":""},"categories":[1],"tags":[423],"class_list":["post-38842","post","type-post","status-publish","format-standard","has-post-thumbnail","hentry","category-uncategorized","tag-questions"],"acf":[],"yoast_head":"<!-- This site is optimized with the Yoast SEO Premium plugin v25.6 (Yoast SEO v26.9) - https:\/\/yoast.com\/product\/yoast-seo-premium-wordpress\/ -->\n<title>How to Convert Images to Video Using FFmpeg<\/title>\n<meta name=\"description\" content=\"Turning a folder full of screenshots or design comps into a clean MP4 is a common need for product walk-throughs, social posts, and quick demos. The\" \/>\n<meta name=\"robots\" content=\"index, follow, max-snippet:-1, max-image-preview:large, max-video-preview:-1\" \/>\n<link rel=\"canonical\" href=\"https:\/\/cloudinary.com\/blog\/questions\/how-to-convert-images-to-video-using-ffmpeg\/\" \/>\n<meta property=\"og:locale\" content=\"en_US\" \/>\n<meta property=\"og:type\" content=\"article\" \/>\n<meta property=\"og:title\" content=\"How to Convert Images to Video Using FFmpeg\" \/>\n<meta property=\"og:description\" content=\"Turning a folder full of screenshots or design comps into a clean MP4 is a common need for product walk-throughs, social posts, and quick demos. The\" \/>\n<meta property=\"og:url\" content=\"https:\/\/cloudinary.com\/blog\/questions\/how-to-convert-images-to-video-using-ffmpeg\/\" \/>\n<meta property=\"og:site_name\" content=\"Cloudinary Blog\" \/>\n<meta property=\"article:published_time\" content=\"2025-10-18T19:10:13+00:00\" \/>\n<meta property=\"article:modified_time\" content=\"2025-10-18T19:11:28+00:00\" \/>\n<meta property=\"og:image\" content=\"https:\/\/res.cloudinary.com\/cloudinary-marketing\/images\/f_auto,q_auto\/v1760814588\/how_to_convert_images_to_video_using_ffmpeg_featured_image\/how_to_convert_images_to_video_using_ffmpeg_featured_image.jpg?_i=AA\" \/>\n\t<meta property=\"og:image:width\" content=\"2000\" \/>\n\t<meta property=\"og:image:height\" content=\"1100\" \/>\n\t<meta property=\"og:image:type\" content=\"image\/jpeg\" \/>\n<meta name=\"author\" content=\"damjanantevski\" \/>\n<meta name=\"twitter:card\" content=\"summary_large_image\" \/>\n<script type=\"application\/ld+json\" class=\"yoast-schema-graph\">{\"@context\":\"https:\/\/schema.org\",\"@graph\":[{\"@type\":\"NewsArticle\",\"@id\":\"https:\/\/cloudinary.com\/blog\/questions\/how-to-convert-images-to-video-using-ffmpeg\/#article\",\"isPartOf\":{\"@id\":\"https:\/\/cloudinary.com\/blog\/questions\/how-to-convert-images-to-video-using-ffmpeg\/\"},\"author\":{\"name\":\"damjanantevski\",\"@id\":\"https:\/\/cloudinary.com\/blog\/#\/schema\/person\/43592e43c12520a1e867d456b1e8cf7e\"},\"headline\":\"How to Convert Images to Video Using FFmpeg\",\"datePublished\":\"2025-10-18T19:10:13+00:00\",\"dateModified\":\"2025-10-18T19:11:28+00:00\",\"mainEntityOfPage\":{\"@id\":\"https:\/\/cloudinary.com\/blog\/questions\/how-to-convert-images-to-video-using-ffmpeg\/\"},\"wordCount\":577,\"publisher\":{\"@id\":\"https:\/\/cloudinary.com\/blog\/#organization\"},\"image\":{\"@id\":\"https:\/\/cloudinary.com\/blog\/questions\/how-to-convert-images-to-video-using-ffmpeg\/#primaryimage\"},\"thumbnailUrl\":\"https:\/\/res.cloudinary.com\/cloudinary-marketing\/images\/f_auto,q_auto\/v1760814588\/how_to_convert_images_to_video_using_ffmpeg_featured_image\/how_to_convert_images_to_video_using_ffmpeg_featured_image.jpg?_i=AA\",\"keywords\":[\"Questions\"],\"inLanguage\":\"en-US\",\"copyrightYear\":\"2025\",\"copyrightHolder\":{\"@id\":\"https:\/\/cloudinary.com\/#organization\"}},{\"@type\":\"WebPage\",\"@id\":\"https:\/\/cloudinary.com\/blog\/questions\/how-to-convert-images-to-video-using-ffmpeg\/\",\"url\":\"https:\/\/cloudinary.com\/blog\/questions\/how-to-convert-images-to-video-using-ffmpeg\/\",\"name\":\"How to Convert Images to Video Using FFmpeg\",\"isPartOf\":{\"@id\":\"https:\/\/cloudinary.com\/blog\/#website\"},\"primaryImageOfPage\":{\"@id\":\"https:\/\/cloudinary.com\/blog\/questions\/how-to-convert-images-to-video-using-ffmpeg\/#primaryimage\"},\"image\":{\"@id\":\"https:\/\/cloudinary.com\/blog\/questions\/how-to-convert-images-to-video-using-ffmpeg\/#primaryimage\"},\"thumbnailUrl\":\"https:\/\/res.cloudinary.com\/cloudinary-marketing\/images\/f_auto,q_auto\/v1760814588\/how_to_convert_images_to_video_using_ffmpeg_featured_image\/how_to_convert_images_to_video_using_ffmpeg_featured_image.jpg?_i=AA\",\"datePublished\":\"2025-10-18T19:10:13+00:00\",\"dateModified\":\"2025-10-18T19:11:28+00:00\",\"description\":\"Turning a folder full of screenshots or design comps into a clean MP4 is a common need for product walk-throughs, social posts, and quick demos. The\",\"breadcrumb\":{\"@id\":\"https:\/\/cloudinary.com\/blog\/questions\/how-to-convert-images-to-video-using-ffmpeg\/#breadcrumb\"},\"inLanguage\":\"en-US\",\"potentialAction\":[{\"@type\":\"ReadAction\",\"target\":[\"https:\/\/cloudinary.com\/blog\/questions\/how-to-convert-images-to-video-using-ffmpeg\/\"]}]},{\"@type\":\"ImageObject\",\"inLanguage\":\"en-US\",\"@id\":\"https:\/\/cloudinary.com\/blog\/questions\/how-to-convert-images-to-video-using-ffmpeg\/#primaryimage\",\"url\":\"https:\/\/res.cloudinary.com\/cloudinary-marketing\/images\/f_auto,q_auto\/v1760814588\/how_to_convert_images_to_video_using_ffmpeg_featured_image\/how_to_convert_images_to_video_using_ffmpeg_featured_image.jpg?_i=AA\",\"contentUrl\":\"https:\/\/res.cloudinary.com\/cloudinary-marketing\/images\/f_auto,q_auto\/v1760814588\/how_to_convert_images_to_video_using_ffmpeg_featured_image\/how_to_convert_images_to_video_using_ffmpeg_featured_image.jpg?_i=AA\",\"width\":2000,\"height\":1100},{\"@type\":\"BreadcrumbList\",\"@id\":\"https:\/\/cloudinary.com\/blog\/questions\/how-to-convert-images-to-video-using-ffmpeg\/#breadcrumb\",\"itemListElement\":[{\"@type\":\"ListItem\",\"position\":1,\"name\":\"Home\",\"item\":\"https:\/\/cloudinary.com\/blog\/\"},{\"@type\":\"ListItem\",\"position\":2,\"name\":\"How to Convert Images to Video Using FFmpeg\"}]},{\"@type\":\"WebSite\",\"@id\":\"https:\/\/cloudinary.com\/blog\/#website\",\"url\":\"https:\/\/cloudinary.com\/blog\/\",\"name\":\"Cloudinary Blog\",\"description\":\"\",\"publisher\":{\"@id\":\"https:\/\/cloudinary.com\/blog\/#organization\"},\"potentialAction\":[{\"@type\":\"SearchAction\",\"target\":{\"@type\":\"EntryPoint\",\"urlTemplate\":\"https:\/\/cloudinary.com\/blog\/?s={search_term_string}\"},\"query-input\":{\"@type\":\"PropertyValueSpecification\",\"valueRequired\":true,\"valueName\":\"search_term_string\"}}],\"inLanguage\":\"en-US\"},{\"@type\":\"Organization\",\"@id\":\"https:\/\/cloudinary.com\/blog\/#organization\",\"name\":\"Cloudinary Blog\",\"url\":\"https:\/\/cloudinary.com\/blog\/\",\"logo\":{\"@type\":\"ImageObject\",\"inLanguage\":\"en-US\",\"@id\":\"https:\/\/cloudinary.com\/blog\/#\/schema\/logo\/image\/\",\"url\":\"https:\/\/res.cloudinary.com\/cloudinary-marketing\/images\/f_auto,q_auto\/v1649718331\/Web_Assets\/blog\/cloudinary_logo_for_white_bg_1937437aa7_19374666c7_193742f877\/cloudinary_logo_for_white_bg_1937437aa7_19374666c7_193742f877.png?_i=AA\",\"contentUrl\":\"https:\/\/res.cloudinary.com\/cloudinary-marketing\/images\/f_auto,q_auto\/v1649718331\/Web_Assets\/blog\/cloudinary_logo_for_white_bg_1937437aa7_19374666c7_193742f877\/cloudinary_logo_for_white_bg_1937437aa7_19374666c7_193742f877.png?_i=AA\",\"width\":312,\"height\":60,\"caption\":\"Cloudinary Blog\"},\"image\":{\"@id\":\"https:\/\/cloudinary.com\/blog\/#\/schema\/logo\/image\/\"}},{\"@type\":\"Person\",\"@id\":\"https:\/\/cloudinary.com\/blog\/#\/schema\/person\/43592e43c12520a1e867d456b1e8cf7e\",\"name\":\"damjanantevski\",\"image\":{\"@type\":\"ImageObject\",\"inLanguage\":\"en-US\",\"@id\":\"https:\/\/cloudinary.com\/blog\/#\/schema\/person\/image\/\",\"url\":\"https:\/\/secure.gravatar.com\/avatar\/3b40c995531fe4d510212a06c9d4fc666d2cb8efbfebc98a94191701accf4817?s=96&d=mm&r=g\",\"contentUrl\":\"https:\/\/secure.gravatar.com\/avatar\/3b40c995531fe4d510212a06c9d4fc666d2cb8efbfebc98a94191701accf4817?s=96&d=mm&r=g\",\"caption\":\"damjanantevski\"}}]}<\/script>\n<!-- \/ Yoast SEO Premium plugin. -->","yoast_head_json":{"title":"How to Convert Images to Video Using FFmpeg","description":"Turning a folder full of screenshots or design comps into a clean MP4 is a common need for product walk-throughs, social posts, and quick demos. The","robots":{"index":"index","follow":"follow","max-snippet":"max-snippet:-1","max-image-preview":"max-image-preview:large","max-video-preview":"max-video-preview:-1"},"canonical":"https:\/\/cloudinary.com\/blog\/questions\/how-to-convert-images-to-video-using-ffmpeg\/","og_locale":"en_US","og_type":"article","og_title":"How to Convert Images to Video Using FFmpeg","og_description":"Turning a folder full of screenshots or design comps into a clean MP4 is a common need for product walk-throughs, social posts, and quick demos. The","og_url":"https:\/\/cloudinary.com\/blog\/questions\/how-to-convert-images-to-video-using-ffmpeg\/","og_site_name":"Cloudinary Blog","article_published_time":"2025-10-18T19:10:13+00:00","article_modified_time":"2025-10-18T19:11:28+00:00","og_image":[{"width":2000,"height":1100,"url":"https:\/\/res.cloudinary.com\/cloudinary-marketing\/images\/f_auto,q_auto\/v1760814588\/how_to_convert_images_to_video_using_ffmpeg_featured_image\/how_to_convert_images_to_video_using_ffmpeg_featured_image.jpg?_i=AA","type":"image\/jpeg"}],"author":"damjanantevski","twitter_card":"summary_large_image","schema":{"@context":"https:\/\/schema.org","@graph":[{"@type":"NewsArticle","@id":"https:\/\/cloudinary.com\/blog\/questions\/how-to-convert-images-to-video-using-ffmpeg\/#article","isPartOf":{"@id":"https:\/\/cloudinary.com\/blog\/questions\/how-to-convert-images-to-video-using-ffmpeg\/"},"author":{"name":"damjanantevski","@id":"https:\/\/cloudinary.com\/blog\/#\/schema\/person\/43592e43c12520a1e867d456b1e8cf7e"},"headline":"How to Convert Images to Video Using FFmpeg","datePublished":"2025-10-18T19:10:13+00:00","dateModified":"2025-10-18T19:11:28+00:00","mainEntityOfPage":{"@id":"https:\/\/cloudinary.com\/blog\/questions\/how-to-convert-images-to-video-using-ffmpeg\/"},"wordCount":577,"publisher":{"@id":"https:\/\/cloudinary.com\/blog\/#organization"},"image":{"@id":"https:\/\/cloudinary.com\/blog\/questions\/how-to-convert-images-to-video-using-ffmpeg\/#primaryimage"},"thumbnailUrl":"https:\/\/res.cloudinary.com\/cloudinary-marketing\/images\/f_auto,q_auto\/v1760814588\/how_to_convert_images_to_video_using_ffmpeg_featured_image\/how_to_convert_images_to_video_using_ffmpeg_featured_image.jpg?_i=AA","keywords":["Questions"],"inLanguage":"en-US","copyrightYear":"2025","copyrightHolder":{"@id":"https:\/\/cloudinary.com\/#organization"}},{"@type":"WebPage","@id":"https:\/\/cloudinary.com\/blog\/questions\/how-to-convert-images-to-video-using-ffmpeg\/","url":"https:\/\/cloudinary.com\/blog\/questions\/how-to-convert-images-to-video-using-ffmpeg\/","name":"How to Convert Images to Video Using FFmpeg","isPartOf":{"@id":"https:\/\/cloudinary.com\/blog\/#website"},"primaryImageOfPage":{"@id":"https:\/\/cloudinary.com\/blog\/questions\/how-to-convert-images-to-video-using-ffmpeg\/#primaryimage"},"image":{"@id":"https:\/\/cloudinary.com\/blog\/questions\/how-to-convert-images-to-video-using-ffmpeg\/#primaryimage"},"thumbnailUrl":"https:\/\/res.cloudinary.com\/cloudinary-marketing\/images\/f_auto,q_auto\/v1760814588\/how_to_convert_images_to_video_using_ffmpeg_featured_image\/how_to_convert_images_to_video_using_ffmpeg_featured_image.jpg?_i=AA","datePublished":"2025-10-18T19:10:13+00:00","dateModified":"2025-10-18T19:11:28+00:00","description":"Turning a folder full of screenshots or design comps into a clean MP4 is a common need for product walk-throughs, social posts, and quick demos. The","breadcrumb":{"@id":"https:\/\/cloudinary.com\/blog\/questions\/how-to-convert-images-to-video-using-ffmpeg\/#breadcrumb"},"inLanguage":"en-US","potentialAction":[{"@type":"ReadAction","target":["https:\/\/cloudinary.com\/blog\/questions\/how-to-convert-images-to-video-using-ffmpeg\/"]}]},{"@type":"ImageObject","inLanguage":"en-US","@id":"https:\/\/cloudinary.com\/blog\/questions\/how-to-convert-images-to-video-using-ffmpeg\/#primaryimage","url":"https:\/\/res.cloudinary.com\/cloudinary-marketing\/images\/f_auto,q_auto\/v1760814588\/how_to_convert_images_to_video_using_ffmpeg_featured_image\/how_to_convert_images_to_video_using_ffmpeg_featured_image.jpg?_i=AA","contentUrl":"https:\/\/res.cloudinary.com\/cloudinary-marketing\/images\/f_auto,q_auto\/v1760814588\/how_to_convert_images_to_video_using_ffmpeg_featured_image\/how_to_convert_images_to_video_using_ffmpeg_featured_image.jpg?_i=AA","width":2000,"height":1100},{"@type":"BreadcrumbList","@id":"https:\/\/cloudinary.com\/blog\/questions\/how-to-convert-images-to-video-using-ffmpeg\/#breadcrumb","itemListElement":[{"@type":"ListItem","position":1,"name":"Home","item":"https:\/\/cloudinary.com\/blog\/"},{"@type":"ListItem","position":2,"name":"How to Convert Images to Video Using FFmpeg"}]},{"@type":"WebSite","@id":"https:\/\/cloudinary.com\/blog\/#website","url":"https:\/\/cloudinary.com\/blog\/","name":"Cloudinary Blog","description":"","publisher":{"@id":"https:\/\/cloudinary.com\/blog\/#organization"},"potentialAction":[{"@type":"SearchAction","target":{"@type":"EntryPoint","urlTemplate":"https:\/\/cloudinary.com\/blog\/?s={search_term_string}"},"query-input":{"@type":"PropertyValueSpecification","valueRequired":true,"valueName":"search_term_string"}}],"inLanguage":"en-US"},{"@type":"Organization","@id":"https:\/\/cloudinary.com\/blog\/#organization","name":"Cloudinary Blog","url":"https:\/\/cloudinary.com\/blog\/","logo":{"@type":"ImageObject","inLanguage":"en-US","@id":"https:\/\/cloudinary.com\/blog\/#\/schema\/logo\/image\/","url":"https:\/\/res.cloudinary.com\/cloudinary-marketing\/images\/f_auto,q_auto\/v1649718331\/Web_Assets\/blog\/cloudinary_logo_for_white_bg_1937437aa7_19374666c7_193742f877\/cloudinary_logo_for_white_bg_1937437aa7_19374666c7_193742f877.png?_i=AA","contentUrl":"https:\/\/res.cloudinary.com\/cloudinary-marketing\/images\/f_auto,q_auto\/v1649718331\/Web_Assets\/blog\/cloudinary_logo_for_white_bg_1937437aa7_19374666c7_193742f877\/cloudinary_logo_for_white_bg_1937437aa7_19374666c7_193742f877.png?_i=AA","width":312,"height":60,"caption":"Cloudinary Blog"},"image":{"@id":"https:\/\/cloudinary.com\/blog\/#\/schema\/logo\/image\/"}},{"@type":"Person","@id":"https:\/\/cloudinary.com\/blog\/#\/schema\/person\/43592e43c12520a1e867d456b1e8cf7e","name":"damjanantevski","image":{"@type":"ImageObject","inLanguage":"en-US","@id":"https:\/\/cloudinary.com\/blog\/#\/schema\/person\/image\/","url":"https:\/\/secure.gravatar.com\/avatar\/3b40c995531fe4d510212a06c9d4fc666d2cb8efbfebc98a94191701accf4817?s=96&d=mm&r=g","contentUrl":"https:\/\/secure.gravatar.com\/avatar\/3b40c995531fe4d510212a06c9d4fc666d2cb8efbfebc98a94191701accf4817?s=96&d=mm&r=g","caption":"damjanantevski"}}]}},"jetpack_featured_media_url":"https:\/\/res.cloudinary.com\/cloudinary-marketing\/images\/f_auto,q_auto\/v1760814588\/how_to_convert_images_to_video_using_ffmpeg_featured_image\/how_to_convert_images_to_video_using_ffmpeg_featured_image.jpg?_i=AA","_links":{"self":[{"href":"https:\/\/cloudinary.com\/blog\/wp-json\/wp\/v2\/posts\/38842","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/cloudinary.com\/blog\/wp-json\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/cloudinary.com\/blog\/wp-json\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/cloudinary.com\/blog\/wp-json\/wp\/v2\/users\/88"}],"replies":[{"embeddable":true,"href":"https:\/\/cloudinary.com\/blog\/wp-json\/wp\/v2\/comments?post=38842"}],"version-history":[{"count":1,"href":"https:\/\/cloudinary.com\/blog\/wp-json\/wp\/v2\/posts\/38842\/revisions"}],"predecessor-version":[{"id":38844,"href":"https:\/\/cloudinary.com\/blog\/wp-json\/wp\/v2\/posts\/38842\/revisions\/38844"}],"wp:featuredmedia":[{"embeddable":true,"href":"https:\/\/cloudinary.com\/blog\/wp-json\/wp\/v2\/media\/38843"}],"wp:attachment":[{"href":"https:\/\/cloudinary.com\/blog\/wp-json\/wp\/v2\/media?parent=38842"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/cloudinary.com\/blog\/wp-json\/wp\/v2\/categories?post=38842"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/cloudinary.com\/blog\/wp-json\/wp\/v2\/tags?post=38842"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}