{"id":38851,"date":"2025-10-18T13:11:48","date_gmt":"2025-10-18T20:11:48","guid":{"rendered":"https:\/\/cloudinary.com\/blog\/?p=38851"},"modified":"2025-10-18T13:11:48","modified_gmt":"2025-10-18T20:11:48","slug":"how-to-get-video-dimensions-in-php","status":"publish","type":"post","link":"https:\/\/cloudinary.com\/blog\/questions\/how-to-get-video-dimensions-in-php\/","title":{"rendered":"How to Get Video Dimensions in PHP"},"content":{"rendered":"\n<p>Validating video uploads is a common need in web apps. Maybe you only want landscape videos, or you need to auto-generate posters that match the source aspect ratio. A frequent ask in dev threads is how to quickly read width and height without buffering the whole file.&nbsp;<\/p>\n\n\n\n<h2 class=\"wp-block-heading\">Question:<\/h2>\n\n\n\n<p><em>Hi folks,<\/em><br><em>I need to validate user-uploaded videos by resolution and aspect ratio before processing. What is the most reliable way to get video width and height using PHP? Ideally a solution that works in common hosting environments and can handle formats like MP4, MOV, and WEBM. In short, how to get video dimensions in PHP, plus any tips for rotation metadata and odd pixel aspect ratios would be great. Thanks!<\/em><\/p>\n\n\n\n<h2 class=\"wp-block-heading\">Answer:<\/h2>\n\n\n\n<p>Great question. The most robust approaches use FFprobe from FFmpeg or a metadata library. Let\u2019s cover three practical methods, plus a way to do this at scale if you manage your <a href=\"https:\/\/cloudinary.com\/tools\">media assets<\/a> in the cloud.<\/p>\n\n\n\n<h3 class=\"wp-block-heading\">Method 1: PHP bindings for FFprobe (recommended)<\/h3>\n\n\n\n<p>FFprobe is accurate across formats and codecs. You can use a PHP wrapper or invoke FFprobe directly. If you are curious about FFmpeg\u2019s broader capabilities, see <a href=\"https:\/\/cloudinary.com\/guides\/video-formats\/ffmpeg-features-use-cases-and-pros-cons-you-should-know\">this overview<\/a>.<\/p>\n\n\n<pre class=\"wp-block-code\" aria-describedby=\"shcb-language-1\" data-shcb-language-name=\"PHP\" data-shcb-language-slug=\"php\"><span><code class=\"hljs language-php shcb-wrap-lines\"><span class=\"hljs-keyword\">use<\/span> <span class=\"hljs-title\">FFMpeg<\/span>\\<span class=\"hljs-title\">FFProbe<\/span>;\n\n$videoPath = <span class=\"hljs-string\">'\/path\/to\/video.mp4'<\/span>; <span class=\"hljs-comment\">\/\/ local file or accessible URL<\/span>\n\n$ffprobe = FFProbe::create();\n\n<span class=\"hljs-comment\">\/\/ Get the first video stream<\/span>\n$stream = $ffprobe-&gt;streams($videoPath)-&gt;videos()-&gt;first();\n$width\u00a0 = (int) $stream-&gt;get(<span class=\"hljs-string\">'width'<\/span>);\n$height = (int) $stream-&gt;get(<span class=\"hljs-string\">'height'<\/span>);\n\n<span class=\"hljs-comment\">\/\/ Handle rotation if present (e.g., phone videos)<\/span>\n$rotate = (int) ($stream-&gt;get(<span class=\"hljs-string\">'tags'<\/span>)&#91;<span class=\"hljs-string\">'rotate'<\/span>] ?? <span class=\"hljs-number\">0<\/span>);\n<span class=\"hljs-keyword\">if<\/span> (in_array(abs($rotate), &#91;<span class=\"hljs-number\">90<\/span>, <span class=\"hljs-number\">270<\/span>], <span class=\"hljs-keyword\">true<\/span>)) {\n\u00a0 \u00a0 &#91;$width, $height] = &#91;$height, $width];\n}\n\n<span class=\"hljs-keyword\">echo<\/span> <span class=\"hljs-string\">\"Dimensions: {$width}x{$height}\\n\"<\/span>;<\/code><\/span><small class=\"shcb-language\" id=\"shcb-language-1\"><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>Notes:<\/p>\n\n\n\n<ul class=\"wp-block-list\">\n<li>If width or height are missing, try coded_width and coded_height as a fallback.<\/li>\n\n\n\n<li>Phone videos often include a rotate tag; swap width and height for 90 or 270 degrees.<\/li>\n\n\n\n<li>If pixel aspect ratio is not 1:1, consider sample_aspect_ratio to compute display width.<\/li>\n<\/ul>\n\n\n\n<h3 class=\"wp-block-heading\">Method 2: Shell out to FFprobe<\/h3>\n\n\n\n<p>If you cannot install a PHP wrapper, you can shell out to FFprobe. This is often available on servers or containers.<\/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\">$videoPath = <span class=\"hljs-string\">'\/path\/to\/video.mp4'<\/span>;\n$cmd = <span class=\"hljs-string\">'ffprobe -v error -select_streams v:0 -show_entries stream=width,height,rotation:stream_tags=rotate '<\/span> .\n\u00a0 \u00a0 \u00a0 <span class=\"hljs-string\">'-of json '<\/span> . escapeshellarg($videoPath);\n\n$json = shell_exec($cmd);\n$data = json_decode($json, <span class=\"hljs-keyword\">true<\/span>);\n\n$w = (int)($data&#91;<span class=\"hljs-string\">'streams'<\/span>]&#91;<span class=\"hljs-number\">0<\/span>]&#91;<span class=\"hljs-string\">'width'<\/span>] ?? <span class=\"hljs-number\">0<\/span>);\n$h = (int)($data&#91;<span class=\"hljs-string\">'streams'<\/span>]&#91;<span class=\"hljs-number\">0<\/span>]&#91;<span class=\"hljs-string\">'height'<\/span>] ?? <span class=\"hljs-number\">0<\/span>);\n\n$rotate = <span class=\"hljs-number\">0<\/span>;\n<span class=\"hljs-comment\">\/\/ rotation can appear under \"rotation\" or tags.rotate depending on build<\/span>\n<span class=\"hljs-keyword\">if<\/span> (<span class=\"hljs-keyword\">isset<\/span>($data&#91;<span class=\"hljs-string\">'streams'<\/span>]&#91;<span class=\"hljs-number\">0<\/span>]&#91;<span class=\"hljs-string\">'tags'<\/span>]&#91;<span class=\"hljs-string\">'rotate'<\/span>])) {\n\u00a0 \u00a0 $rotate = (int)$data&#91;<span class=\"hljs-string\">'streams'<\/span>]&#91;<span class=\"hljs-number\">0<\/span>]&#91;<span class=\"hljs-string\">'tags'<\/span>]&#91;<span class=\"hljs-string\">'rotate'<\/span>];\n} <span class=\"hljs-keyword\">elseif<\/span> (<span class=\"hljs-keyword\">isset<\/span>($data&#91;<span class=\"hljs-string\">'streams'<\/span>]&#91;<span class=\"hljs-number\">0<\/span>]&#91;<span class=\"hljs-string\">'rotation'<\/span>])) {\n\u00a0 \u00a0 $rotate = (int)$data&#91;<span class=\"hljs-string\">'streams'<\/span>]&#91;<span class=\"hljs-number\">0<\/span>]&#91;<span class=\"hljs-string\">'rotation'<\/span>];\n}\n\n<span class=\"hljs-keyword\">if<\/span> (in_array(abs($rotate), &#91;<span class=\"hljs-number\">90<\/span>, <span class=\"hljs-number\">270<\/span>], <span class=\"hljs-keyword\">true<\/span>)) {\n\u00a0 \u00a0 &#91;$w, $h] = &#91;$h, $w];\n}\n\n<span class=\"hljs-keyword\">echo<\/span> <span class=\"hljs-string\">\"Dimensions: {$w}x{$h}\\n\"<\/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<h3 class=\"wp-block-heading\">Method 3: getID3<\/h3>\n\n\n\n<p>The getID3 library can parse containers like MP4 and MOV. It is not as exhaustive as FFprobe for certain codecs, but it is pure PHP and easy to drop in.<\/p>\n\n\n<pre class=\"wp-block-code\" aria-describedby=\"shcb-language-3\" data-shcb-language-name=\"PHP\" data-shcb-language-slug=\"php\"><span><code class=\"hljs language-php shcb-wrap-lines\"><span class=\"hljs-keyword\">require<\/span> <span class=\"hljs-string\">'vendor\/autoload.php'<\/span>;\n\n$getID3 = <span class=\"hljs-keyword\">new<\/span> getID3;\n$info = $getID3-&gt;analyze(<span class=\"hljs-string\">'\/path\/to\/video.mp4'<\/span>);\n\n$w = $info&#91;<span class=\"hljs-string\">'video'<\/span>]&#91;<span class=\"hljs-string\">'resolution_x'<\/span>] ?? <span class=\"hljs-keyword\">null<\/span>;\n$h = $info&#91;<span class=\"hljs-string\">'video'<\/span>]&#91;<span class=\"hljs-string\">'resolution_y'<\/span>] ?? <span class=\"hljs-keyword\">null<\/span>;\n\n<span class=\"hljs-comment\">\/\/ Some files report rotation<\/span>\n$rotate = (int)($info&#91;<span class=\"hljs-string\">'video'<\/span>]&#91;<span class=\"hljs-string\">'rotate'<\/span>] ?? <span class=\"hljs-number\">0<\/span>);\n<span class=\"hljs-keyword\">if<\/span> ($w &amp;&amp; $h &amp;&amp; in_array(abs($rotate), &#91;<span class=\"hljs-number\">90<\/span>, <span class=\"hljs-number\">270<\/span>], <span class=\"hljs-keyword\">true<\/span>)) {\n\u00a0 \u00a0 &#91;$w, $h] = &#91;$h, $w];\n}\n\n<span class=\"hljs-keyword\">echo<\/span> <span class=\"hljs-string\">\"Dimensions: {$w}x{$h}\\n\"<\/span>;<\/code><\/span><small class=\"shcb-language\" id=\"shcb-language-3\"><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<h3 class=\"wp-block-heading\">Edge cases and best practices<\/h3>\n\n\n\n<ul class=\"wp-block-list\">\n<li><strong>Remote URLs: <\/strong>Try probing after a server-side download to avoid partial reads and redirects.<\/li>\n\n\n\n<li><strong>Multiple video streams:<\/strong> Most files have one; if not, pick v:0 unless you have specific rules.<\/li>\n\n\n\n<li><strong>Rotation and SAR:<\/strong> Treat rotation and sample aspect ratio carefully. For a refresher on how encoding impacts display, see <a href=\"https:\/\/cloudinary.com\/guides\/web-performance\/video-encoding-how-it-works-formats-best-practices\">this guide to video encoding<\/a>.<\/li>\n\n\n\n<li><strong>Performance: <\/strong>Cache the result keyed by file hash to avoid re-probing on every request.<\/li>\n<\/ul>\n\n\n\n<h3 class=\"wp-block-heading\">Do the same with Cloudinary<\/h3>\n\n\n\n<p>If you already store videos in Cloudinary, you can fetch dimensions using the Admin API without downloading the file. You also get other metadata like duration and bitrate in the same call.<\/p>\n\n\n<pre class=\"wp-block-code\" aria-describedby=\"shcb-language-4\" data-shcb-language-name=\"PHP\" data-shcb-language-slug=\"php\"><span><code class=\"hljs language-php shcb-wrap-lines\"><span class=\"hljs-keyword\">use<\/span> <span class=\"hljs-title\">Cloudinary<\/span>\\<span class=\"hljs-title\">Configuration<\/span>\\<span class=\"hljs-title\">Configuration<\/span>;\n<span class=\"hljs-keyword\">use<\/span> <span class=\"hljs-title\">Cloudinary<\/span>\\<span class=\"hljs-title\">Api<\/span>\\<span class=\"hljs-title\">Admin<\/span>\\<span class=\"hljs-title\">AdminApi<\/span>;\n\nConfiguration::instance(&#91;\n\u00a0 <span class=\"hljs-string\">'cloud'<\/span> =&gt; &#91;\n\u00a0 \u00a0 <span class=\"hljs-string\">'cloud_name'<\/span> =&gt; <span class=\"hljs-string\">'YOUR_CLOUD_NAME'<\/span>,\n\u00a0 \u00a0 <span class=\"hljs-string\">'api_key'<\/span>\u00a0 \u00a0 =&gt; <span class=\"hljs-string\">'YOUR_API_KEY'<\/span>,\n\u00a0 \u00a0 <span class=\"hljs-string\">'api_secret'<\/span> =&gt; <span class=\"hljs-string\">'YOUR_API_SECRET'<\/span>,\n\u00a0 ],\n]);\n\n$api = <span class=\"hljs-keyword\">new<\/span> AdminApi();\n\n<span class=\"hljs-comment\">\/\/ Get metadata for a video asset<\/span>\n$result = $api-&gt;asset(<span class=\"hljs-string\">'samples\/sea_turtle'<\/span>, &#91;<span class=\"hljs-string\">'resource_type'<\/span> =&gt; <span class=\"hljs-string\">'video'<\/span>]);\n\n$width\u00a0 = $result&#91;<span class=\"hljs-string\">'width'<\/span>] ?? <span class=\"hljs-keyword\">null<\/span>;\n$height = $result&#91;<span class=\"hljs-string\">'height'<\/span>] ?? <span class=\"hljs-keyword\">null<\/span>;\n<span class=\"hljs-keyword\">echo<\/span> <span class=\"hljs-string\">\"Cloudinary Dimensions: {$width}x{$height}\\n\"<\/span>;<\/code><\/span><small class=\"shcb-language\" id=\"shcb-language-4\"><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>For delivery, you can also resize on the fly using URL-based transformations, which is handy when you want to cap resolution or generate thumbnails. See Cloudinary\u2019s short explainer on <a href=\"https:\/\/cloudinary.com\/guides\/video-effects\/video-urls\">video URLs<\/a> for the basics. Example:<\/p>\n\n\n\n<p><a href=\"https:\/\/res.cloudinary.com\/<cloud_name&gt;\/video\/upload\/w_1280,h_720,c_limit\/samples\/sea_turtle.mp4\"><code>https:\/\/res.cloudinary.com\/<cloud_name>\/video\/upload\/w_1280,h_720,c_limit\/samples\/sea_turtle.mp4<\/cloud_name><\/code><\/a><\/p>\n\n\n\n<h3 class=\"wp-block-heading\">Why this approach works well<\/h3>\n\n\n\n<ul class=\"wp-block-list\">\n<li>FFprobe is format aware and accurate across edge cases.<\/li>\n\n\n\n<li>getID3 is a pure PHP fallback when you cannot install FFmpeg.<\/li>\n\n\n\n<li>Cloud APIs centralize metadata and offload heavy processing from your app tier.<\/li>\n<\/ul>\n\n\n\n<h2 class=\"wp-block-heading\">TL;DR<\/h2>\n\n\n\n<ul class=\"wp-block-list\">\n<li>Preferred: Use FFprobe to read width and height, accounting for rotation and aspect ratio.<\/li>\n\n\n\n<li>Fallback: Use getID3 for pure PHP environments.<\/li>\n\n\n\n<li>At scale: Store videos in Cloudinary and query dimensions via the Admin API, then deliver resized versions via URL transformations.<\/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\/guides\/video\/video-as-a-service\">Video as a Service<\/a><\/li>\n\n\n\n<li><a href=\"https:\/\/cloudinary.com\/guides\/video\/video-engineering\">Video Engineering<\/a><\/li>\n\n\n\n<li><a href=\"https:\/\/cloudinary.com\/tools\/webm-to-mp4\">Convert WEBM to MP4<\/a><\/li>\n\n\n\n<li><a href=\"https:\/\/cloudinary.com\/tools\/mov-to-mp4\">Convert MOV to MP4<\/a><\/li>\n<\/ul>\n\n\n\n<p>Ready to streamline how you store, transform, and deliver video? <a href=\"https:\/\/cloudinary.com\/users\/register_free\">Create a free Cloudinary account<\/a> and start building now.<\/p>\n\n\n\n<p><\/p>\n","protected":false},"excerpt":{"rendered":"<p>Validating video uploads is a common need in web apps. Maybe you only want landscape videos, or you need to auto-generate posters that match the source aspect ratio. A frequent ask in dev threads is how to quickly read width and height without buffering the whole file.&nbsp; Question: Hi folks,I need to validate user-uploaded videos [&hellip;]<\/p>\n","protected":false},"author":88,"featured_media":38852,"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-38851","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 Get Video Dimensions in PHP<\/title>\n<meta name=\"description\" content=\"Validating video uploads is a common need in web apps. Maybe you only want landscape videos, or you need to auto-generate posters that match the source\" \/>\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-get-video-dimensions-in-php\/\" \/>\n<meta property=\"og:locale\" content=\"en_US\" \/>\n<meta property=\"og:type\" content=\"article\" \/>\n<meta property=\"og:title\" content=\"How to Get Video Dimensions in PHP\" \/>\n<meta property=\"og:description\" content=\"Validating video uploads is a common need in web apps. Maybe you only want landscape videos, or you need to auto-generate posters that match the source\" \/>\n<meta property=\"og:url\" content=\"https:\/\/cloudinary.com\/blog\/questions\/how-to-get-video-dimensions-in-php\/\" \/>\n<meta property=\"og:site_name\" content=\"Cloudinary Blog\" \/>\n<meta property=\"article:published_time\" content=\"2025-10-18T20:11:48+00:00\" \/>\n<meta property=\"og:image\" content=\"https:\/\/res.cloudinary.com\/cloudinary-marketing\/images\/f_auto,q_auto\/v1760818256\/how_to_get_video_dimensions_in_php\/how_to_get_video_dimensions_in_php.jpg?_i=AA\" \/>\n\t<meta property=\"og:image:width\" content=\"1999\" \/>\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-get-video-dimensions-in-php\/#article\",\"isPartOf\":{\"@id\":\"https:\/\/cloudinary.com\/blog\/questions\/how-to-get-video-dimensions-in-php\/\"},\"author\":{\"name\":\"damjanantevski\",\"@id\":\"https:\/\/cloudinary.com\/blog\/#\/schema\/person\/43592e43c12520a1e867d456b1e8cf7e\"},\"headline\":\"How to Get Video Dimensions in PHP\",\"datePublished\":\"2025-10-18T20:11:48+00:00\",\"mainEntityOfPage\":{\"@id\":\"https:\/\/cloudinary.com\/blog\/questions\/how-to-get-video-dimensions-in-php\/\"},\"wordCount\":563,\"publisher\":{\"@id\":\"https:\/\/cloudinary.com\/blog\/#organization\"},\"image\":{\"@id\":\"https:\/\/cloudinary.com\/blog\/questions\/how-to-get-video-dimensions-in-php\/#primaryimage\"},\"thumbnailUrl\":\"https:\/\/res.cloudinary.com\/cloudinary-marketing\/images\/f_auto,q_auto\/v1760818256\/how_to_get_video_dimensions_in_php\/how_to_get_video_dimensions_in_php.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-get-video-dimensions-in-php\/\",\"url\":\"https:\/\/cloudinary.com\/blog\/questions\/how-to-get-video-dimensions-in-php\/\",\"name\":\"How to Get Video Dimensions in PHP\",\"isPartOf\":{\"@id\":\"https:\/\/cloudinary.com\/blog\/#website\"},\"primaryImageOfPage\":{\"@id\":\"https:\/\/cloudinary.com\/blog\/questions\/how-to-get-video-dimensions-in-php\/#primaryimage\"},\"image\":{\"@id\":\"https:\/\/cloudinary.com\/blog\/questions\/how-to-get-video-dimensions-in-php\/#primaryimage\"},\"thumbnailUrl\":\"https:\/\/res.cloudinary.com\/cloudinary-marketing\/images\/f_auto,q_auto\/v1760818256\/how_to_get_video_dimensions_in_php\/how_to_get_video_dimensions_in_php.jpg?_i=AA\",\"datePublished\":\"2025-10-18T20:11:48+00:00\",\"description\":\"Validating video uploads is a common need in web apps. Maybe you only want landscape videos, or you need to auto-generate posters that match the source\",\"breadcrumb\":{\"@id\":\"https:\/\/cloudinary.com\/blog\/questions\/how-to-get-video-dimensions-in-php\/#breadcrumb\"},\"inLanguage\":\"en-US\",\"potentialAction\":[{\"@type\":\"ReadAction\",\"target\":[\"https:\/\/cloudinary.com\/blog\/questions\/how-to-get-video-dimensions-in-php\/\"]}]},{\"@type\":\"ImageObject\",\"inLanguage\":\"en-US\",\"@id\":\"https:\/\/cloudinary.com\/blog\/questions\/how-to-get-video-dimensions-in-php\/#primaryimage\",\"url\":\"https:\/\/res.cloudinary.com\/cloudinary-marketing\/images\/f_auto,q_auto\/v1760818256\/how_to_get_video_dimensions_in_php\/how_to_get_video_dimensions_in_php.jpg?_i=AA\",\"contentUrl\":\"https:\/\/res.cloudinary.com\/cloudinary-marketing\/images\/f_auto,q_auto\/v1760818256\/how_to_get_video_dimensions_in_php\/how_to_get_video_dimensions_in_php.jpg?_i=AA\",\"width\":1999,\"height\":1100},{\"@type\":\"BreadcrumbList\",\"@id\":\"https:\/\/cloudinary.com\/blog\/questions\/how-to-get-video-dimensions-in-php\/#breadcrumb\",\"itemListElement\":[{\"@type\":\"ListItem\",\"position\":1,\"name\":\"Home\",\"item\":\"https:\/\/cloudinary.com\/blog\/\"},{\"@type\":\"ListItem\",\"position\":2,\"name\":\"How to Get Video Dimensions in PHP\"}]},{\"@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 Get Video Dimensions in PHP","description":"Validating video uploads is a common need in web apps. Maybe you only want landscape videos, or you need to auto-generate posters that match the source","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-get-video-dimensions-in-php\/","og_locale":"en_US","og_type":"article","og_title":"How to Get Video Dimensions in PHP","og_description":"Validating video uploads is a common need in web apps. Maybe you only want landscape videos, or you need to auto-generate posters that match the source","og_url":"https:\/\/cloudinary.com\/blog\/questions\/how-to-get-video-dimensions-in-php\/","og_site_name":"Cloudinary Blog","article_published_time":"2025-10-18T20:11:48+00:00","og_image":[{"width":1999,"height":1100,"url":"https:\/\/res.cloudinary.com\/cloudinary-marketing\/images\/f_auto,q_auto\/v1760818256\/how_to_get_video_dimensions_in_php\/how_to_get_video_dimensions_in_php.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-get-video-dimensions-in-php\/#article","isPartOf":{"@id":"https:\/\/cloudinary.com\/blog\/questions\/how-to-get-video-dimensions-in-php\/"},"author":{"name":"damjanantevski","@id":"https:\/\/cloudinary.com\/blog\/#\/schema\/person\/43592e43c12520a1e867d456b1e8cf7e"},"headline":"How to Get Video Dimensions in PHP","datePublished":"2025-10-18T20:11:48+00:00","mainEntityOfPage":{"@id":"https:\/\/cloudinary.com\/blog\/questions\/how-to-get-video-dimensions-in-php\/"},"wordCount":563,"publisher":{"@id":"https:\/\/cloudinary.com\/blog\/#organization"},"image":{"@id":"https:\/\/cloudinary.com\/blog\/questions\/how-to-get-video-dimensions-in-php\/#primaryimage"},"thumbnailUrl":"https:\/\/res.cloudinary.com\/cloudinary-marketing\/images\/f_auto,q_auto\/v1760818256\/how_to_get_video_dimensions_in_php\/how_to_get_video_dimensions_in_php.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-get-video-dimensions-in-php\/","url":"https:\/\/cloudinary.com\/blog\/questions\/how-to-get-video-dimensions-in-php\/","name":"How to Get Video Dimensions in PHP","isPartOf":{"@id":"https:\/\/cloudinary.com\/blog\/#website"},"primaryImageOfPage":{"@id":"https:\/\/cloudinary.com\/blog\/questions\/how-to-get-video-dimensions-in-php\/#primaryimage"},"image":{"@id":"https:\/\/cloudinary.com\/blog\/questions\/how-to-get-video-dimensions-in-php\/#primaryimage"},"thumbnailUrl":"https:\/\/res.cloudinary.com\/cloudinary-marketing\/images\/f_auto,q_auto\/v1760818256\/how_to_get_video_dimensions_in_php\/how_to_get_video_dimensions_in_php.jpg?_i=AA","datePublished":"2025-10-18T20:11:48+00:00","description":"Validating video uploads is a common need in web apps. Maybe you only want landscape videos, or you need to auto-generate posters that match the source","breadcrumb":{"@id":"https:\/\/cloudinary.com\/blog\/questions\/how-to-get-video-dimensions-in-php\/#breadcrumb"},"inLanguage":"en-US","potentialAction":[{"@type":"ReadAction","target":["https:\/\/cloudinary.com\/blog\/questions\/how-to-get-video-dimensions-in-php\/"]}]},{"@type":"ImageObject","inLanguage":"en-US","@id":"https:\/\/cloudinary.com\/blog\/questions\/how-to-get-video-dimensions-in-php\/#primaryimage","url":"https:\/\/res.cloudinary.com\/cloudinary-marketing\/images\/f_auto,q_auto\/v1760818256\/how_to_get_video_dimensions_in_php\/how_to_get_video_dimensions_in_php.jpg?_i=AA","contentUrl":"https:\/\/res.cloudinary.com\/cloudinary-marketing\/images\/f_auto,q_auto\/v1760818256\/how_to_get_video_dimensions_in_php\/how_to_get_video_dimensions_in_php.jpg?_i=AA","width":1999,"height":1100},{"@type":"BreadcrumbList","@id":"https:\/\/cloudinary.com\/blog\/questions\/how-to-get-video-dimensions-in-php\/#breadcrumb","itemListElement":[{"@type":"ListItem","position":1,"name":"Home","item":"https:\/\/cloudinary.com\/blog\/"},{"@type":"ListItem","position":2,"name":"How to Get Video Dimensions in PHP"}]},{"@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\/v1760818256\/how_to_get_video_dimensions_in_php\/how_to_get_video_dimensions_in_php.jpg?_i=AA","_links":{"self":[{"href":"https:\/\/cloudinary.com\/blog\/wp-json\/wp\/v2\/posts\/38851","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=38851"}],"version-history":[{"count":1,"href":"https:\/\/cloudinary.com\/blog\/wp-json\/wp\/v2\/posts\/38851\/revisions"}],"predecessor-version":[{"id":38853,"href":"https:\/\/cloudinary.com\/blog\/wp-json\/wp\/v2\/posts\/38851\/revisions\/38853"}],"wp:featuredmedia":[{"embeddable":true,"href":"https:\/\/cloudinary.com\/blog\/wp-json\/wp\/v2\/media\/38852"}],"wp:attachment":[{"href":"https:\/\/cloudinary.com\/blog\/wp-json\/wp\/v2\/media?parent=38851"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/cloudinary.com\/blog\/wp-json\/wp\/v2\/categories?post=38851"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/cloudinary.com\/blog\/wp-json\/wp\/v2\/tags?post=38851"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}