{"id":784,"date":"2026-09-26T10:07:00","date_gmt":"2026-09-26T09:07:00","guid":{"rendered":"https:\/\/ruby-doc.org\/blog\/?p=784"},"modified":"2026-09-23T15:32:33","modified_gmt":"2026-09-23T14:32:33","slug":"how-to-compress-ruby-demo-videos","status":"publish","type":"post","link":"https:\/\/ruby-doc.org\/learn\/how-to-compress-ruby-demo-videos\/","title":{"rendered":"How to Compress Ruby Demo Videos"},"content":{"rendered":"\n<p class=\"wp-block-paragraph\">In many cases, all we want to view in a Ruby demo is one simple thing, like finding out which button caused a Rails form to fail. Instead, our demo is two minutes long. And the file size is equal to a director&#8217;s cut.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">Gem documentation, pull requests and bug reports should never include unnecessary video files. However, reducing file size too aggressively can leave the Ruby code blurry. The developer needs to be able to read the exception message, follow along with the interaction, and then quickly investigate further.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">Here&#8217;s how to reduce the size of your Ruby demo videos while keeping the code readable.<\/p>\n\n\n\n<h2 class=\"wp-block-heading\">Don\u2019t capture everything on your screen<\/h2>\n\n\n\n<p class=\"wp-block-paragraph\">For a tutorial on how to use IRB, most of what&#8217;s visible on your desktop is irrelevant. Frame just the terminal window. For a Rails validation problem, you should record both the browser and whatever output indicates why the validation failed. Everything else on your screen \u2014 including your desktop wallpaper and other windows \u2014 has no business being part of your demo video.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">Increase the font in your terminal before you start. Also, choose a color scheme that displays clearly defined punctuation and readable syntax highlighting. We expect a Ruby method to display clearly \u2014 even after exporting the video.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">Prepare the commands you\u2019ll execute during the demo. If you\u2019re going to demonstrate a failing RSpec example, there\u2019s no reason to make the viewer sit through you searching for the directory before executing the command. Display the command, allow it to execute, and pause where the relevant failure occurs. In addition, when demonstrating a Rails UI problem, maintain the interactive flow of events. Capture the click action, followed by the application\u2019s reaction, and finally capture the unintended outcome. Removing these moments of failure from your recorded demos eliminates their purpose.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">At some point you&#8217;ll likely decide to trim a video recording. Getting the framing correct upfront saves extra editing work.<\/p>\n\n\n\n<h2 class=\"wp-block-heading\">Test legibility before selecting a lower resolution<\/h2>\n\n\n\n<p class=\"wp-block-paragraph\">\u201cExport at 720p\u201d seems straightforward until your backtrace is rendered as gray confetti.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">A terminal with larger text may remain readable at 720p. On the other hand, an editor next to a browser may require more pixels. Always review your exported video at the expected viewing size in your documentation or issue report instead of reviewing it solely in a full-screen editor.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">Carefully examine several potential trouble spots: an underscore character, a line number or a punctuation character surrounding a hash. Can another Ruby programmer interpret these characters without having to guess?<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">Similarly, frame rate should receive the same practical consideration. While thirty frames per second could serve as an acceptable baseline for typical demonstrations, a mostly static console might be sufficient with fewer frames. On the other hand, a flickering drop down menu or a brief Turbo rendering bug in your demonstration requires sufficient frames to adequately represent the behavior that you\u2019re documenting.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">While conserving disk space is important, losing key information is even more significant.<\/p>\n\n\n\n<h2 class=\"wp-block-heading\">Measure the average bitrate and duration<\/h2>\n\n\n\n<p class=\"wp-block-paragraph\">Multiplying an average total bitrate times the length of a recording provides a reasonable estimation of the overall media file-size (prior to adding overhead from the container).<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">For example, a two-minute recording averaging 2 megabits per second contains about 30 megabytes of media data, before container overhead.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">However, such calculations say absolutely nothing regarding whether the code in your demo remains readable.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">Scrolling terminal output can be harder to compress cleanly than a static method definition. If the bitrate used is too low, characters may \u201csmear\u201d at exactly the moment when someone needs to study them.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">When trying different compression settings, export again from the original recording. Repeated lossy compression of an already compressed copy can degrade the quality further.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">For background reading, this Wikipedia link currently references its expanded description of data compression:<\/p>\n\n\n\n<p class=\"wp-block-paragraph\"><a href=\"https:\/\/en.wikipedia.org\/wiki\/Video_compression\">https:\/\/en.wikipedia.org\/wiki\/Video_compression<\/a><\/p>\n\n\n\n<p class=\"wp-block-paragraph\">Although you do not need to learn about all possible encoding schemes available to you today, you do need to visually verify that your exported demo clip works as intended.<\/p>\n\n\n\n<h2 class=\"wp-block-heading\">Export a format that plays well where you plan to share it<\/h2>\n\n\n\n<p class=\"wp-block-paragraph\">MP4 is often referred to as a \u201cdefault,\u201d however it represents merely a container and not a guarantee of cross-platform compatibility. As such, H.264 encoded video with AAC audio contained within an MP4 container should provide a suitable starting-point for playing in most web-browsers. Actual support still depends on the browser and operating system.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">Another valid alternative when you know that your target audience and publishing location support it is WebM.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">Once you have completed your video export process, always open the resulting video at least once in the environment where you intend to embed or publish it. Verify that both playback controls and audio are functioning properly. Simply because your video played correctly in your preferred editing software doesn\u2019t mean that it will play similarly in others.<\/p>\n\n\n\n<h2 class=\"wp-block-heading\">Let Ruby warn you when oversized demo clips are created<\/h2>\n\n\n\n<p class=\"wp-block-paragraph\">You don\u2019t need to create a video-encoding service to detect oversized demo videos.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">Assuming that you store demo videos locally under a path called <code>docs\/demos<\/code> before publishing them, here\u2019s a simple Ruby script that detects them relative to an example budget size:<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code>limit = 25 * 1024 * 1024 # Example budget: 25 MiB per file\n\noversized = Dir.glob(\"docs\/demos\/**\/*.{mp4,webm,mov}\").select do |path|\n  File.file?(path) &amp;&amp; File.size(path) &gt; limit\nend\n\noversized.each do |path|\n  size = File.size(path) \/ (1024.0 * 1024)\n  warn format(\"%s: %.1f MiB\", path, size)\nend\n\nabort \"Review these demos before publishing.\" unless oversized.empty?<\/code><\/pre>\n\n\n\n<p class=\"wp-block-paragraph\">Save this script as <code>script\/check_demo_sizes.rb<\/code>. Then run <code>ruby script\/check_demo_sizes.rb<\/code> from the project root.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">Ruby&#8217;s <code>Dir.glob<\/code> finds matching paths, and <code>File.size<\/code> returns each file&#8217;s size in bytes. The script prints any detected oversized files and exits with a failure status if any are found.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">The budget size of 25 MiB is simply project specific, not related to any particular upload limits set forth by platforms. Feel free to adjust as necessary for your demo videos. It uses only lowercase extensions and doesn\u2019t modify any of the files referenced.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">Checking whether the RSpec output is readable still falls on you. This tool simply helps ensure that oversized exported video clips aren\u2019t accidentally published due to a missing optimization setting.<\/p>\n\n\n\n<h2 class=\"wp-block-heading\">Automate compression when it saves you work<\/h2>\n\n\n\n<p class=\"wp-block-paragraph\">If you create multiple Ruby tutorials weekly, maintaining export settings in scripts may be beneficial. Using <code>Open3.capture3<\/code>, Ruby can invoke FFmpeg and gather its output. Additionally, FFmpeg\u2019s exit status can be examined programmatically. Pass the executable and arguments separately so you aren&#8217;t generating an interpolated shell command string.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">On the other hand, if you only occasionally produce pull request videos \u2014 perhaps clicking through a few interfaces \u2014 you may find manually clicking through several steps preferable.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">Using Clideo\u2019s browser-based <a href=\"https:\/\/clideo.com\/compress-video\">video size reducer<\/a>, you can upload a clip, select a compression preset, preview your new clip size, and download your newly compressed clip. Before downloading, check that the code is readable in Clideo&#8217;s preview.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">Clideo&#8217;s video editor for iPhone also includes trimming and cropping.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">These features can help remove idle time from recordings or reframe a demo. Don&#8217;t assume the app has the same export options as the browser compressor.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">Always check for sensitive information prior to sharing or publishing any Rails recording \u2014 including credentials, session cookies, and any customer information that was captured. Recording against dummy development data makes that check easier.<\/p>\n\n\n\n<h2 class=\"wp-block-heading\">Document the Ruby specifics as text<\/h2>\n\n\n\n<p class=\"wp-block-paragraph\">Regardless of how nicely compressed your video was made \u2014 it is an awful place to store your only copy of a stack trace.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">Document your Ruby version(s), <a href=\"https:\/\/stackoverflow.com\/questions\/17026441\/ruby-how-to-install-a-specific-version-of-a-ruby-gem\">relevant gem versions<\/a>, reproduction instructions \u2014 as well as any exception messages \u2014 inside of the issue itself. A minimal script or failing test gives maintainers something to run without transcribing a command from a paused frame.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">Your demo video exists primarily for illustrating what occurred: either the sequence of clicks applied; disappearance of forms; or differences between expected outcomes vs actual outcomes. Your written report supplies the details required to reproduce what the video shows.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">Remove all unnecessary pauses. Maintain legibility in your code examples. Review your final video export at least once before sharing it. When people open up your demos \u2014 they want to understand Ruby problems \u2014 and hopefully get straight to solving them.<\/p>\n","protected":false},"excerpt":{"rendered":"<p>In many cases, all we want to view in a Ruby demo is one simple thing, like finding out which button caused a Rails form to fail. Instead, our demo is two minutes long. And the file size is equal to a director&#8217;s cut. Gem documentation, pull requests and bug reports should never include unnecessary [&hellip;]<\/p>\n","protected":false},"author":3,"featured_media":1694,"comment_status":"closed","ping_status":"closed","sticky":false,"template":"","format":"standard","meta":{"footnotes":""},"categories":[3],"tags":[],"class_list":["post-784","post","type-post","status-publish","format-standard","has-post-thumbnail","hentry","category-ruby-tips"],"blocksy_meta":{"styles_descriptor":{"styles":{"desktop":"","tablet":"","mobile":""},"google_fonts":[],"version":7}},"yoast_head":"<!-- This site is optimized with the Yoast SEO plugin v28.6 - https:\/\/yoast.com\/product\/yoast-seo-wordpress\/ -->\n<title>How to Compress Ruby Demo Videos - Ruby-Doc Learn<\/title>\n<meta name=\"robots\" content=\"index, follow, max-snippet:-1, max-image-preview:large, max-video-preview:-1\" \/>\n<link rel=\"canonical\" href=\"https:\/\/ruby-doc.org\/learn\/how-to-compress-ruby-demo-videos\/\" \/>\n<meta property=\"og:locale\" content=\"en_US\" \/>\n<meta property=\"og:type\" content=\"article\" \/>\n<meta property=\"og:title\" content=\"How to Compress Ruby Demo Videos - Ruby-Doc Learn\" \/>\n<meta property=\"og:description\" content=\"In many cases, all we want to view in a Ruby demo is one simple thing, like finding out which button caused a Rails form to fail. Instead, our demo is two minutes long. And the file size is equal to a director&#8217;s cut. Gem documentation, pull requests and bug reports should never include unnecessary [&hellip;]\" \/>\n<meta property=\"og:url\" content=\"https:\/\/ruby-doc.org\/learn\/how-to-compress-ruby-demo-videos\/\" \/>\n<meta property=\"og:site_name\" content=\"Ruby-Doc Learn\" \/>\n<meta property=\"article:published_time\" content=\"2026-09-26T09:07:00+00:00\" \/>\n<meta property=\"og:image\" content=\"https:\/\/ruby-doc.org\/learn\/wp-content\/uploads\/2026\/09\/ruby-demo-video-compression.png\" \/>\n\t<meta property=\"og:image:width\" content=\"1672\" \/>\n\t<meta property=\"og:image:height\" content=\"941\" \/>\n\t<meta property=\"og:image:type\" content=\"image\/png\" \/>\n<meta name=\"author\" content=\"James Britt\" \/>\n<meta name=\"twitter:card\" content=\"summary_large_image\" \/>\n<meta name=\"twitter:label1\" content=\"Written by\" \/>\n\t<meta name=\"twitter:data1\" content=\"James Britt\" \/>\n\t<meta name=\"twitter:label2\" content=\"Est. reading time\" \/>\n\t<meta name=\"twitter:data2\" content=\"6 minutes\" \/>\n<script type=\"application\/ld+json\" class=\"yoast-schema-graph\">{\"@context\":\"https:\\\/\\\/schema.org\",\"@graph\":[{\"@type\":\"Article\",\"@id\":\"https:\\\/\\\/ruby-doc.org\\\/learn\\\/how-to-compress-ruby-demo-videos\\\/#article\",\"isPartOf\":{\"@id\":\"https:\\\/\\\/ruby-doc.org\\\/learn\\\/how-to-compress-ruby-demo-videos\\\/\"},\"author\":{\"@id\":\"https:\\\/\\\/ruby-doc.org\\\/learn\\\/james-britt\\\/#james-britt\"},\"headline\":\"How to Compress Ruby Demo Videos\",\"datePublished\":\"2026-09-26T09:07:00+00:00\",\"mainEntityOfPage\":{\"@id\":\"https:\\\/\\\/ruby-doc.org\\\/learn\\\/how-to-compress-ruby-demo-videos\\\/\"},\"wordCount\":1335,\"publisher\":{\"@id\":\"https:\\\/\\\/ruby-doc.org\\\/learn\\\/#organization\"},\"image\":{\"@id\":\"https:\\\/\\\/ruby-doc.org\\\/learn\\\/how-to-compress-ruby-demo-videos\\\/#primaryimage\"},\"thumbnailUrl\":\"https:\\\/\\\/ruby-doc.org\\\/learn\\\/wp-content\\\/uploads\\\/2026\\\/09\\\/ruby-demo-video-compression.png\",\"articleSection\":[\"Ruby tips\"],\"inLanguage\":\"en-US\"},{\"@type\":\"WebPage\",\"@id\":\"https:\\\/\\\/ruby-doc.org\\\/learn\\\/how-to-compress-ruby-demo-videos\\\/\",\"url\":\"https:\\\/\\\/ruby-doc.org\\\/learn\\\/how-to-compress-ruby-demo-videos\\\/\",\"name\":\"How to Compress Ruby Demo Videos - Ruby-Doc Learn\",\"isPartOf\":{\"@id\":\"https:\\\/\\\/ruby-doc.org\\\/learn\\\/#website\"},\"primaryImageOfPage\":{\"@id\":\"https:\\\/\\\/ruby-doc.org\\\/learn\\\/how-to-compress-ruby-demo-videos\\\/#primaryimage\"},\"image\":{\"@id\":\"https:\\\/\\\/ruby-doc.org\\\/learn\\\/how-to-compress-ruby-demo-videos\\\/#primaryimage\"},\"thumbnailUrl\":\"https:\\\/\\\/ruby-doc.org\\\/learn\\\/wp-content\\\/uploads\\\/2026\\\/09\\\/ruby-demo-video-compression.png\",\"datePublished\":\"2026-09-26T09:07:00+00:00\",\"breadcrumb\":{\"@id\":\"https:\\\/\\\/ruby-doc.org\\\/learn\\\/how-to-compress-ruby-demo-videos\\\/#breadcrumb\"},\"inLanguage\":\"en-US\",\"potentialAction\":[{\"@type\":\"ReadAction\",\"target\":[\"https:\\\/\\\/ruby-doc.org\\\/learn\\\/how-to-compress-ruby-demo-videos\\\/\"]}]},{\"@type\":\"ImageObject\",\"inLanguage\":\"en-US\",\"@id\":\"https:\\\/\\\/ruby-doc.org\\\/learn\\\/how-to-compress-ruby-demo-videos\\\/#primaryimage\",\"url\":\"https:\\\/\\\/ruby-doc.org\\\/learn\\\/wp-content\\\/uploads\\\/2026\\\/09\\\/ruby-demo-video-compression.png\",\"contentUrl\":\"https:\\\/\\\/ruby-doc.org\\\/learn\\\/wp-content\\\/uploads\\\/2026\\\/09\\\/ruby-demo-video-compression.png\",\"width\":1672,\"height\":941},{\"@type\":\"BreadcrumbList\",\"@id\":\"https:\\\/\\\/ruby-doc.org\\\/learn\\\/how-to-compress-ruby-demo-videos\\\/#breadcrumb\",\"itemListElement\":[{\"@type\":\"ListItem\",\"position\":1,\"name\":\"Home\",\"item\":\"https:\\\/\\\/ruby-doc.org\\\/learn\\\/\"},{\"@type\":\"ListItem\",\"position\":2,\"name\":\"How to Compress Ruby Demo Videos\"}]},{\"@type\":\"WebSite\",\"@id\":\"https:\\\/\\\/ruby-doc.org\\\/learn\\\/#website\",\"url\":\"https:\\\/\\\/ruby-doc.org\\\/learn\\\/\",\"name\":\"Ruby-Doc Learn\",\"description\":\"\",\"publisher\":{\"@id\":\"https:\\\/\\\/ruby-doc.org\\\/learn\\\/#organization\"},\"potentialAction\":[{\"@type\":\"SearchAction\",\"target\":{\"@type\":\"EntryPoint\",\"urlTemplate\":\"https:\\\/\\\/ruby-doc.org\\\/learn\\\/?s={search_term_string}\"},\"query-input\":{\"@type\":\"PropertyValueSpecification\",\"valueRequired\":true,\"valueName\":\"search_term_string\"}}],\"inLanguage\":\"en-US\"},{\"@type\":\"Organization\",\"@id\":\"https:\\\/\\\/ruby-doc.org\\\/learn\\\/#organization\",\"name\":\"Ruby-Doc Learn\",\"url\":\"https:\\\/\\\/ruby-doc.org\\\/learn\\\/\",\"logo\":{\"@type\":\"ImageObject\",\"inLanguage\":\"en-US\",\"@id\":\"https:\\\/\\\/ruby-doc.org\\\/learn\\\/#\\\/schema\\\/logo\\\/image\\\/\",\"url\":\"https:\\\/\\\/ruby-doc.org\\\/learn\\\/wp-content\\\/uploads\\\/2026\\\/09\\\/ruby-doc-logo-transparent.png\",\"contentUrl\":\"https:\\\/\\\/ruby-doc.org\\\/learn\\\/wp-content\\\/uploads\\\/2026\\\/09\\\/ruby-doc-logo-transparent.png\",\"width\":1650,\"height\":305,\"caption\":\"Ruby-Doc Learn\"},\"image\":{\"@id\":\"https:\\\/\\\/ruby-doc.org\\\/learn\\\/#\\\/schema\\\/logo\\\/image\\\/\"}},{\"@type\":\"Person\",\"@id\":\"https:\\\/\\\/ruby-doc.org\\\/learn\\\/james-britt\\\/#james-britt\",\"name\":\"James Britt\",\"image\":\"https:\\\/\\\/ruby-doc.org\\\/learn\\\/wp-content\\\/uploads\\\/2026\\\/09\\\/jgb_self-portrait-20140914.png\",\"description\":\"Creator and long-term maintainer of Ruby-Doc.org, founder of Neurogami, and author of practical Ruby tutorials for Ruby-Doc Learn.\",\"sameAs\":[\"https:\\\/\\\/jamesbritt.com\\\/\",\"https:\\\/\\\/neurogami.com\\\/\",\"https:\\\/\\\/www.oreilly.com\\\/pub\\\/au\\\/2595\",\"https:\\\/\\\/www.rubyevents.org\\\/profiles\\\/james-britt\"],\"url\":\"https:\\\/\\\/ruby-doc.org\\\/learn\\\/james-britt\\\/\",\"jobTitle\":\"Ruby developer and writer\",\"knowsAbout\":[\"Ruby programming language\",\"Ruby documentation\",\"JRuby\",\"Open Sound Control\",\"Software development\"],\"affiliation\":{\"@type\":\"Organization\",\"name\":\"Ruby-Doc.org\",\"url\":\"https:\\\/\\\/ruby-doc.org\\\/\"}}]}<\/script>\n<!-- \/ Yoast SEO plugin. -->","yoast_head_json":{"title":"How to Compress Ruby Demo Videos - Ruby-Doc Learn","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:\/\/ruby-doc.org\/learn\/how-to-compress-ruby-demo-videos\/","og_locale":"en_US","og_type":"article","og_title":"How to Compress Ruby Demo Videos - Ruby-Doc Learn","og_description":"In many cases, all we want to view in a Ruby demo is one simple thing, like finding out which button caused a Rails form to fail. Instead, our demo is two minutes long. And the file size is equal to a director&#8217;s cut. Gem documentation, pull requests and bug reports should never include unnecessary [&hellip;]","og_url":"https:\/\/ruby-doc.org\/learn\/how-to-compress-ruby-demo-videos\/","og_site_name":"Ruby-Doc Learn","article_published_time":"2026-09-26T09:07:00+00:00","og_image":[{"width":1672,"height":941,"url":"https:\/\/ruby-doc.org\/learn\/wp-content\/uploads\/2026\/09\/ruby-demo-video-compression.png","type":"image\/png"}],"author":"James Britt","twitter_card":"summary_large_image","twitter_misc":{"Written by":"James Britt","Est. reading time":"6 minutes"},"schema":{"@context":"https:\/\/schema.org","@graph":[{"@type":"Article","@id":"https:\/\/ruby-doc.org\/learn\/how-to-compress-ruby-demo-videos\/#article","isPartOf":{"@id":"https:\/\/ruby-doc.org\/learn\/how-to-compress-ruby-demo-videos\/"},"author":{"@id":"https:\/\/ruby-doc.org\/learn\/james-britt\/#james-britt"},"headline":"How to Compress Ruby Demo Videos","datePublished":"2026-09-26T09:07:00+00:00","mainEntityOfPage":{"@id":"https:\/\/ruby-doc.org\/learn\/how-to-compress-ruby-demo-videos\/"},"wordCount":1335,"publisher":{"@id":"https:\/\/ruby-doc.org\/learn\/#organization"},"image":{"@id":"https:\/\/ruby-doc.org\/learn\/how-to-compress-ruby-demo-videos\/#primaryimage"},"thumbnailUrl":"https:\/\/ruby-doc.org\/learn\/wp-content\/uploads\/2026\/09\/ruby-demo-video-compression.png","articleSection":["Ruby tips"],"inLanguage":"en-US"},{"@type":"WebPage","@id":"https:\/\/ruby-doc.org\/learn\/how-to-compress-ruby-demo-videos\/","url":"https:\/\/ruby-doc.org\/learn\/how-to-compress-ruby-demo-videos\/","name":"How to Compress Ruby Demo Videos - Ruby-Doc Learn","isPartOf":{"@id":"https:\/\/ruby-doc.org\/learn\/#website"},"primaryImageOfPage":{"@id":"https:\/\/ruby-doc.org\/learn\/how-to-compress-ruby-demo-videos\/#primaryimage"},"image":{"@id":"https:\/\/ruby-doc.org\/learn\/how-to-compress-ruby-demo-videos\/#primaryimage"},"thumbnailUrl":"https:\/\/ruby-doc.org\/learn\/wp-content\/uploads\/2026\/09\/ruby-demo-video-compression.png","datePublished":"2026-09-26T09:07:00+00:00","breadcrumb":{"@id":"https:\/\/ruby-doc.org\/learn\/how-to-compress-ruby-demo-videos\/#breadcrumb"},"inLanguage":"en-US","potentialAction":[{"@type":"ReadAction","target":["https:\/\/ruby-doc.org\/learn\/how-to-compress-ruby-demo-videos\/"]}]},{"@type":"ImageObject","inLanguage":"en-US","@id":"https:\/\/ruby-doc.org\/learn\/how-to-compress-ruby-demo-videos\/#primaryimage","url":"https:\/\/ruby-doc.org\/learn\/wp-content\/uploads\/2026\/09\/ruby-demo-video-compression.png","contentUrl":"https:\/\/ruby-doc.org\/learn\/wp-content\/uploads\/2026\/09\/ruby-demo-video-compression.png","width":1672,"height":941},{"@type":"BreadcrumbList","@id":"https:\/\/ruby-doc.org\/learn\/how-to-compress-ruby-demo-videos\/#breadcrumb","itemListElement":[{"@type":"ListItem","position":1,"name":"Home","item":"https:\/\/ruby-doc.org\/learn\/"},{"@type":"ListItem","position":2,"name":"How to Compress Ruby Demo Videos"}]},{"@type":"WebSite","@id":"https:\/\/ruby-doc.org\/learn\/#website","url":"https:\/\/ruby-doc.org\/learn\/","name":"Ruby-Doc Learn","description":"","publisher":{"@id":"https:\/\/ruby-doc.org\/learn\/#organization"},"potentialAction":[{"@type":"SearchAction","target":{"@type":"EntryPoint","urlTemplate":"https:\/\/ruby-doc.org\/learn\/?s={search_term_string}"},"query-input":{"@type":"PropertyValueSpecification","valueRequired":true,"valueName":"search_term_string"}}],"inLanguage":"en-US"},{"@type":"Organization","@id":"https:\/\/ruby-doc.org\/learn\/#organization","name":"Ruby-Doc Learn","url":"https:\/\/ruby-doc.org\/learn\/","logo":{"@type":"ImageObject","inLanguage":"en-US","@id":"https:\/\/ruby-doc.org\/learn\/#\/schema\/logo\/image\/","url":"https:\/\/ruby-doc.org\/learn\/wp-content\/uploads\/2026\/09\/ruby-doc-logo-transparent.png","contentUrl":"https:\/\/ruby-doc.org\/learn\/wp-content\/uploads\/2026\/09\/ruby-doc-logo-transparent.png","width":1650,"height":305,"caption":"Ruby-Doc Learn"},"image":{"@id":"https:\/\/ruby-doc.org\/learn\/#\/schema\/logo\/image\/"}},{"@type":"Person","@id":"https:\/\/ruby-doc.org\/learn\/james-britt\/#james-britt","name":"James Britt","image":"https:\/\/ruby-doc.org\/learn\/wp-content\/uploads\/2026\/09\/jgb_self-portrait-20140914.png","description":"Creator and long-term maintainer of Ruby-Doc.org, founder of Neurogami, and author of practical Ruby tutorials for Ruby-Doc Learn.","sameAs":["https:\/\/jamesbritt.com\/","https:\/\/neurogami.com\/","https:\/\/www.oreilly.com\/pub\/au\/2595","https:\/\/www.rubyevents.org\/profiles\/james-britt"],"url":"https:\/\/ruby-doc.org\/learn\/james-britt\/","jobTitle":"Ruby developer and writer","knowsAbout":["Ruby programming language","Ruby documentation","JRuby","Open Sound Control","Software development"],"affiliation":{"@type":"Organization","name":"Ruby-Doc.org","url":"https:\/\/ruby-doc.org\/"}}]}},"_links":{"self":[{"href":"https:\/\/ruby-doc.org\/learn\/wp-json\/wp\/v2\/posts\/784","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/ruby-doc.org\/learn\/wp-json\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/ruby-doc.org\/learn\/wp-json\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/ruby-doc.org\/learn\/wp-json\/wp\/v2\/users\/3"}],"replies":[{"embeddable":true,"href":"https:\/\/ruby-doc.org\/learn\/wp-json\/wp\/v2\/comments?post=784"}],"version-history":[{"count":2,"href":"https:\/\/ruby-doc.org\/learn\/wp-json\/wp\/v2\/posts\/784\/revisions"}],"predecessor-version":[{"id":1693,"href":"https:\/\/ruby-doc.org\/learn\/wp-json\/wp\/v2\/posts\/784\/revisions\/1693"}],"wp:featuredmedia":[{"embeddable":true,"href":"https:\/\/ruby-doc.org\/learn\/wp-json\/wp\/v2\/media\/1694"}],"wp:attachment":[{"href":"https:\/\/ruby-doc.org\/learn\/wp-json\/wp\/v2\/media?parent=784"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/ruby-doc.org\/learn\/wp-json\/wp\/v2\/categories?post=784"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/ruby-doc.org\/learn\/wp-json\/wp\/v2\/tags?post=784"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}