{"id":36464,"date":"2024-12-16T07:00:00","date_gmt":"2024-12-16T15:00:00","guid":{"rendered":"https:\/\/cloudinary.com\/blog\/?p=36464"},"modified":"2024-12-17T11:49:37","modified_gmt":"2024-12-17T19:49:37","slug":"resize-videos-social-media-next-js","status":"publish","type":"post","link":"https:\/\/cloudinary.com\/blog\/resize-videos-social-media-next-js","title":{"rendered":"How to Resize Videos for Social Media in Next.js"},"content":{"rendered":"\n<p>In recent years, video publishing has progressed rapidly, with new platforms and tools constantly being introduced. According to an <a target=\"_blank\" href=\"https:\/\/www.statista.com\/topics\/5960\/digital-video-advertising\/\" rel=\"noreferrer noopener\">article<\/a> by Statista, the number of digital video viewers worldwide is more than 3.3 billion. This shift has made sharing video content simpler than ever; however, creating and managing videos across these platforms still requires editing to specific dimensions and formatting. For example, platforms like Instagram and YouTube have different size requirements depending on the channel, e.g., feed, reels, shorts, etc. This means you must find tools to format your videos for each platform.<\/p>\n\n\n\n<p>By building a video resize app, you can customize videos for different social media platforms with ease. This blog post walks through how to build an app with Next.js and Cloudinary.<\/p>\n\n\n\n<p>Before we start, you should have a basic understanding of TypeScript or JavaScript and a <a target=\"_blank\" href=\"https:\/\/cloudinary.com\/users\/register_free\" rel=\"noreferrer noopener\">free<\/a><a target=\"_blank\" href=\"https:\/\/cloudinary.com\/users\/register_free\" rel=\"noreferrer noopener\"> Cloudinary account<\/a>. Also, you can find the completed app in this <a target=\"_blank\" href=\"https:\/\/github.com\/folucode\/cloudinary-video-resizer\" rel=\"noreferrer noopener\">GitHub <\/a><a target=\"_blank\" href=\"https:\/\/github.com\/folucode\/cloudinary-video-resizer\" rel=\"noreferrer noopener\">r<\/a><a target=\"_blank\" href=\"https:\/\/github.com\/folucode\/cloudinary-video-resizer\" rel=\"noreferrer noopener\">epository<\/a>.<\/p>\n\n\n\n<h1 class=\"wp-block-heading\">Set Up a Next.js App<\/h1>\n\n\n\n<p>To create a Next.js project, run the command below and select Yes for Typescript and App Router, as that\u2019s what you\u2018ll build this app in:<\/p>\n\n\n<pre class=\"wp-block-code\" aria-describedby=\"shcb-language-1\" data-shcb-language-name=\"HTML, XML\" data-shcb-language-slug=\"xml\"><span><code class=\"hljs language-xml shcb-wrap-lines\"><span class=\"hljs-tag\">&lt;<span class=\"hljs-name\">code<\/span>&gt;<\/span>$ npx create-next-app@latest<span class=\"hljs-tag\">&lt;\/<span class=\"hljs-name\">code<\/span>&gt;<\/span><\/code><\/span><small class=\"shcb-language\" id=\"shcb-language-1\"><span class=\"shcb-language__label\">Code language:<\/span> <span class=\"shcb-language__name\">HTML, XML<\/span> <span class=\"shcb-language__paren\">(<\/span><span class=\"shcb-language__slug\">xml<\/span><span class=\"shcb-language__paren\">)<\/span><\/small><\/pre>\n\n\n<p>Next, in the project directory, install the Cloudinary package with this command:<\/p>\n\n\n<pre class=\"wp-block-code\" aria-describedby=\"shcb-language-2\" data-shcb-language-name=\"HTML, XML\" data-shcb-language-slug=\"xml\"><span><code class=\"hljs language-xml shcb-wrap-lines\"><span class=\"hljs-tag\">&lt;<span class=\"hljs-name\">code<\/span>&gt;<\/span>$ npm install cloudinary<span class=\"hljs-tag\">&lt;\/<span class=\"hljs-name\">code<\/span>&gt;<\/span><\/code><\/span><small class=\"shcb-language\" id=\"shcb-language-2\"><span class=\"shcb-language__label\">Code language:<\/span> <span class=\"shcb-language__name\">HTML, XML<\/span> <span class=\"shcb-language__paren\">(<\/span><span class=\"shcb-language__slug\">xml<\/span><span class=\"shcb-language__paren\">)<\/span><\/small><\/pre>\n\n\n<p>Then, run <code>npm run dev<\/code> to render a development server at <a href=\"https:\/\/localhost:3000\/\" target=\"_blank\" rel=\"noreferrer noopener\">https:\/\/localhost:3000\/<\/a> in your browser.<\/p>\n\n\n\n<h2 class=\"wp-block-heading\">Set Up Environment Variables<\/h2>\n\n\n\n<p>In the project\u2019s root directory, add a new file, .env.local, and paste the code below in that file. This file will house all your Cloudinary app keys.<\/p>\n\n\n<pre class=\"wp-block-code\" aria-describedby=\"shcb-language-3\" data-shcb-language-name=\"HTML, XML\" data-shcb-language-slug=\"xml\"><span><code class=\"hljs language-xml shcb-wrap-lines\"><span class=\"hljs-tag\">&lt;<span class=\"hljs-name\">code<\/span>&gt;<\/span>CLOUDINARY_CLOUD_NAME=<span class=\"hljs-tag\">&lt;<span class=\"hljs-name\">CLOUDINARY_CLOUD_NAME<\/span>&gt;<\/span><span class=\"hljs-tag\">&lt;\/<span class=\"hljs-name\">code<\/span>&gt;<\/span>\n<span class=\"hljs-tag\">&lt;<span class=\"hljs-name\">code<\/span>&gt;<\/span>CLOUDINARY_API_KEY=<span class=\"hljs-tag\">&lt;<span class=\"hljs-name\">CLOUDINARY_API_KEY<\/span>&gt;<\/span><span class=\"hljs-tag\">&lt;\/<span class=\"hljs-name\">code<\/span>&gt;<\/span>\n<span class=\"hljs-tag\">&lt;<span class=\"hljs-name\">code<\/span>&gt;<\/span>CLOUDINARY_API_SECRET=<span class=\"hljs-tag\">&lt;<span class=\"hljs-name\">CLOUDINARY_API_SECRET<\/span>&gt;<\/span><span class=\"hljs-tag\">&lt;\/<span class=\"hljs-name\">code<\/span>&gt;<\/span><\/code><\/span><small class=\"shcb-language\" id=\"shcb-language-3\"><span class=\"shcb-language__label\">Code language:<\/span> <span class=\"shcb-language__name\">HTML, XML<\/span> <span class=\"shcb-language__paren\">(<\/span><span class=\"shcb-language__slug\">xml<\/span><span class=\"shcb-language__paren\">)<\/span><\/small><\/pre>\n\n\n<p>To get these details, navigate to the <a href=\"https:\/\/console.cloudinary.com\/pm\/c-44312a85dae383cdb3fedab809bc64\/developer-dashboard\" target=\"_blank\" rel=\"noreferrer noopener\">Cloudinary developer dashboard<\/a>. You should see it under the <strong>Product Environment Credentials <\/strong>section as shown in the image below:<\/p>\n\n\n\n<figure class=\"wp-block-image\"><img decoding=\"async\" src=\"https:\/\/paper-attachments.dropboxusercontent.com\/s_FAC31367B569289CE35519BA46439536320DC2912C27232D29C505C97900A213_1716381335729_Screenshot+2024-05-22+at+13.16.20.png\" alt=\"\"\/><figcaption class=\"wp-element-caption\">Cloudinary developer dashboard<\/figcaption><\/figure>\n\n\n\n<h2 class=\"wp-block-heading\">Setup Cloudinary Library<\/h2>\n\n\n\n<p>To set up the Cloudinary library, add a new folder called lib in the src folder; in that folder, add a file and name it cloudinary.ts.<\/p>\n\n\n<pre class=\"wp-block-code\" aria-describedby=\"shcb-language-4\" data-shcb-language-name=\"JavaScript\" data-shcb-language-slug=\"javascript\"><span><code class=\"hljs language-javascript shcb-wrap-lines\"><span class=\"hljs-comment\">\/\/ cloudinary.ts<\/span>\n\n<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\n\u00a0 <span class=\"hljs-attr\">cloud_name<\/span>: process.env.CLOUDINARY_CLOUD_NAME,\n\n\u00a0 <span class=\"hljs-attr\">api_key<\/span>: process.env.CLOUDINARY_API_KEY,\n\n\u00a0 <span class=\"hljs-attr\">api_secret<\/span>: process.env.CLOUDINARY_API_SECRET,\n\n});\n\n<span class=\"hljs-keyword\">export<\/span> <span class=\"hljs-keyword\">default<\/span> cloudinary;<\/code><\/span><small class=\"shcb-language\" id=\"shcb-language-4\"><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<p>In the code above, you imported the <strong>v2<\/strong> version of the Cloudinary library. The <code>cloudinary.config()<\/code> method configures the Cloudinary client with the account details you retrieved from your dashboard.<\/p>\n\n\n\n<p>This setup allows other parts of the application to import and use the configured Cloudinary client without configuring it again.<\/p>\n\n\n\n<h2 class=\"wp-block-heading\">Set Up the App Styles<\/h2>\n\n\n\n<p>In the page.module.css file, replace the boilerplate code with the code below to style the application.<\/p>\n\n\n<pre class=\"wp-block-code\" aria-describedby=\"shcb-language-5\" data-shcb-language-name=\"CSS\" data-shcb-language-slug=\"css\"><span><code class=\"hljs language-css shcb-wrap-lines\"><span class=\"hljs-selector-class\">.page<\/span> {\n\n\u00a0 <span class=\"hljs-attribute\">--gray-rgb<\/span>: <span class=\"hljs-number\">0<\/span>, <span class=\"hljs-number\">0<\/span>, <span class=\"hljs-number\">0<\/span>;\n\n\u00a0 <span class=\"hljs-attribute\">--gray-alpha-200<\/span>: <span class=\"hljs-built_in\">rgba<\/span>(var(--gray-rgb), <span class=\"hljs-number\">0.08<\/span>);\n\n\u00a0 <span class=\"hljs-attribute\">--gray-alpha-100<\/span>: <span class=\"hljs-built_in\">rgba<\/span>(var(--gray-rgb), <span class=\"hljs-number\">0.05<\/span>);\n\n\u00a0 <span class=\"hljs-attribute\">--button-primary-hover<\/span>: <span class=\"hljs-number\">#383838<\/span>;\n\n\u00a0 <span class=\"hljs-attribute\">--button-secondary-hover<\/span>: <span class=\"hljs-number\">#f2f2f2<\/span>;\n\n\u00a0 <span class=\"hljs-attribute\">display<\/span>: grid;\n\n\u00a0 <span class=\"hljs-attribute\">grid-template-rows<\/span>: <span class=\"hljs-number\">20px<\/span> <span class=\"hljs-number\">1<\/span>fr <span class=\"hljs-number\">20px<\/span>;\n\n\u00a0 <span class=\"hljs-attribute\">align-items<\/span>: center;\n\n\u00a0 <span class=\"hljs-attribute\">justify-items<\/span>: center;\n\n\u00a0 <span class=\"hljs-attribute\">min-height<\/span>: <span class=\"hljs-number\">100s<\/span>vh;\n\n\u00a0 <span class=\"hljs-attribute\">padding<\/span>: <span class=\"hljs-number\">80px<\/span>;\n\n\u00a0 <span class=\"hljs-attribute\">gap<\/span>: <span class=\"hljs-number\">64px<\/span>;\n\n\u00a0 <span class=\"hljs-attribute\">font-family<\/span>: <span class=\"hljs-built_in\">var<\/span>(--font-geist-sans);\n\n}\n\n<span class=\"hljs-selector-class\">.main<\/span> {\n\n\u00a0 <span class=\"hljs-attribute\">display<\/span>: flex;\n\n\u00a0 <span class=\"hljs-attribute\">flex-direction<\/span>: column;\n\n\u00a0 <span class=\"hljs-attribute\">gap<\/span>: <span class=\"hljs-number\">32px<\/span>;\n\n\u00a0 <span class=\"hljs-attribute\">grid-row-start<\/span>: <span class=\"hljs-number\">2<\/span>;\n\n}\n\n<span class=\"hljs-selector-class\">.upload-form<\/span> {\n\n\u00a0 <span class=\"hljs-attribute\">display<\/span>: flex;\n\n\u00a0 <span class=\"hljs-attribute\">flex-direction<\/span>: column;\n\n\u00a0 <span class=\"hljs-attribute\">gap<\/span>: <span class=\"hljs-number\">1rem<\/span>;\n\n\u00a0 <span class=\"hljs-attribute\">width<\/span>: auto;\n\n\u00a0 <span class=\"hljs-attribute\">margin<\/span>: <span class=\"hljs-number\">0<\/span> auto;\n\n\u00a0 <span class=\"hljs-attribute\">padding<\/span>: <span class=\"hljs-number\">2rem<\/span>;\n\n\u00a0 <span class=\"hljs-attribute\">border<\/span>: <span class=\"hljs-number\">1px<\/span> solid <span class=\"hljs-number\">#ddd<\/span>;\n\n\u00a0 <span class=\"hljs-attribute\">border-radius<\/span>: <span class=\"hljs-number\">4px<\/span>;\n\n\u00a0 <span class=\"hljs-attribute\">background-color<\/span>: white;\n\n}\n\n<span class=\"hljs-selector-class\">.upload-form<\/span> <span class=\"hljs-selector-tag\">h2<\/span> {\n\n\u00a0 <span class=\"hljs-attribute\">color<\/span>: <span class=\"hljs-number\">#484c48<\/span>;\n\n}\n\n<span class=\"hljs-selector-class\">.form-group<\/span> {\n\n\u00a0 <span class=\"hljs-attribute\">display<\/span>: flex;\n\n\u00a0 <span class=\"hljs-attribute\">align-items<\/span>: center;\n\n\u00a0 <span class=\"hljs-attribute\">margin<\/span>: <span class=\"hljs-number\">20px<\/span> <span class=\"hljs-number\">0<\/span>;\n\n}\n\n<span class=\"hljs-selector-class\">.form-group<\/span> <span class=\"hljs-selector-tag\">label<\/span> {\n\n\u00a0 <span class=\"hljs-attribute\">flex<\/span>: <span class=\"hljs-number\">0<\/span> <span class=\"hljs-number\">0<\/span> <span class=\"hljs-number\">30%<\/span>;\n\n\u00a0 <span class=\"hljs-attribute\">text-align<\/span>: left;\n\n\u00a0 <span class=\"hljs-attribute\">color<\/span>: <span class=\"hljs-number\">#403e3e<\/span>;\n\n}\n\n<span class=\"hljs-selector-class\">.form-group<\/span> <span class=\"hljs-selector-tag\">input<\/span>,\n\n<span class=\"hljs-selector-class\">.form-group<\/span> <span class=\"hljs-selector-tag\">select<\/span> {\n\n\u00a0 <span class=\"hljs-attribute\">flex<\/span>: <span class=\"hljs-number\">1<\/span>;\n\n\u00a0 <span class=\"hljs-attribute\">padding<\/span>: <span class=\"hljs-number\">0.5rem<\/span>;\n\n\u00a0 <span class=\"hljs-attribute\">border<\/span>: <span class=\"hljs-number\">1px<\/span> solid <span class=\"hljs-number\">#ccc<\/span>;\n\n\u00a0 <span class=\"hljs-attribute\">border-radius<\/span>: <span class=\"hljs-number\">4px<\/span>;\n\n\u00a0 <span class=\"hljs-attribute\">background<\/span>: none;\n\n\u00a0 <span class=\"hljs-attribute\">color<\/span>: black;\n\n}\n\n<span class=\"hljs-selector-class\">.form-group<\/span> <span class=\"hljs-selector-tag\">input<\/span><span class=\"hljs-selector-pseudo\">:active<\/span>,\n\n<span class=\"hljs-selector-class\">.form-group<\/span> <span class=\"hljs-selector-tag\">select<\/span><span class=\"hljs-selector-pseudo\">:active<\/span> {\n\n\u00a0 <span class=\"hljs-attribute\">outline-style<\/span>: none;\n\n\u00a0 <span class=\"hljs-attribute\">outline-color<\/span>: white;\n\n}\n\n<span class=\"hljs-selector-class\">.submit-button<\/span> {\n\n\u00a0 <span class=\"hljs-attribute\">background-color<\/span>: <span class=\"hljs-built_in\">rgb<\/span>(<span class=\"hljs-number\">81<\/span>, <span class=\"hljs-number\">81<\/span>, <span class=\"hljs-number\">234<\/span>);\n\n\u00a0 <span class=\"hljs-attribute\">color<\/span>: white;\n\n\u00a0 <span class=\"hljs-attribute\">padding<\/span>: <span class=\"hljs-number\">0.5rem<\/span>;\n\n\u00a0 <span class=\"hljs-attribute\">border<\/span>: none;\n\n\u00a0 <span class=\"hljs-attribute\">border-radius<\/span>: <span class=\"hljs-number\">4px<\/span>;\n\n\u00a0 <span class=\"hljs-attribute\">cursor<\/span>: pointer;\n\n\u00a0 <span class=\"hljs-attribute\">font-size<\/span>: medium;\n\n}\n\n<span class=\"hljs-selector-class\">.submit-button<\/span><span class=\"hljs-selector-pseudo\">:hover<\/span> {\n\n\u00a0 <span class=\"hljs-attribute\">background-color<\/span>: <span class=\"hljs-built_in\">rgb<\/span>(<span class=\"hljs-number\">119<\/span>, <span class=\"hljs-number\">119<\/span>, <span class=\"hljs-number\">243<\/span>);\n\n}<\/code><\/span><small class=\"shcb-language\" id=\"shcb-language-5\"><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<h1 class=\"wp-block-heading\">Build the App functionality<\/h1>\n\n\n\n<p>Now that you\u2019re all set up, you can start building the upload and resize functionality. In the page.tsx file, you need to first set up the form that will upload your video to Cloudinary. You can also use the <a target=\"_blank\" href=\"https:\/\/cloudinary.com\/documentation\/upload_widget\" rel=\"noreferrer noopener\">Cloudinary widget<\/a> to upload an asset but you won\u2019t be able to transform the asset on the fly.<\/p>\n\n\n\n<p>Replace the boilerplate code in the file with this:<\/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-comment\">\/\/ src\/app\/page.tsx<\/span>\n\n<span class=\"hljs-keyword\">import<\/span> styles <span class=\"hljs-keyword\">from<\/span> <span class=\"hljs-string\">'.\/page.module.css'<\/span>;\n\n<span class=\"hljs-keyword\">import<\/span> cloudinary <span class=\"hljs-keyword\">from<\/span> <span class=\"hljs-string\">'@\/lib\/cloudinary'<\/span>;\n\n<span class=\"hljs-keyword\">import<\/span> { SubmitButton } <span class=\"hljs-keyword\">from<\/span> <span class=\"hljs-string\">'.\/submit-button'<\/span>;\n\n<span class=\"hljs-keyword\">export<\/span> <span class=\"hljs-keyword\">default<\/span> <span class=\"hljs-function\"><span class=\"hljs-keyword\">function<\/span> <span class=\"hljs-title\">Home<\/span>(<span class=\"hljs-params\"><\/span>) <\/span>{\n\n\u00a0 <span class=\"hljs-keyword\">const<\/span> handleSubmit = <span class=\"hljs-keyword\">async<\/span> (formData: FormData) =&gt; {};\n\n\u00a0 <span class=\"hljs-keyword\">return<\/span> (\n\n\u00a0 \u00a0 <span class=\"xml\"><span class=\"hljs-tag\">&lt;<span class=\"hljs-name\">div<\/span> <span class=\"hljs-attr\">className<\/span>=<span class=\"hljs-string\">{styles.page}<\/span>&gt;<\/span>\n\n\u00a0 \u00a0 \u00a0 <span class=\"hljs-tag\">&lt;<span class=\"hljs-name\">main<\/span> <span class=\"hljs-attr\">className<\/span>=<span class=\"hljs-string\">{styles.main}<\/span>&gt;<\/span>\n\n\u00a0 \u00a0 \u00a0 \u00a0 <span class=\"hljs-tag\">&lt;<span class=\"hljs-name\">div<\/span> <span class=\"hljs-attr\">className<\/span>=<span class=\"hljs-string\">{styles&#91;<\/span>'<span class=\"hljs-attr\">upload-form<\/span>']}&gt;<\/span>\n\n\u00a0 \u00a0 \u00a0 \u00a0 \u00a0 <span class=\"hljs-tag\">&lt;<span class=\"hljs-name\">h2<\/span>&gt;<\/span>Upload and Resize Your Video<span class=\"hljs-tag\">&lt;\/<span class=\"hljs-name\">h2<\/span>&gt;<\/span>\n\n\u00a0 \u00a0 \u00a0 \u00a0 \u00a0 <span class=\"hljs-tag\">&lt;<span class=\"hljs-name\">form<\/span> <span class=\"hljs-attr\">action<\/span>=<span class=\"hljs-string\">{handleSubmit}<\/span>&gt;<\/span>\n\n\u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 <span class=\"hljs-tag\">&lt;<span class=\"hljs-name\">div<\/span> <span class=\"hljs-attr\">className<\/span>=<span class=\"hljs-string\">{styles&#91;<\/span>'<span class=\"hljs-attr\">form-group<\/span>']}&gt;<\/span>\n\n\u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 <span class=\"hljs-tag\">&lt;<span class=\"hljs-name\">label<\/span> <span class=\"hljs-attr\">htmlFor<\/span>=<span class=\"hljs-string\">'video'<\/span>&gt;<\/span>Upload Video:<span class=\"hljs-tag\">&lt;\/<span class=\"hljs-name\">label<\/span>&gt;<\/span>\n\n\u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 <span class=\"hljs-tag\">&lt;<span class=\"hljs-name\">input<\/span> <span class=\"hljs-attr\">type<\/span>=<span class=\"hljs-string\">'file'<\/span> <span class=\"hljs-attr\">name<\/span>=<span class=\"hljs-string\">'video'<\/span> <span class=\"hljs-attr\">accept<\/span>=<span class=\"hljs-string\">'video\/*'<\/span> <span class=\"hljs-attr\">required<\/span> \/&gt;<\/span>\n\n\u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 <span class=\"hljs-tag\">&lt;\/<span class=\"hljs-name\">div<\/span>&gt;<\/span>\n\n\u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 <span class=\"hljs-tag\">&lt;<span class=\"hljs-name\">div<\/span> <span class=\"hljs-attr\">className<\/span>=<span class=\"hljs-string\">{styles&#91;<\/span>'<span class=\"hljs-attr\">form-group<\/span>']}&gt;<\/span>\n\n\u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 <span class=\"hljs-tag\">&lt;<span class=\"hljs-name\">label<\/span> <span class=\"hljs-attr\">htmlFor<\/span>=<span class=\"hljs-string\">'format'<\/span>&gt;<\/span>Formats:<span class=\"hljs-tag\">&lt;\/<span class=\"hljs-name\">label<\/span>&gt;<\/span>\n\n\u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 <span class=\"hljs-tag\">&lt;<span class=\"hljs-name\">select<\/span> <span class=\"hljs-attr\">name<\/span>=<span class=\"hljs-string\">'format'<\/span>&gt;<\/span>\n\n\u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 <span class=\"hljs-tag\">&lt;<span class=\"hljs-name\">option<\/span> <span class=\"hljs-attr\">value<\/span>=<span class=\"hljs-string\">'9:16'<\/span>&gt;<\/span>Instagram Reels<span class=\"hljs-tag\">&lt;\/<span class=\"hljs-name\">option<\/span>&gt;<\/span>\n\n\u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 <span class=\"hljs-tag\">&lt;<span class=\"hljs-name\">option<\/span> <span class=\"hljs-attr\">value<\/span>=<span class=\"hljs-string\">'1:1'<\/span>&gt;<\/span>Instagram Feed<span class=\"hljs-tag\">&lt;\/<span class=\"hljs-name\">option<\/span>&gt;<\/span>\n\n\u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 <span class=\"hljs-tag\">&lt;<span class=\"hljs-name\">option<\/span> <span class=\"hljs-attr\">value<\/span>=<span class=\"hljs-string\">'9:16'<\/span>&gt;<\/span>TikTok<span class=\"hljs-tag\">&lt;\/<span class=\"hljs-name\">option<\/span>&gt;<\/span>\n\n\u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 <span class=\"hljs-tag\">&lt;<span class=\"hljs-name\">option<\/span> <span class=\"hljs-attr\">value<\/span>=<span class=\"hljs-string\">'9:16'<\/span>&gt;<\/span>YouTube Shorts<span class=\"hljs-tag\">&lt;\/<span class=\"hljs-name\">option<\/span>&gt;<\/span>\n\n\u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 <span class=\"hljs-tag\">&lt;<span class=\"hljs-name\">option<\/span> <span class=\"hljs-attr\">value<\/span>=<span class=\"hljs-string\">'16:9'<\/span>&gt;<\/span>YouTube Standard<span class=\"hljs-tag\">&lt;\/<span class=\"hljs-name\">option<\/span>&gt;<\/span>\n\n\u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 <span class=\"hljs-tag\">&lt;<span class=\"hljs-name\">option<\/span> <span class=\"hljs-attr\">value<\/span>=<span class=\"hljs-string\">'9:16'<\/span>&gt;<\/span>Facebook Stories<span class=\"hljs-tag\">&lt;\/<span class=\"hljs-name\">option<\/span>&gt;<\/span>\n\n\u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 <span class=\"hljs-tag\">&lt;<span class=\"hljs-name\">option<\/span> <span class=\"hljs-attr\">value<\/span>=<span class=\"hljs-string\">'1:1'<\/span>&gt;<\/span>Facebook Feed<span class=\"hljs-tag\">&lt;\/<span class=\"hljs-name\">option<\/span>&gt;<\/span>\n\n\u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 <span class=\"hljs-tag\">&lt;<span class=\"hljs-name\">option<\/span> <span class=\"hljs-attr\">value<\/span>=<span class=\"hljs-string\">'9:16'<\/span>&gt;<\/span>Snapchat<span class=\"hljs-tag\">&lt;\/<span class=\"hljs-name\">option<\/span>&gt;<\/span>\n\n\u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 <span class=\"hljs-tag\">&lt;<span class=\"hljs-name\">option<\/span> <span class=\"hljs-attr\">value<\/span>=<span class=\"hljs-string\">'1:1'<\/span>&gt;<\/span>Twitter\/X<span class=\"hljs-tag\">&lt;\/<span class=\"hljs-name\">option<\/span>&gt;<\/span>\n\n\u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 <span class=\"hljs-tag\">&lt;<span class=\"hljs-name\">option<\/span> <span class=\"hljs-attr\">value<\/span>=<span class=\"hljs-string\">'1:1'<\/span>&gt;<\/span>LinkedIn<span class=\"hljs-tag\">&lt;\/<span class=\"hljs-name\">option<\/span>&gt;<\/span>\n\n\u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 <span class=\"hljs-tag\">&lt;\/<span class=\"hljs-name\">select<\/span>&gt;<\/span>\n\n\u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 <span class=\"hljs-tag\">&lt;\/<span class=\"hljs-name\">div<\/span>&gt;<\/span>\n\n\u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 <span class=\"hljs-tag\">&lt;<span class=\"hljs-name\">SubmitButton<\/span> \/&gt;<\/span>\n\n\u00a0 \u00a0 \u00a0 \u00a0 \u00a0 <span class=\"hljs-tag\">&lt;\/<span class=\"hljs-name\">form<\/span>&gt;<\/span>\n\n\u00a0 \u00a0 \u00a0 \u00a0 <span class=\"hljs-tag\">&lt;\/<span class=\"hljs-name\">div<\/span>&gt;<\/span>\n\n\u00a0 \u00a0 \u00a0 <span class=\"hljs-tag\">&lt;\/<span class=\"hljs-name\">main<\/span>&gt;<\/span>\n\n\u00a0 \u00a0 <span class=\"hljs-tag\">&lt;\/<span class=\"hljs-name\">div<\/span>&gt;<\/span><\/span>\n\n\u00a0 );\n\n}<\/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<p>The code above sets up the upload form with the various video platforms and their aspect ratios.<\/p>\n\n\n\n<p>To implement the submit button component, create a new file in the app folder called <code>submit-button.tsx<\/code> and paste the code below in it. The button component acts as the submit button and also the loading indicator. When you submit the form, the loader shows, indicating that the file is uploading and processing on Cloudinary.<\/p>\n\n\n<pre class=\"wp-block-code\" aria-describedby=\"shcb-language-7\" data-shcb-language-name=\"JavaScript\" data-shcb-language-slug=\"javascript\"><span><code class=\"hljs language-javascript shcb-wrap-lines\"><span class=\"hljs-comment\">\/\/ src\/app\/submit-button.tsx<\/span>\n\n<span class=\"hljs-string\">'use client'<\/span>;\n\n<span class=\"hljs-keyword\">import<\/span> { useFormStatus } <span class=\"hljs-keyword\">from<\/span> <span class=\"hljs-string\">'react-dom'<\/span>;\n\n<span class=\"hljs-keyword\">import<\/span> styles <span class=\"hljs-keyword\">from<\/span> <span class=\"hljs-string\">'.\/page.module.css'<\/span>;\n\n<span class=\"hljs-keyword\">export<\/span> <span class=\"hljs-function\"><span class=\"hljs-keyword\">function<\/span> <span class=\"hljs-title\">SubmitButton<\/span>(<span class=\"hljs-params\"><\/span>) <\/span>{\n\n\u00a0 <span class=\"hljs-keyword\">const<\/span> { pending } = useFormStatus();\n\n\u00a0 <span class=\"hljs-keyword\">return<\/span> (\n\n\u00a0 \u00a0 <span class=\"xml\"><span class=\"hljs-tag\">&lt;&gt;<\/span>\n\n\u00a0 \u00a0 \u00a0 {!pending ? (\n\n\u00a0 \u00a0 \u00a0 \u00a0 <span class=\"hljs-tag\">&lt;<span class=\"hljs-name\">button<\/span> <span class=\"hljs-attr\">type<\/span>=<span class=\"hljs-string\">'submit'<\/span> <span class=\"hljs-attr\">className<\/span>=<span class=\"hljs-string\">{styles&#91;<\/span>'<span class=\"hljs-attr\">submit-button<\/span>']}&gt;<\/span>\n\n\u00a0 \u00a0 \u00a0 \u00a0 \u00a0 Upload Video!\n\n\u00a0 \u00a0 \u00a0 \u00a0 <span class=\"hljs-tag\">&lt;\/<span class=\"hljs-name\">button<\/span>&gt;<\/span>\n\n\u00a0 \u00a0 \u00a0 ) : (\n\n\u00a0 \u00a0 \u00a0 \u00a0 <span class=\"hljs-tag\">&lt;<span class=\"hljs-name\">button<\/span> <span class=\"hljs-attr\">className<\/span>=<span class=\"hljs-string\">{styles&#91;<\/span>'<span class=\"hljs-attr\">submit-button<\/span>']}&gt;<\/span>\n\n\u00a0 \u00a0 \u00a0 \u00a0 \u00a0 Uploading and Processing your video{' '}\n\n\u00a0 \u00a0 \u00a0 \u00a0 \u00a0 <span class=\"hljs-tag\">&lt;<span class=\"hljs-name\">svg<\/span>\n\n\u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 <span class=\"hljs-attr\">xmlns<\/span>=<span class=\"hljs-string\">'http:\/\/www.w3.org\/2000\/svg'<\/span>\n\n\u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 <span class=\"hljs-attr\">width<\/span>=<span class=\"hljs-string\">'1em'<\/span>\n\n\u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 <span class=\"hljs-attr\">height<\/span>=<span class=\"hljs-string\">'1em'<\/span>\n\n\u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 <span class=\"hljs-attr\">viewBox<\/span>=<span class=\"hljs-string\">'0 0 24 24'<\/span>\n\n\u00a0 \u00a0 \u00a0 \u00a0 \u00a0 &gt;<\/span>\n\n\u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 <span class=\"hljs-tag\">&lt;<span class=\"hljs-name\">circle<\/span> <span class=\"hljs-attr\">cx<\/span>=<span class=\"hljs-string\">{4}<\/span> <span class=\"hljs-attr\">cy<\/span>=<span class=\"hljs-string\">{12}<\/span> <span class=\"hljs-attr\">r<\/span>=<span class=\"hljs-string\">{3}<\/span> <span class=\"hljs-attr\">fill<\/span>=<span class=\"hljs-string\">'currentColor'<\/span>&gt;<\/span>\n\n\u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 <span class=\"hljs-tag\">&lt;<span class=\"hljs-name\">animate<\/span>\n\n\u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 <span class=\"hljs-attr\">id<\/span>=<span class=\"hljs-string\">'svgSpinners3DotsBounce0'<\/span>\n\n\u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 <span class=\"hljs-attr\">attributeName<\/span>=<span class=\"hljs-string\">'cy'<\/span>\n\n\u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 <span class=\"hljs-attr\">begin<\/span>=<span class=\"hljs-string\">'0;svgSpinners3DotsBounce1.end+0.25s'<\/span>\n\n\u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 <span class=\"hljs-attr\">calcMode<\/span>=<span class=\"hljs-string\">'spline'<\/span>\n\n\u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 <span class=\"hljs-attr\">dur<\/span>=<span class=\"hljs-string\">'0.6s'<\/span>\n\n\u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 <span class=\"hljs-attr\">keySplines<\/span>=<span class=\"hljs-string\">'.33,.66,.66,1;.33,0,.66,.33'<\/span>\n\n\u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 <span class=\"hljs-attr\">values<\/span>=<span class=\"hljs-string\">'12;6;12'<\/span>\n\n\u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 &gt;<\/span><span class=\"hljs-tag\">&lt;\/<span class=\"hljs-name\">animate<\/span>&gt;<\/span>\n\n\u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 <span class=\"hljs-tag\">&lt;\/<span class=\"hljs-name\">circle<\/span>&gt;<\/span>\n\n\u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 <span class=\"hljs-tag\">&lt;<span class=\"hljs-name\">circle<\/span> <span class=\"hljs-attr\">cx<\/span>=<span class=\"hljs-string\">{12}<\/span> <span class=\"hljs-attr\">cy<\/span>=<span class=\"hljs-string\">{12}<\/span> <span class=\"hljs-attr\">r<\/span>=<span class=\"hljs-string\">{3}<\/span> <span class=\"hljs-attr\">fill<\/span>=<span class=\"hljs-string\">'currentColor'<\/span>&gt;<\/span>\n\n\u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 <span class=\"hljs-tag\">&lt;<span class=\"hljs-name\">animate<\/span>\n\n\u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 <span class=\"hljs-attr\">attributeName<\/span>=<span class=\"hljs-string\">'cy'<\/span>\n\n\u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 <span class=\"hljs-attr\">begin<\/span>=<span class=\"hljs-string\">'svgSpinners3DotsBounce0.begin+0.1s'<\/span>\n\n\u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 <span class=\"hljs-attr\">calcMode<\/span>=<span class=\"hljs-string\">'spline'<\/span>\n\n\u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 <span class=\"hljs-attr\">dur<\/span>=<span class=\"hljs-string\">'0.6s'<\/span>\n\n\u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 <span class=\"hljs-attr\">keySplines<\/span>=<span class=\"hljs-string\">'.33,.66,.66,1;.33,0,.66,.33'<\/span>\n\n\u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 <span class=\"hljs-attr\">values<\/span>=<span class=\"hljs-string\">'12;6;12'<\/span>\n\n\u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 &gt;<\/span><span class=\"hljs-tag\">&lt;\/<span class=\"hljs-name\">animate<\/span>&gt;<\/span>\n\n\u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 <span class=\"hljs-tag\">&lt;\/<span class=\"hljs-name\">circle<\/span>&gt;<\/span>\n\n\u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 <span class=\"hljs-tag\">&lt;<span class=\"hljs-name\">circle<\/span> <span class=\"hljs-attr\">cx<\/span>=<span class=\"hljs-string\">{20}<\/span> <span class=\"hljs-attr\">cy<\/span>=<span class=\"hljs-string\">{12}<\/span> <span class=\"hljs-attr\">r<\/span>=<span class=\"hljs-string\">{3}<\/span> <span class=\"hljs-attr\">fill<\/span>=<span class=\"hljs-string\">'currentColor'<\/span>&gt;<\/span>\n\n\u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 <span class=\"hljs-tag\">&lt;<span class=\"hljs-name\">animate<\/span>\n\n\u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 <span class=\"hljs-attr\">id<\/span>=<span class=\"hljs-string\">'svgSpinners3DotsBounce1'<\/span>\n\n\u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 <span class=\"hljs-attr\">attributeName<\/span>=<span class=\"hljs-string\">'cy'<\/span>\n\n\u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 <span class=\"hljs-attr\">begin<\/span>=<span class=\"hljs-string\">'svgSpinners3DotsBounce0.begin+0.2s'<\/span>\n\n\u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 <span class=\"hljs-attr\">calcMode<\/span>=<span class=\"hljs-string\">'spline'<\/span>\n\n\u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 <span class=\"hljs-attr\">dur<\/span>=<span class=\"hljs-string\">'0.6s'<\/span>\n\n\u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 <span class=\"hljs-attr\">keySplines<\/span>=<span class=\"hljs-string\">'.33,.66,.66,1;.33,0,.66,.33'<\/span>\n\n\u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 <span class=\"hljs-attr\">values<\/span>=<span class=\"hljs-string\">'12;6;12'<\/span>\n\n\u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 &gt;<\/span><span class=\"hljs-tag\">&lt;\/<span class=\"hljs-name\">animate<\/span>&gt;<\/span>\n\n\u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 <span class=\"hljs-tag\">&lt;\/<span class=\"hljs-name\">circle<\/span>&gt;<\/span>\n\n\u00a0 \u00a0 \u00a0 \u00a0 \u00a0 <span class=\"hljs-tag\">&lt;\/<span class=\"hljs-name\">svg<\/span>&gt;<\/span>\n\n\u00a0 \u00a0 \u00a0 \u00a0 <span class=\"hljs-tag\">&lt;\/<span class=\"hljs-name\">button<\/span>&gt;<\/span>\n\n\u00a0 \u00a0 \u00a0 )}\n\n\u00a0 \u00a0 <span class=\"hljs-tag\">&lt;\/&gt;<\/span><\/span>\n\n\u00a0 );\n\n}<\/code><\/span><small class=\"shcb-language\" id=\"shcb-language-7\"><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<p>In the file above, the use client derivative at the top of the file indicates that this is a client component, and it gives you access to client-side hooks like useFormStatus which is used to get the status of the form.<\/p>\n\n\n\n<h2 class=\"wp-block-heading\">Get Form Data<\/h2>\n\n\n\n<p>In the page.tsx file, add these import statements below the already imported statements.<\/p>\n\n\n<pre class=\"wp-block-code\" aria-describedby=\"shcb-language-8\" data-shcb-language-name=\"JavaScript\" data-shcb-language-slug=\"javascript\"><span><code class=\"hljs language-javascript shcb-wrap-lines\">...\n\nimport { redirect } <span class=\"hljs-keyword\">from<\/span> <span class=\"hljs-string\">'next\/navigation'<\/span>;\n\n<span class=\"hljs-keyword\">import<\/span> { UploadApiResponse } <span class=\"hljs-keyword\">from<\/span> <span class=\"hljs-string\">'cloudinary'<\/span>;<\/code><\/span><small class=\"shcb-language\" id=\"shcb-language-8\"><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<p>To get the data from the form, add the use server directive to the top of the handleSubmit function; this signals to Next.js that the enclosed code is meant to run on the server and it prevents the function from being exposed to the client, enhancing security and performance.&nbsp;<\/p>\n\n\n\n<p>Still in the <code>handleSubmit<\/code> function, retrieve the video file from the form data and cast it as a <code>File<\/code> object. Also, you\u2019ll get the <code>format<\/code> from the form, casting it as a string. After this, you\u2019ll need to convert the video file into a binary <code>Buffer<\/code> by reading the file&#8217;s content as an <code>ArrayBuffer<\/code> and then converting this <code>Buffer<\/code> into a <code>Buffer<\/code> object using <code>Buffer.from()<\/code>. This conversion is necessary for handling the binary data of the video file on the server.\u00a0<\/p>\n\n\n\n<p>Finally, initialize an empty string variable <code>url<\/code>, which will store the URL of the processed video.<\/p>\n\n\n<pre class=\"wp-block-code\" aria-describedby=\"shcb-language-9\" data-shcb-language-name=\"JavaScript\" data-shcb-language-slug=\"javascript\"><span><code class=\"hljs language-javascript shcb-wrap-lines\"><span class=\"hljs-comment\">\/\/ src\/app\/page.tsx<\/span>\n\n<span class=\"hljs-string\">'use server'<\/span>;\n\n<span class=\"hljs-keyword\">const<\/span> file = formData.get(<span class=\"hljs-string\">'video'<\/span>) <span class=\"hljs-keyword\">as<\/span> File;\n\n<span class=\"hljs-keyword\">const<\/span> aspect_ratio = formData.get(<span class=\"hljs-string\">'format'<\/span>) <span class=\"hljs-keyword\">as<\/span> string;\n\n<span class=\"hljs-keyword\">const<\/span> buffer: Buffer = Buffer.from(<span class=\"hljs-keyword\">await<\/span> file.arrayBuffer());\n\n<span class=\"hljs-keyword\">let<\/span> url: string = <span class=\"hljs-string\">''<\/span>;<\/code><\/span><small class=\"shcb-language\" id=\"shcb-language-9\"><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<h2 class=\"wp-block-heading\">Upload and Process the Video<\/h2>\n\n\n\n<p>The next step is to upload the video file from the form data to Cloudinary, crop it to the specified aspect ratio, and then redirect the app to the processed video URL. The process will be done within a <code>try-catch<\/code> block in the <code>handleSubmitfunction<\/code>, which ensures that any errors during the upload process are caught and logged for debugging purposes.<\/p>\n\n\n<pre class=\"wp-block-code\" aria-describedby=\"shcb-language-10\" data-shcb-language-name=\"JavaScript\" data-shcb-language-slug=\"javascript\"><span><code class=\"hljs language-javascript shcb-wrap-lines\"><span class=\"hljs-comment\">\/\/src\/app\/page.tsx<\/span>\n\n....\n\ntry {\n\n\u00a0 <span class=\"hljs-keyword\">const<\/span> base64Image: string = <span class=\"hljs-string\">`data:<span class=\"hljs-subst\">${file.type}<\/span>;base64,<span class=\"hljs-subst\">${buffer.toString(\n\n\u00a0 \u00a0 <span class=\"hljs-string\">'base64'<\/span>\n\n\u00a0 )}<\/span>`<\/span>;\n\n\u00a0 <span class=\"hljs-keyword\">const<\/span> uploadResult: UploadApiResponse = <span class=\"hljs-keyword\">await<\/span> cloudinary.uploader.upload(\n\n\u00a0 \u00a0 base64Image,\n\n\u00a0 \u00a0 {\n\n\u00a0 \u00a0 \u00a0 \u00a0 <span class=\"hljs-attr\">resource_type<\/span>: <span class=\"hljs-string\">'video'<\/span>,\n\n\u00a0 \u00a0 \u00a0 \u00a0 <span class=\"hljs-attr\">transformation<\/span>: &#91;{ aspect_ratio, <span class=\"hljs-attr\">crop<\/span>: <span class=\"hljs-string\">'fill'<\/span> }],\n\n\u00a0 \u00a0 \u00a0 \u00a0 <span class=\"hljs-attr\">public_id<\/span>: <span class=\"hljs-string\">`videos\/<span class=\"hljs-subst\">${<span class=\"hljs-built_in\">Date<\/span>.now()}<\/span>`<\/span>,\n\n\u00a0 \u00a0 }\n\n\u00a0 );\n\n\u00a0 url = uploadResult.secure_url;\n\n\u00a0} <span class=\"hljs-keyword\">catch<\/span> (error: any) {\n\n\u00a0 <span class=\"hljs-built_in\">console<\/span>.error(error);\n\n}\n\nredirect(url);<\/code><\/span><small class=\"shcb-language\" id=\"shcb-language-10\"><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<p>The video file is first converted from a Buffer into a Base64-encoded string because this is what the Cloudinary uploader method expects, using the video&#8217;s MIME (Multipurpose Internet Mail Extensions) type and binary data via <code>Buffer.toString('base64')<\/code>, and prefixed with a data URI (Uniform Resource Identifier) scheme to create a valid Base64 string. This string is then uploaded to Cloudinary using the <code>cloudinary.uploader.upload<\/code> method, with the <code>resource_type<\/code> option set to &#8220;video&#8221; to ensure proper handling of the video file.<\/p>\n\n\n\n<p>The transformation option is where the actual transformation of the video is done. The video is cropped to the aspect ratio retrieved from the form and a unique identifier is generated using the current timestamp to ensure that each uploaded video is unique and it is set to the <code>public_id<\/code><strong>.<\/strong><\/p>\n\n\n\n<p>After the video is successfully uploaded and processed, the result returned by Cloudinary (<code>uploadResult<\/code>) includes the secure URL (<code>uploadResult.secure_url<\/code>) pointing to the uploaded video which is stored in the <code>url<\/code> variable.\u00a0<\/p>\n\n\n\n<p>If errors occur during this process, they\u2019re caught in the catch block and logged to the console. Learn more about <a target=\"_blank\" href=\"https:\/\/cloudinary.com\/documentation\/upload_images\" rel=\"noreferrer noopener\">Cloudinary asset upload<\/a> in the documentation.<\/p>\n\n\n\n<p>Finally, the app is redirected to the uploaded video&#8217;s URL using the redirect (<code>url<\/code>) function.<\/p>\n\n\n\n<h2 class=\"wp-block-heading\">Final Code Snippet<\/h2>\n\n\n\n<p>Your final code for the upload and process functionality in <code>page.tsx<\/code> file should look like this:<\/p>\n\n\n<pre class=\"wp-block-code\" aria-describedby=\"shcb-language-11\" data-shcb-language-name=\"JavaScript\" data-shcb-language-slug=\"javascript\"><span><code class=\"hljs language-javascript shcb-wrap-lines\"><span class=\"hljs-comment\">\/\/src\/app\/page.tsx<\/span>\n\n<span class=\"hljs-keyword\">import<\/span> styles <span class=\"hljs-keyword\">from<\/span> <span class=\"hljs-string\">'.\/page.module.css'<\/span>;\n\n<span class=\"hljs-keyword\">import<\/span> { UploadApiResponse } <span class=\"hljs-keyword\">from<\/span> <span class=\"hljs-string\">'cloudinary'<\/span>;\n\n<span class=\"hljs-keyword\">import<\/span> cloudinary <span class=\"hljs-keyword\">from<\/span> <span class=\"hljs-string\">'@\/lib\/cloudinary'<\/span>;\n\n<span class=\"hljs-keyword\">import<\/span> { redirect } <span class=\"hljs-keyword\">from<\/span> <span class=\"hljs-string\">'next\/navigation'<\/span>;\n\n<span class=\"hljs-keyword\">import<\/span> { SubmitButton } <span class=\"hljs-keyword\">from<\/span> <span class=\"hljs-string\">'.\/submit-button'<\/span>;\n\n<span class=\"hljs-keyword\">export<\/span> <span class=\"hljs-keyword\">default<\/span> <span class=\"hljs-function\"><span class=\"hljs-keyword\">function<\/span> <span class=\"hljs-title\">Home<\/span>(<span class=\"hljs-params\"><\/span>) <\/span>{\n\n\u00a0 <span class=\"hljs-keyword\">const<\/span> handleSubmit = <span class=\"hljs-keyword\">async<\/span> (formData: FormData) =&gt; {\n\n\u00a0 \u00a0 <span class=\"hljs-string\">'use server'<\/span>;\n\n\u00a0 \u00a0 <span class=\"hljs-keyword\">const<\/span> file = formData.get(<span class=\"hljs-string\">'video'<\/span>) <span class=\"hljs-keyword\">as<\/span> File;\n\n\u00a0 \u00a0 <span class=\"hljs-keyword\">const<\/span> aspect_ratio = formData.get(<span class=\"hljs-string\">'format'<\/span>) <span class=\"hljs-keyword\">as<\/span> string;\n\n\u00a0 \u00a0 <span class=\"hljs-keyword\">const<\/span> buffer: Buffer = Buffer.from(<span class=\"hljs-keyword\">await<\/span> file.arrayBuffer());\n\n\u00a0 \u00a0 <span class=\"hljs-keyword\">let<\/span> url: string = <span class=\"hljs-string\">''<\/span>;\n\n\u00a0 \u00a0 <span class=\"hljs-keyword\">try<\/span> {\n\n\u00a0 \u00a0 \u00a0 <span class=\"hljs-keyword\">const<\/span> base64Image: string = <span class=\"hljs-string\">`data:<span class=\"hljs-subst\">${file.type}<\/span>;base64,<span class=\"hljs-subst\">${buffer.toString(\n\n\u00a0 \u00a0 \u00a0 \u00a0 <span class=\"hljs-string\">'base64'<\/span>\n\n\u00a0 \u00a0 \u00a0 )}<\/span>`<\/span>;\n\n\u00a0 \u00a0 \u00a0 <span class=\"hljs-keyword\">const<\/span> uploadResult: UploadApiResponse = <span class=\"hljs-keyword\">await<\/span> cloudinary.uploader.upload(\n\n\u00a0 \u00a0 \u00a0 \u00a0 base64Image,\n\n\u00a0 \u00a0 \u00a0 \u00a0 {\n\n\u00a0 \u00a0 \u00a0 \u00a0 \u00a0 <span class=\"hljs-attr\">resource_type<\/span>: <span class=\"hljs-string\">'video'<\/span>,\n\n\u00a0 \u00a0 \u00a0 \u00a0 \u00a0 <span class=\"hljs-attr\">transformation<\/span>: &#91;{ aspect_ratio, <span class=\"hljs-attr\">crop<\/span>: <span class=\"hljs-string\">'fill'<\/span> }],\n\n\u00a0 \u00a0 \u00a0 \u00a0 \u00a0 <span class=\"hljs-attr\">public_id<\/span>: <span class=\"hljs-string\">`videos\/<span class=\"hljs-subst\">${<span class=\"hljs-built_in\">Date<\/span>.now()}<\/span>`<\/span>,\n\n\u00a0 \u00a0 \u00a0 \u00a0 }\n\n\u00a0 \u00a0 \u00a0 );\n\n\u00a0 \u00a0 \u00a0 url = uploadResult.secure_url;\n\n\u00a0 \u00a0 } <span class=\"hljs-keyword\">catch<\/span> (error: any) {\n\n\u00a0 \u00a0 \u00a0 <span class=\"hljs-built_in\">console<\/span>.error(error);\n\n\u00a0 \u00a0 }\n\n\u00a0 \u00a0 redirect(url);\n\n\u00a0 };\n\n\u00a0 <span class=\"hljs-keyword\">return<\/span> (\n\n\u00a0 \u00a0...\n\n\u00a0 );\n\n}<\/code><\/span><small class=\"shcb-language\" id=\"shcb-language-11\"><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<h1 class=\"wp-block-heading\">The Final Result<\/h1>\n\n\n\n<p>When you run the application, you can select a video to upload and choose from a list of aspect ratios to crop the video. The video is then sent to Cloudinary, and the transformation is done. Once that\u2019s completed, your app will redirect to the transformed video as shown in the demo below.<\/p>\n\n\n<cld-video-player\n      cloud-name='cloudinary-marketing'\n      public-id='v1734464648\/Cloudinary_Video_Resizer_App'\n      js-config='{\"playbackRates\":[0.5,1,1.5,2]}'\n      style='max-width: ;'\n      class='c-video-player'\n      poster-timestamp='4'\n      core-version='2.12.3'\n      player-version='1.7.0'\n      >\n      <video\n        id='_video-player69d4917cc85e1'\n        data-cld-big-play-button='init'\n        data-cld-source-types='[\"hls\",\"webm\\\/vp9\",\"mp4\\\/h265\",\"mp4\"]'\n        controls\n        muted\n        class='cld-video-player cld-fluid wp-block-cloudinary-video-player  cld-video-player-skin-dark'\n      ><\/video>\n    <\/cld-video-player>\n\n\n<h1 class=\"wp-block-heading\">Conclusion<\/h1>\n\n\n\n<p>In this blog post, you learned how to use Next.js and the powerful media tools provided by Cloudinary to build a simple video transformation app. The <a target=\"_blank\" href=\"https:\/\/cloudinary.com\/documentation\/video_manipulation_and_delivery\" rel=\"noreferrer noopener\">Cloudinary video management library<\/a> is an incredible resource for even more video transformations.&nbsp;<\/p>\n\n\n\n<p>Try extending this app to support more aspect ratios and gain access to even more enhancements with <a target=\"_blank\" href=\"https:\/\/cloudinary.com\/video_api\" rel=\"noreferrer noopener\">Cloudinary\u2019s video solution<\/a>. You can also explore reusing the same video with on-the-fly aspect ratio transformations for multiple social media platforms.<\/p>\n\n\n\n<p>If you enjoyed this post and want to discuss it in more detail, join the <a target=\"_blank\" href=\"https:\/\/community.cloudinary.com\/\" rel=\"noreferrer noopener\">Cloudinary Community forum<\/a> and its associated <a target=\"_blank\" href=\"https:\/\/discord.com\/invite\/cloudinary\" rel=\"noreferrer noopener\">Discord<\/a>.<\/p>\n\n\n\n<h1 class=\"wp-block-heading\">Resources<\/h1>\n\n\n\n<ul class=\"wp-block-list\">\n<li><a href=\"https:\/\/cloudinary.com\/documentation\/programmable_media_overview\" target=\"_blank\" rel=\"noreferrer noopener\">Cloudinary Overall Media Documentation<\/a><\/li>\n\n\n\n<li><a href=\"https:\/\/nextjs.org\/docs\" target=\"_blank\" rel=\"noreferrer noopener\">Next.js Documentation<\/a><\/li>\n<\/ul>\n","protected":false},"excerpt":{"rendered":"<p>In recent years, video publishing has progressed rapidly, with new platforms and tools constantly being introduced. According to an article by Statista, the number of digital video viewers worldwide is more than 3.3 billion. This shift has made sharing video content simpler than ever; however, creating and managing videos across these platforms still requires editing [&hellip;]<\/p>\n","protected":false},"author":87,"featured_media":36467,"comment_status":"closed","ping_status":"open","sticky":false,"template":"","format":"standard","meta":{"_acf_changed":false,"_cloudinary_featured_overwrite":false,"footnotes":""},"categories":[1],"tags":[212,303,304],"class_list":["post-36464","post","type-post","status-publish","format-standard","has-post-thumbnail","hentry","category-uncategorized","tag-next-js","tag-video","tag-video-transformation"],"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 Resize Videos for Social Media in Next.js<\/title>\n<meta name=\"description\" content=\"Learn how to build a video resizing app using Next.js and Cloudinary to adjust video dimensions for Instagram, YouTube, and more in this detailed guide.\" \/>\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\/resize-videos-social-media-next-js\" \/>\n<meta property=\"og:locale\" content=\"en_US\" \/>\n<meta property=\"og:type\" content=\"article\" \/>\n<meta property=\"og:title\" content=\"How to Resize Videos for Social Media in Next.js\" \/>\n<meta property=\"og:description\" content=\"Learn how to build a video resizing app using Next.js and Cloudinary to adjust video dimensions for Instagram, YouTube, and more in this detailed guide.\" \/>\n<meta property=\"og:url\" content=\"https:\/\/cloudinary.com\/blog\/resize-videos-social-media-next-js\" \/>\n<meta property=\"og:site_name\" content=\"Cloudinary Blog\" \/>\n<meta property=\"article:published_time\" content=\"2024-12-16T15:00:00+00:00\" \/>\n<meta property=\"article:modified_time\" content=\"2024-12-17T19:49:37+00:00\" \/>\n<meta property=\"og:image\" content=\"https:\/\/res.cloudinary.com\/cloudinary-marketing\/images\/v1734026266\/How_to_Resize_Videos_for_Social_Media_in_NextJS\/How_to_Resize_Videos_for_Social_Media_in_NextJS-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=\"melindapham\" \/>\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\/resize-videos-social-media-next-js#article\",\"isPartOf\":{\"@id\":\"https:\/\/cloudinary.com\/blog\/resize-videos-social-media-next-js\"},\"author\":{\"name\":\"melindapham\",\"@id\":\"https:\/\/cloudinary.com\/blog\/#\/schema\/person\/0d5ad601e4c3b5be89245dfb14be42d9\"},\"headline\":\"How to Resize Videos for Social Media in Next.js\",\"datePublished\":\"2024-12-16T15:00:00+00:00\",\"dateModified\":\"2024-12-17T19:49:37+00:00\",\"mainEntityOfPage\":{\"@id\":\"https:\/\/cloudinary.com\/blog\/resize-videos-social-media-next-js\"},\"wordCount\":1175,\"publisher\":{\"@id\":\"https:\/\/cloudinary.com\/blog\/#organization\"},\"image\":{\"@id\":\"https:\/\/cloudinary.com\/blog\/resize-videos-social-media-next-js#primaryimage\"},\"thumbnailUrl\":\"https:\/\/res.cloudinary.com\/cloudinary-marketing\/images\/f_auto,q_auto\/v1734026266\/How_to_Resize_Videos_for_Social_Media_in_NextJS\/How_to_Resize_Videos_for_Social_Media_in_NextJS.jpg?_i=AA\",\"keywords\":[\"Next.js\",\"Video\",\"Video Transformation\"],\"inLanguage\":\"en-US\",\"copyrightYear\":\"2024\",\"copyrightHolder\":{\"@id\":\"https:\/\/cloudinary.com\/#organization\"}},{\"@type\":\"WebPage\",\"@id\":\"https:\/\/cloudinary.com\/blog\/resize-videos-social-media-next-js\",\"url\":\"https:\/\/cloudinary.com\/blog\/resize-videos-social-media-next-js\",\"name\":\"How to Resize Videos for Social Media in Next.js\",\"isPartOf\":{\"@id\":\"https:\/\/cloudinary.com\/blog\/#website\"},\"primaryImageOfPage\":{\"@id\":\"https:\/\/cloudinary.com\/blog\/resize-videos-social-media-next-js#primaryimage\"},\"image\":{\"@id\":\"https:\/\/cloudinary.com\/blog\/resize-videos-social-media-next-js#primaryimage\"},\"thumbnailUrl\":\"https:\/\/res.cloudinary.com\/cloudinary-marketing\/images\/f_auto,q_auto\/v1734026266\/How_to_Resize_Videos_for_Social_Media_in_NextJS\/How_to_Resize_Videos_for_Social_Media_in_NextJS.jpg?_i=AA\",\"datePublished\":\"2024-12-16T15:00:00+00:00\",\"dateModified\":\"2024-12-17T19:49:37+00:00\",\"description\":\"Learn how to build a video resizing app using Next.js and Cloudinary to adjust video dimensions for Instagram, YouTube, and more in this detailed guide.\",\"breadcrumb\":{\"@id\":\"https:\/\/cloudinary.com\/blog\/resize-videos-social-media-next-js#breadcrumb\"},\"inLanguage\":\"en-US\",\"potentialAction\":[{\"@type\":\"ReadAction\",\"target\":[\"https:\/\/cloudinary.com\/blog\/resize-videos-social-media-next-js\"]}]},{\"@type\":\"ImageObject\",\"inLanguage\":\"en-US\",\"@id\":\"https:\/\/cloudinary.com\/blog\/resize-videos-social-media-next-js#primaryimage\",\"url\":\"https:\/\/res.cloudinary.com\/cloudinary-marketing\/images\/f_auto,q_auto\/v1734026266\/How_to_Resize_Videos_for_Social_Media_in_NextJS\/How_to_Resize_Videos_for_Social_Media_in_NextJS.jpg?_i=AA\",\"contentUrl\":\"https:\/\/res.cloudinary.com\/cloudinary-marketing\/images\/f_auto,q_auto\/v1734026266\/How_to_Resize_Videos_for_Social_Media_in_NextJS\/How_to_Resize_Videos_for_Social_Media_in_NextJS.jpg?_i=AA\",\"width\":2000,\"height\":1100},{\"@type\":\"BreadcrumbList\",\"@id\":\"https:\/\/cloudinary.com\/blog\/resize-videos-social-media-next-js#breadcrumb\",\"itemListElement\":[{\"@type\":\"ListItem\",\"position\":1,\"name\":\"Home\",\"item\":\"https:\/\/cloudinary.com\/blog\/\"},{\"@type\":\"ListItem\",\"position\":2,\"name\":\"How to Resize Videos for Social Media in Next.js\"}]},{\"@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\/0d5ad601e4c3b5be89245dfb14be42d9\",\"name\":\"melindapham\",\"image\":{\"@type\":\"ImageObject\",\"inLanguage\":\"en-US\",\"@id\":\"https:\/\/cloudinary.com\/blog\/#\/schema\/person\/image\/\",\"url\":\"https:\/\/secure.gravatar.com\/avatar\/e6f989fa97fe94be61596259d8629c3df65aec4c7da5c0000f90d810f313d4f4?s=96&d=mm&r=g\",\"contentUrl\":\"https:\/\/secure.gravatar.com\/avatar\/e6f989fa97fe94be61596259d8629c3df65aec4c7da5c0000f90d810f313d4f4?s=96&d=mm&r=g\",\"caption\":\"melindapham\"}}]}<\/script>\n<!-- \/ Yoast SEO Premium plugin. -->","yoast_head_json":{"title":"How to Resize Videos for Social Media in Next.js","description":"Learn how to build a video resizing app using Next.js and Cloudinary to adjust video dimensions for Instagram, YouTube, and more in this detailed guide.","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\/resize-videos-social-media-next-js","og_locale":"en_US","og_type":"article","og_title":"How to Resize Videos for Social Media in Next.js","og_description":"Learn how to build a video resizing app using Next.js and Cloudinary to adjust video dimensions for Instagram, YouTube, and more in this detailed guide.","og_url":"https:\/\/cloudinary.com\/blog\/resize-videos-social-media-next-js","og_site_name":"Cloudinary Blog","article_published_time":"2024-12-16T15:00:00+00:00","article_modified_time":"2024-12-17T19:49:37+00:00","og_image":[{"width":2000,"height":1100,"url":"https:\/\/res.cloudinary.com\/cloudinary-marketing\/images\/v1734026266\/How_to_Resize_Videos_for_Social_Media_in_NextJS\/How_to_Resize_Videos_for_Social_Media_in_NextJS-jpg?_i=AA","type":"image\/jpeg"}],"author":"melindapham","twitter_card":"summary_large_image","schema":{"@context":"https:\/\/schema.org","@graph":[{"@type":"NewsArticle","@id":"https:\/\/cloudinary.com\/blog\/resize-videos-social-media-next-js#article","isPartOf":{"@id":"https:\/\/cloudinary.com\/blog\/resize-videos-social-media-next-js"},"author":{"name":"melindapham","@id":"https:\/\/cloudinary.com\/blog\/#\/schema\/person\/0d5ad601e4c3b5be89245dfb14be42d9"},"headline":"How to Resize Videos for Social Media in Next.js","datePublished":"2024-12-16T15:00:00+00:00","dateModified":"2024-12-17T19:49:37+00:00","mainEntityOfPage":{"@id":"https:\/\/cloudinary.com\/blog\/resize-videos-social-media-next-js"},"wordCount":1175,"publisher":{"@id":"https:\/\/cloudinary.com\/blog\/#organization"},"image":{"@id":"https:\/\/cloudinary.com\/blog\/resize-videos-social-media-next-js#primaryimage"},"thumbnailUrl":"https:\/\/res.cloudinary.com\/cloudinary-marketing\/images\/f_auto,q_auto\/v1734026266\/How_to_Resize_Videos_for_Social_Media_in_NextJS\/How_to_Resize_Videos_for_Social_Media_in_NextJS.jpg?_i=AA","keywords":["Next.js","Video","Video Transformation"],"inLanguage":"en-US","copyrightYear":"2024","copyrightHolder":{"@id":"https:\/\/cloudinary.com\/#organization"}},{"@type":"WebPage","@id":"https:\/\/cloudinary.com\/blog\/resize-videos-social-media-next-js","url":"https:\/\/cloudinary.com\/blog\/resize-videos-social-media-next-js","name":"How to Resize Videos for Social Media in Next.js","isPartOf":{"@id":"https:\/\/cloudinary.com\/blog\/#website"},"primaryImageOfPage":{"@id":"https:\/\/cloudinary.com\/blog\/resize-videos-social-media-next-js#primaryimage"},"image":{"@id":"https:\/\/cloudinary.com\/blog\/resize-videos-social-media-next-js#primaryimage"},"thumbnailUrl":"https:\/\/res.cloudinary.com\/cloudinary-marketing\/images\/f_auto,q_auto\/v1734026266\/How_to_Resize_Videos_for_Social_Media_in_NextJS\/How_to_Resize_Videos_for_Social_Media_in_NextJS.jpg?_i=AA","datePublished":"2024-12-16T15:00:00+00:00","dateModified":"2024-12-17T19:49:37+00:00","description":"Learn how to build a video resizing app using Next.js and Cloudinary to adjust video dimensions for Instagram, YouTube, and more in this detailed guide.","breadcrumb":{"@id":"https:\/\/cloudinary.com\/blog\/resize-videos-social-media-next-js#breadcrumb"},"inLanguage":"en-US","potentialAction":[{"@type":"ReadAction","target":["https:\/\/cloudinary.com\/blog\/resize-videos-social-media-next-js"]}]},{"@type":"ImageObject","inLanguage":"en-US","@id":"https:\/\/cloudinary.com\/blog\/resize-videos-social-media-next-js#primaryimage","url":"https:\/\/res.cloudinary.com\/cloudinary-marketing\/images\/f_auto,q_auto\/v1734026266\/How_to_Resize_Videos_for_Social_Media_in_NextJS\/How_to_Resize_Videos_for_Social_Media_in_NextJS.jpg?_i=AA","contentUrl":"https:\/\/res.cloudinary.com\/cloudinary-marketing\/images\/f_auto,q_auto\/v1734026266\/How_to_Resize_Videos_for_Social_Media_in_NextJS\/How_to_Resize_Videos_for_Social_Media_in_NextJS.jpg?_i=AA","width":2000,"height":1100},{"@type":"BreadcrumbList","@id":"https:\/\/cloudinary.com\/blog\/resize-videos-social-media-next-js#breadcrumb","itemListElement":[{"@type":"ListItem","position":1,"name":"Home","item":"https:\/\/cloudinary.com\/blog\/"},{"@type":"ListItem","position":2,"name":"How to Resize Videos for Social Media in Next.js"}]},{"@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\/0d5ad601e4c3b5be89245dfb14be42d9","name":"melindapham","image":{"@type":"ImageObject","inLanguage":"en-US","@id":"https:\/\/cloudinary.com\/blog\/#\/schema\/person\/image\/","url":"https:\/\/secure.gravatar.com\/avatar\/e6f989fa97fe94be61596259d8629c3df65aec4c7da5c0000f90d810f313d4f4?s=96&d=mm&r=g","contentUrl":"https:\/\/secure.gravatar.com\/avatar\/e6f989fa97fe94be61596259d8629c3df65aec4c7da5c0000f90d810f313d4f4?s=96&d=mm&r=g","caption":"melindapham"}}]}},"jetpack_featured_media_url":"https:\/\/res.cloudinary.com\/cloudinary-marketing\/images\/f_auto,q_auto\/v1734026266\/How_to_Resize_Videos_for_Social_Media_in_NextJS\/How_to_Resize_Videos_for_Social_Media_in_NextJS.jpg?_i=AA","_links":{"self":[{"href":"https:\/\/cloudinary.com\/blog\/wp-json\/wp\/v2\/posts\/36464","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\/87"}],"replies":[{"embeddable":true,"href":"https:\/\/cloudinary.com\/blog\/wp-json\/wp\/v2\/comments?post=36464"}],"version-history":[{"count":2,"href":"https:\/\/cloudinary.com\/blog\/wp-json\/wp\/v2\/posts\/36464\/revisions"}],"predecessor-version":[{"id":36466,"href":"https:\/\/cloudinary.com\/blog\/wp-json\/wp\/v2\/posts\/36464\/revisions\/36466"}],"wp:featuredmedia":[{"embeddable":true,"href":"https:\/\/cloudinary.com\/blog\/wp-json\/wp\/v2\/media\/36467"}],"wp:attachment":[{"href":"https:\/\/cloudinary.com\/blog\/wp-json\/wp\/v2\/media?parent=36464"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/cloudinary.com\/blog\/wp-json\/wp\/v2\/categories?post=36464"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/cloudinary.com\/blog\/wp-json\/wp\/v2\/tags?post=36464"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}