Cloudinary Blog

Building a Live Feed of FIFA World Cup Moments

Capturing a Live Stream of FIFA World Cup Moments

Widely acclaimed as the world’s biggest sporting event, the World Cup has established itself as the most captivating tournament to look forward to across the globe. Dating back to 1930, when the first World Cup was hosted in Uruguay, it has always engendered numerous moments of excitement, not only for the participating teams but also for the countries they ably represented. Little could anyone have anticipated that a game of 22 able-bodied men running to take possession of a leather ball could become so famous.

This year’s World Cup is, as before, living up to expectations with countless surprising and enthralling moments. In fact, it’s been a rollercoaster of intense emotions as we’ve seen some of the football giant nations kicked out of the tournament.

If you are like me and love to savor some of the memorable moments from the 2018 FIFA World Cup, let me show you a few impressive Cloudinary features for capturing them. As a rule, professionally resizing and merging multiple videos, also adding songs as an overlay, would require access to sophisticated tools and a reasonable level of expertise on how to use them effectively. Not so with Cloudinary, which provisions for end-to-end video-management services geared toward compilation of videos in just a few simple steps without coding. I’ll walk you through them below. Also check out this interactive Twitter Tutorial thread I made!

Webinar
Delivering Compelling Video Experiences at Scale

Upload Videos

For easy access to your videos, upload them to Cloudinary and store the public ID of each of the videos.To access a video, type in the browser: https://res.cloudinary.com/YOURCLOUDNAME/video/upload/ID.mp4

Replace YOURCLOUDNAME and ID with the your cloud name and the video’s public ID on Cloudinary, respectively, as in this example:

Manipulate Videos

In Cloudinary, you can manipulate and thus transform videos directly from the URL by adding the required properties, for example:

Ruby:
Copy to clipboard
cl_video_tag("bade", :width=>600, :height=>300, :crop=>"fill")
PHP:
Copy to clipboard
cl_video_tag("bade", array("width"=>600, "height"=>300, "crop"=>"fill"))
Python:
Copy to clipboard
CloudinaryVideo("bade").video(width=600, height=300, crop="fill")
Node.js:
Copy to clipboard
cloudinary.video("bade", {width: 600, height: 300, crop: "fill"})
Java:
Copy to clipboard
cloudinary.url().transformation(new Transformation().width(600).height(300).crop("fill")).videoTag("bade");
JS:
Copy to clipboard
cloudinary.videoTag('bade', {width: 600, height: 300, crop: "fill"}).toHtml();
jQuery:
Copy to clipboard
$.cloudinary.video("bade", {width: 600, height: 300, crop: "fill"})
React:
Copy to clipboard
<Video publicId="bade" >
  <Transformation width="600" height="300" crop="fill" />
</Video>
Vue.js:
Copy to clipboard
<cld-video publicId="bade" >
  <cld-transformation width="600" height="300" crop="fill" />
</cld-video>
Angular:
Copy to clipboard
<cl-video public-id="bade" >
  <cl-transformation width="600" height="300" crop="fill">
  </cl-transformation>
</cl-video>
.Net:
Copy to clipboard
cloudinary.Api.UrlVideoUp.Transform(new Transformation().Width(600).Height(300).Crop("fill")).BuildVideoTag("bade")
Android:
Copy to clipboard
MediaManager.get().url().transformation(new Transformation().width(600).height(300).crop("fill")).resourceType("video").generate("bade.mp4");
iOS:
Copy to clipboard
cloudinary.createUrl().setResourceType("video").setTransformation(CLDTransformation().setWidth(600).setHeight(300).setCrop("fill")).generate("bade.mp4")

The link above shows that you’ve dynamically resized a video on the fly by configuring its width (w) and height (h) parameters. Did you notice the size of the video, too? Now compare it with that of the original. Cool, right? You’ve changed the video’s default dimension directly from the browser, hassle free.

Concatenate Videos

With Cloudinary, you can easily concatenate two videos by configuring the overlay video parameter l_video: in the URL to show the name of another uploaded video. You can add many videos in the same way but that might be problematic because all of them will be played simultaneously.

To overlay videos and play them sequentially, add the splice flag fl_splice to the URL for concatenation.. Do the following:

Update your link to look like this:

Copy to clipboard
https://res.cloudinary.com/*YOUR_CLOUD_NAME*/video/upload/*OVERLAY_TRANSFORMATION_HERE*/*ID*.mp4 …

Replace the OVERLAY-TRANSFORMATIONHERE variable with the appropriate parameters, for example:

l_video:*ID*,fl_splice,w_1.0,h_1.0,fl_relative,c_fill

Replace ID with the ID of the video with which you are overlaying. For example, if that video ID is suarez, your URL would look like this:

Ruby:
Copy to clipboard
cl_video_tag("bade", :transformation=>[
  {:width=>600, :height=>300, :crop=>"scale"},
  {:overlay=>"video:suarez", :flags=>["splice", "relative"], :width=>1.0, :height=>1.0, :crop=>"fill"}
  ])
PHP:
Copy to clipboard
cl_video_tag("bade", array("transformation"=>array(
  array("width"=>600, "height"=>300, "crop"=>"scale"),
  array("overlay"=>"video:suarez", "flags"=>array("splice", "relative"), "width"=>1.0, "height"=>1.0, "crop"=>"fill")
  )))
Python:
Copy to clipboard
CloudinaryVideo("bade").video(transformation=[
  {'width': 600, 'height': 300, 'crop': "scale"},
  {'overlay': "video:suarez", 'flags': ["splice", "relative"], 'width': 1.0, 'height': 1.0, 'crop': "fill"}
  ])
Node.js:
Copy to clipboard
cloudinary.video("bade", {transformation: [
  {width: 600, height: 300, crop: "scale"},
  {overlay: "video:suarez", flags: ["splice", "relative"], width: "1.0", height: "1.0", crop: "fill"}
  ]})
Java:
Copy to clipboard
cloudinary.url().transformation(new Transformation()
  .width(600).height(300).crop("scale").chain()
  .overlay(new Layer().publicId("video:suarez")).flags("splice", "relative").width(1.0).height(1.0).crop("fill")).videoTag("bade");
JS:
Copy to clipboard
cloudinary.videoTag('bade', {transformation: [
  {width: 600, height: 300, crop: "scale"},
  {overlay: new cloudinary.Layer().publicId("video:suarez"), flags: ["splice", "relative"], width: "1.0", height: "1.0", crop: "fill"}
  ]}).toHtml();
jQuery:
Copy to clipboard
$.cloudinary.video("bade", {transformation: [
  {width: 600, height: 300, crop: "scale"},
  {overlay: new cloudinary.Layer().publicId("video:suarez"), flags: ["splice", "relative"], width: "1.0", height: "1.0", crop: "fill"}
  ]})
React:
Copy to clipboard
<Video publicId="bade" >
  <Transformation width="600" height="300" crop="scale" />
  <Transformation overlay="video:suarez" flags={["splice", "relative"]} width="1.0" height="1.0" crop="fill" />
</Video>
Vue.js:
Copy to clipboard
<cld-video publicId="bade" >
  <cld-transformation width="600" height="300" crop="scale" />
  <cld-transformation overlay="video:suarez" flags={["splice", "relative"]} width="1.0" height="1.0" crop="fill" />
</cld-video>
Angular:
Copy to clipboard
<cl-video public-id="bade" >
  <cl-transformation width="600" height="300" crop="scale">
  </cl-transformation>
  <cl-transformation overlay="video:suarez" flags={{["splice", "relative"]}} width="1.0" height="1.0" crop="fill">
  </cl-transformation>
</cl-video>
.Net:
Copy to clipboard
cloudinary.Api.UrlVideoUp.Transform(new Transformation()
  .Width(600).Height(300).Crop("scale").Chain()
  .Overlay(new Layer().PublicId("video:suarez")).Flags("splice", "relative").Width(1.0).Height(1.0).Crop("fill")).BuildVideoTag("bade")
Android:
Copy to clipboard
MediaManager.get().url().transformation(new Transformation()
  .width(600).height(300).crop("scale").chain()
  .overlay(new Layer().publicId("video:suarez")).flags("splice", "relative").width(1.0).height(1.0).crop("fill")).resourceType("video").generate("bade.mp4");
iOS:
Copy to clipboard
cloudinary.createUrl().setResourceType("video").setTransformation(CLDTransformation()
  .setWidth(600).setHeight(300).setCrop("scale").chain()
  .setOverlay("video:suarez").setFlags("splice", "relative").setWidth(1.0).setHeight(1.0).setCrop("fill")).generate("bade.mp4")

You’ve now concatenated video suarez with video bade into a single video.

Note
..*l_video is the video with which you want to overlay.

..* fl_splice tells Cloudinary to concatenate the video, not overlay it. This parameter is crucial for the videos to play successively.

..* w_1.0,h_1.0,fl_relative,c_fill tells Cloudinary to scale the video’s width and height to fit its original dimension. 1.0 stands for 100 percent.

Add Videos

Let’s add one more video with a public ID of messi-100. Your URL would look like this:

Ruby:
Copy to clipboard
cl_video_tag("bade", :transformation=>[
  {:width=>600, :height=>300, :crop=>"scale"},
  {:overlay=>"video:suarez", :flags=>["splice", "relative"], :width=>1.0, :height=>1.0, :crop=>"fill"},
  {:overlay=>"video:messi-100", :flags=>["splice", "relative"], :width=>1.0, :height=>1.0, :crop=>"fill"}
  ])
PHP:
Copy to clipboard
cl_video_tag("bade", array("transformation"=>array(
  array("width"=>600, "height"=>300, "crop"=>"scale"),
  array("overlay"=>"video:suarez", "flags"=>array("splice", "relative"), "width"=>1.0, "height"=>1.0, "crop"=>"fill"),
  array("overlay"=>"video:messi-100", "flags"=>array("splice", "relative"), "width"=>1.0, "height"=>1.0, "crop"=>"fill")
  )))
Python:
Copy to clipboard
CloudinaryVideo("bade").video(transformation=[
  {'width': 600, 'height': 300, 'crop': "scale"},
  {'overlay': "video:suarez", 'flags': ["splice", "relative"], 'width': 1.0, 'height': 1.0, 'crop': "fill"},
  {'overlay': "video:messi-100", 'flags': ["splice", "relative"], 'width': 1.0, 'height': 1.0, 'crop': "fill"}
  ])
Node.js:
Copy to clipboard
cloudinary.video("bade", {transformation: [
  {width: 600, height: 300, crop: "scale"},
  {overlay: "video:suarez", flags: ["splice", "relative"], width: "1.0", height: "1.0", crop: "fill"},
  {overlay: "video:messi-100", flags: ["splice", "relative"], width: "1.0", height: "1.0", crop: "fill"}
  ]})
Java:
Copy to clipboard
cloudinary.url().transformation(new Transformation()
  .width(600).height(300).crop("scale").chain()
  .overlay(new Layer().publicId("video:suarez")).flags("splice", "relative").width(1.0).height(1.0).crop("fill").chain()
  .overlay(new Layer().publicId("video:messi-100")).flags("splice", "relative").width(1.0).height(1.0).crop("fill")).videoTag("bade");
JS:
Copy to clipboard
cloudinary.videoTag('bade', {transformation: [
  {width: 600, height: 300, crop: "scale"},
  {overlay: new cloudinary.Layer().publicId("video:suarez"), flags: ["splice", "relative"], width: "1.0", height: "1.0", crop: "fill"},
  {overlay: new cloudinary.Layer().publicId("video:messi-100"), flags: ["splice", "relative"], width: "1.0", height: "1.0", crop: "fill"}
  ]}).toHtml();
jQuery:
Copy to clipboard
$.cloudinary.video("bade", {transformation: [
  {width: 600, height: 300, crop: "scale"},
  {overlay: new cloudinary.Layer().publicId("video:suarez"), flags: ["splice", "relative"], width: "1.0", height: "1.0", crop: "fill"},
  {overlay: new cloudinary.Layer().publicId("video:messi-100"), flags: ["splice", "relative"], width: "1.0", height: "1.0", crop: "fill"}
  ]})
React:
Copy to clipboard
<Video publicId="bade" >
  <Transformation width="600" height="300" crop="scale" />
  <Transformation overlay="video:suarez" flags={["splice", "relative"]} width="1.0" height="1.0" crop="fill" />
  <Transformation overlay="video:messi-100" flags={["splice", "relative"]} width="1.0" height="1.0" crop="fill" />
</Video>
Vue.js:
Copy to clipboard
<cld-video publicId="bade" >
  <cld-transformation width="600" height="300" crop="scale" />
  <cld-transformation overlay="video:suarez" flags={["splice", "relative"]} width="1.0" height="1.0" crop="fill" />
  <cld-transformation overlay="video:messi-100" flags={["splice", "relative"]} width="1.0" height="1.0" crop="fill" />
</cld-video>
Angular:
Copy to clipboard
<cl-video public-id="bade" >
  <cl-transformation width="600" height="300" crop="scale">
  </cl-transformation>
  <cl-transformation overlay="video:suarez" flags={{["splice", "relative"]}} width="1.0" height="1.0" crop="fill">
  </cl-transformation>
  <cl-transformation overlay="video:messi-100" flags={{["splice", "relative"]}} width="1.0" height="1.0" crop="fill">
  </cl-transformation>
</cl-video>
.Net:
Copy to clipboard
cloudinary.Api.UrlVideoUp.Transform(new Transformation()
  .Width(600).Height(300).Crop("scale").Chain()
  .Overlay(new Layer().PublicId("video:suarez")).Flags("splice", "relative").Width(1.0).Height(1.0).Crop("fill").Chain()
  .Overlay(new Layer().PublicId("video:messi-100")).Flags("splice", "relative").Width(1.0).Height(1.0).Crop("fill")).BuildVideoTag("bade")
Android:
Copy to clipboard
MediaManager.get().url().transformation(new Transformation()
  .width(600).height(300).crop("scale").chain()
  .overlay(new Layer().publicId("video:suarez")).flags("splice", "relative").width(1.0).height(1.0).crop("fill").chain()
  .overlay(new Layer().publicId("video:messi-100")).flags("splice", "relative").width(1.0).height(1.0).crop("fill")).resourceType("video").generate("bade.mp4");
iOS:
Copy to clipboard
cloudinary.createUrl().setResourceType("video").setTransformation(CLDTransformation()
  .setWidth(600).setHeight(300).setCrop("scale").chain()
  .setOverlay("video:suarez").setFlags("splice", "relative").setWidth(1.0).setHeight(1.0).setCrop("fill").chain()
  .setOverlay("video:messi-100").setFlags("splice", "relative").setWidth(1.0).setHeight(1.0).setCrop("fill")).generate("bade.mp4")

Mute Videos

Also in Cloudinary, you can control a video’s audio volume by configuring the volume effect parameter e_volume in the URL. In this tutorial, let’s mute the video completely with e_volume:-100 since we intend to replace the video with ours. Your URL would then look like this::

Ruby:
Copy to clipboard
cl_video_tag("bade", :transformation=>[
  {:width=>600, :height=>300, :crop=>"scale"},
  {:overlay=>"video:suarez", :flags=>["splice", "relative"], :width=>1.0, :height=>1.0, :crop=>"fill"},
  {:overlay=>"video:messi-100", :flags=>["splice", "relative"], :width=>1.0, :height=>1.0, :crop=>"fill"},
  {:effect=>"volume:-100"}
  ])
PHP:
Copy to clipboard
cl_video_tag("bade", array("transformation"=>array(
  array("width"=>600, "height"=>300, "crop"=>"scale"),
  array("overlay"=>"video:suarez", "flags"=>array("splice", "relative"), "width"=>1.0, "height"=>1.0, "crop"=>"fill"),
  array("overlay"=>"video:messi-100", "flags"=>array("splice", "relative"), "width"=>1.0, "height"=>1.0, "crop"=>"fill"),
  array("effect"=>"volume:-100")
  )))
Python:
Copy to clipboard
CloudinaryVideo("bade").video(transformation=[
  {'width': 600, 'height': 300, 'crop': "scale"},
  {'overlay': "video:suarez", 'flags': ["splice", "relative"], 'width': 1.0, 'height': 1.0, 'crop': "fill"},
  {'overlay': "video:messi-100", 'flags': ["splice", "relative"], 'width': 1.0, 'height': 1.0, 'crop': "fill"},
  {'effect': "volume:-100"}
  ])
Node.js:
Copy to clipboard
cloudinary.video("bade", {transformation: [
  {width: 600, height: 300, crop: "scale"},
  {overlay: "video:suarez", flags: ["splice", "relative"], width: "1.0", height: "1.0", crop: "fill"},
  {overlay: "video:messi-100", flags: ["splice", "relative"], width: "1.0", height: "1.0", crop: "fill"},
  {effect: "volume:-100"}
  ]})
Java:
Copy to clipboard
cloudinary.url().transformation(new Transformation()
  .width(600).height(300).crop("scale").chain()
  .overlay(new Layer().publicId("video:suarez")).flags("splice", "relative").width(1.0).height(1.0).crop("fill").chain()
  .overlay(new Layer().publicId("video:messi-100")).flags("splice", "relative").width(1.0).height(1.0).crop("fill").chain()
  .effect("volume:-100")).videoTag("bade");
JS:
Copy to clipboard
cloudinary.videoTag('bade', {transformation: [
  {width: 600, height: 300, crop: "scale"},
  {overlay: new cloudinary.Layer().publicId("video:suarez"), flags: ["splice", "relative"], width: "1.0", height: "1.0", crop: "fill"},
  {overlay: new cloudinary.Layer().publicId("video:messi-100"), flags: ["splice", "relative"], width: "1.0", height: "1.0", crop: "fill"},
  {effect: "volume:-100"}
  ]}).toHtml();
jQuery:
Copy to clipboard
$.cloudinary.video("bade", {transformation: [
  {width: 600, height: 300, crop: "scale"},
  {overlay: new cloudinary.Layer().publicId("video:suarez"), flags: ["splice", "relative"], width: "1.0", height: "1.0", crop: "fill"},
  {overlay: new cloudinary.Layer().publicId("video:messi-100"), flags: ["splice", "relative"], width: "1.0", height: "1.0", crop: "fill"},
  {effect: "volume:-100"}
  ]})
React:
Copy to clipboard
<Video publicId="bade" >
  <Transformation width="600" height="300" crop="scale" />
  <Transformation overlay="video:suarez" flags={["splice", "relative"]} width="1.0" height="1.0" crop="fill" />
  <Transformation overlay="video:messi-100" flags={["splice", "relative"]} width="1.0" height="1.0" crop="fill" />
  <Transformation effect="volume:-100" />
</Video>
Vue.js:
Copy to clipboard
<cld-video publicId="bade" >
  <cld-transformation width="600" height="300" crop="scale" />
  <cld-transformation overlay="video:suarez" flags={["splice", "relative"]} width="1.0" height="1.0" crop="fill" />
  <cld-transformation overlay="video:messi-100" flags={["splice", "relative"]} width="1.0" height="1.0" crop="fill" />
  <cld-transformation effect="volume:-100" />
</cld-video>
Angular:
Copy to clipboard
<cl-video public-id="bade" >
  <cl-transformation width="600" height="300" crop="scale">
  </cl-transformation>
  <cl-transformation overlay="video:suarez" flags={{["splice", "relative"]}} width="1.0" height="1.0" crop="fill">
  </cl-transformation>
  <cl-transformation overlay="video:messi-100" flags={{["splice", "relative"]}} width="1.0" height="1.0" crop="fill">
  </cl-transformation>
  <cl-transformation effect="volume:-100">
  </cl-transformation>
</cl-video>
.Net:
Copy to clipboard
cloudinary.Api.UrlVideoUp.Transform(new Transformation()
  .Width(600).Height(300).Crop("scale").Chain()
  .Overlay(new Layer().PublicId("video:suarez")).Flags("splice", "relative").Width(1.0).Height(1.0).Crop("fill").Chain()
  .Overlay(new Layer().PublicId("video:messi-100")).Flags("splice", "relative").Width(1.0).Height(1.0).Crop("fill").Chain()
  .Effect("volume:-100")).BuildVideoTag("bade")
Android:
Copy to clipboard
MediaManager.get().url().transformation(new Transformation()
  .width(600).height(300).crop("scale").chain()
  .overlay(new Layer().publicId("video:suarez")).flags("splice", "relative").width(1.0).height(1.0).crop("fill").chain()
  .overlay(new Layer().publicId("video:messi-100")).flags("splice", "relative").width(1.0).height(1.0).crop("fill").chain()
  .effect("volume:-100")).resourceType("video").generate("bade.mp4");
iOS:
Copy to clipboard
cloudinary.createUrl().setResourceType("video").setTransformation(CLDTransformation()
  .setWidth(600).setHeight(300).setCrop("scale").chain()
  .setOverlay("video:suarez").setFlags("splice", "relative").setWidth(1.0).setHeight(1.0).setCrop("fill").chain()
  .setOverlay("video:messi-100").setFlags("splice", "relative").setWidth(1.0).setHeight(1.0).setCrop("fill").chain()
  .setEffect("volume:-100")).generate("bade.mp4")

Customize Themes

Wrapping up, you can overlay your own sound to be played simultaneously with that in the concatenated videos. Simply upload an MP3 file and then configure the l_video: parameter to overlay it, like this:

Ruby:
Copy to clipboard
cl_video_tag("bade", :transformation=>[
  {:width=>600, :height=>300, :crop=>"scale"},
  {:overlay=>"video:suarez", :flags=>["splice", "relative"], :width=>1.0, :height=>1.0, :crop=>"fill"},
  {:overlay=>"video:messi-100", :flags=>["splice", "relative"], :width=>1.0, :height=>1.0, :crop=>"fill"},
  {:effect=>"volume:-100"},
  {:overlay=>"video:sound.mp3"}
  ])
PHP:
Copy to clipboard
cl_video_tag("bade", array("transformation"=>array(
  array("width"=>600, "height"=>300, "crop"=>"scale"),
  array("overlay"=>"video:suarez", "flags"=>array("splice", "relative"), "width"=>1.0, "height"=>1.0, "crop"=>"fill"),
  array("overlay"=>"video:messi-100", "flags"=>array("splice", "relative"), "width"=>1.0, "height"=>1.0, "crop"=>"fill"),
  array("effect"=>"volume:-100"),
  array("overlay"=>"video:sound.mp3")
  )))
Python:
Copy to clipboard
CloudinaryVideo("bade").video(transformation=[
  {'width': 600, 'height': 300, 'crop': "scale"},
  {'overlay': "video:suarez", 'flags': ["splice", "relative"], 'width': 1.0, 'height': 1.0, 'crop': "fill"},
  {'overlay': "video:messi-100", 'flags': ["splice", "relative"], 'width': 1.0, 'height': 1.0, 'crop': "fill"},
  {'effect': "volume:-100"},
  {'overlay': "video:sound.mp3"}
  ])
Node.js:
Copy to clipboard
cloudinary.video("bade", {transformation: [
  {width: 600, height: 300, crop: "scale"},
  {overlay: "video:suarez", flags: ["splice", "relative"], width: "1.0", height: "1.0", crop: "fill"},
  {overlay: "video:messi-100", flags: ["splice", "relative"], width: "1.0", height: "1.0", crop: "fill"},
  {effect: "volume:-100"},
  {overlay: "video:sound.mp3"}
  ]})
Java:
Copy to clipboard
cloudinary.url().transformation(new Transformation()
  .width(600).height(300).crop("scale").chain()
  .overlay(new Layer().publicId("video:suarez")).flags("splice", "relative").width(1.0).height(1.0).crop("fill").chain()
  .overlay(new Layer().publicId("video:messi-100")).flags("splice", "relative").width(1.0).height(1.0).crop("fill").chain()
  .effect("volume:-100").chain()
  .overlay(new Layer().publicId("video:sound.mp3"))).videoTag("bade");
JS:
Copy to clipboard
cloudinary.videoTag('bade', {transformation: [
  {width: 600, height: 300, crop: "scale"},
  {overlay: new cloudinary.Layer().publicId("video:suarez"), flags: ["splice", "relative"], width: "1.0", height: "1.0", crop: "fill"},
  {overlay: new cloudinary.Layer().publicId("video:messi-100"), flags: ["splice", "relative"], width: "1.0", height: "1.0", crop: "fill"},
  {effect: "volume:-100"},
  {overlay: new cloudinary.Layer().publicId("video:sound.mp3")}
  ]}).toHtml();
jQuery:
Copy to clipboard
$.cloudinary.video("bade", {transformation: [
  {width: 600, height: 300, crop: "scale"},
  {overlay: new cloudinary.Layer().publicId("video:suarez"), flags: ["splice", "relative"], width: "1.0", height: "1.0", crop: "fill"},
  {overlay: new cloudinary.Layer().publicId("video:messi-100"), flags: ["splice", "relative"], width: "1.0", height: "1.0", crop: "fill"},
  {effect: "volume:-100"},
  {overlay: new cloudinary.Layer().publicId("video:sound.mp3")}
  ]})
React:
Copy to clipboard
<Video publicId="bade" >
  <Transformation width="600" height="300" crop="scale" />
  <Transformation overlay="video:suarez" flags={["splice", "relative"]} width="1.0" height="1.0" crop="fill" />
  <Transformation overlay="video:messi-100" flags={["splice", "relative"]} width="1.0" height="1.0" crop="fill" />
  <Transformation effect="volume:-100" />
  <Transformation overlay="video:sound.mp3" />
</Video>
Vue.js:
Copy to clipboard
<cld-video publicId="bade" >
  <cld-transformation width="600" height="300" crop="scale" />
  <cld-transformation overlay="video:suarez" flags={["splice", "relative"]} width="1.0" height="1.0" crop="fill" />
  <cld-transformation overlay="video:messi-100" flags={["splice", "relative"]} width="1.0" height="1.0" crop="fill" />
  <cld-transformation effect="volume:-100" />
  <cld-transformation overlay="video:sound.mp3" />
</cld-video>
Angular:
Copy to clipboard
<cl-video public-id="bade" >
  <cl-transformation width="600" height="300" crop="scale">
  </cl-transformation>
  <cl-transformation overlay="video:suarez" flags={{["splice", "relative"]}} width="1.0" height="1.0" crop="fill">
  </cl-transformation>
  <cl-transformation overlay="video:messi-100" flags={{["splice", "relative"]}} width="1.0" height="1.0" crop="fill">
  </cl-transformation>
  <cl-transformation effect="volume:-100">
  </cl-transformation>
  <cl-transformation overlay="video:sound.mp3">
  </cl-transformation>
</cl-video>
.Net:
Copy to clipboard
cloudinary.Api.UrlVideoUp.Transform(new Transformation()
  .Width(600).Height(300).Crop("scale").Chain()
  .Overlay(new Layer().PublicId("video:suarez")).Flags("splice", "relative").Width(1.0).Height(1.0).Crop("fill").Chain()
  .Overlay(new Layer().PublicId("video:messi-100")).Flags("splice", "relative").Width(1.0).Height(1.0).Crop("fill").Chain()
  .Effect("volume:-100").Chain()
  .Overlay(new Layer().PublicId("video:sound.mp3"))).BuildVideoTag("bade")
Android:
Copy to clipboard
MediaManager.get().url().transformation(new Transformation()
  .width(600).height(300).crop("scale").chain()
  .overlay(new Layer().publicId("video:suarez")).flags("splice", "relative").width(1.0).height(1.0).crop("fill").chain()
  .overlay(new Layer().publicId("video:messi-100")).flags("splice", "relative").width(1.0).height(1.0).crop("fill").chain()
  .effect("volume:-100").chain()
  .overlay(new Layer().publicId("video:sound.mp3"))).resourceType("video").generate("bade.mp4");
iOS:
Copy to clipboard
cloudinary.createUrl().setResourceType("video").setTransformation(CLDTransformation()
  .setWidth(600).setHeight(300).setCrop("scale").chain()
  .setOverlay("video:suarez").setFlags("splice", "relative").setWidth(1.0).setHeight(1.0).setCrop("fill").chain()
  .setOverlay("video:messi-100").setFlags("splice", "relative").setWidth(1.0).setHeight(1.0).setCrop("fill").chain()
  .setEffect("volume:-100").chain()
  .setOverlay("video:sound.mp3")).generate("bade.mp4")

Add More Videos

Add more videos for a robust collection of memorable 2018 World Cup moments:

Ruby:
Copy to clipboard
cl_video_tag("bade", :transformation=>[
  {:width=>600, :height=>300, :crop=>"fill"},
  {:overlay=>"video:messi-100", :flags=>["splice", "relative"], :width=>1.0, :height=>1.0, :crop=>"fill"},
  {:overlay=>"video:suarez", :flags=>["splice", "relative"], :width=>1.0, :height=>1.0, :crop=>"fill"},
  {:overlay=>"video:nigeria", :flags=>["splice", "relative"], :width=>1.0, :height=>1.0, :crop=>"fill"},
  {:overlay=>"video:perisic", :flags=>["splice", "relative"], :width=>1.0, :height=>1.0, :crop=>"fill"},
  {:overlay=>"video:tunisia", :flags=>["splice", "relative"], :width=>1.0, :height=>1.0, :crop=>"fill"},
  {:overlay=>"video:deflection", :flags=>["splice", "relative"], :width=>1.0, :height=>1.0, :crop=>"fill"},
  {:overlay=>"video:late_winner", :flags=>["splice", "relative"], :width=>1.0, :height=>1.0, :crop=>"fill"},
  {:overlay=>"video:belgium", :flags=>["splice", "relative"], :width=>1.0, :height=>1.0, :crop=>"fill"},
  {:overlay=>"video:cavani", :flags=>["splice", "relative"], :width=>1.0, :height=>1.0, :crop=>"fill"},
  {:effect=>"volume:-100"},
  {:overlay=>"video:sound.mp3"}
  ])
PHP:
Copy to clipboard
cl_video_tag("bade", array("transformation"=>array(
  array("width"=>600, "height"=>300, "crop"=>"fill"),
  array("overlay"=>"video:messi-100", "flags"=>array("splice", "relative"), "width"=>1.0, "height"=>1.0, "crop"=>"fill"),
  array("overlay"=>"video:suarez", "flags"=>array("splice", "relative"), "width"=>1.0, "height"=>1.0, "crop"=>"fill"),
  array("overlay"=>"video:nigeria", "flags"=>array("splice", "relative"), "width"=>1.0, "height"=>1.0, "crop"=>"fill"),
  array("overlay"=>"video:perisic", "flags"=>array("splice", "relative"), "width"=>1.0, "height"=>1.0, "crop"=>"fill"),
  array("overlay"=>"video:tunisia", "flags"=>array("splice", "relative"), "width"=>1.0, "height"=>1.0, "crop"=>"fill"),
  array("overlay"=>"video:deflection", "flags"=>array("splice", "relative"), "width"=>1.0, "height"=>1.0, "crop"=>"fill"),
  array("overlay"=>"video:late_winner", "flags"=>array("splice", "relative"), "width"=>1.0, "height"=>1.0, "crop"=>"fill"),
  array("overlay"=>"video:belgium", "flags"=>array("splice", "relative"), "width"=>1.0, "height"=>1.0, "crop"=>"fill"),
  array("overlay"=>"video:cavani", "flags"=>array("splice", "relative"), "width"=>1.0, "height"=>1.0, "crop"=>"fill"),
  array("effect"=>"volume:-100"),
  array("overlay"=>"video:sound.mp3")
  )))
Python:
Copy to clipboard
CloudinaryVideo("bade").video(transformation=[
  {'width': 600, 'height': 300, 'crop': "fill"},
  {'overlay': "video:messi-100", 'flags': ["splice", "relative"], 'width': 1.0, 'height': 1.0, 'crop': "fill"},
  {'overlay': "video:suarez", 'flags': ["splice", "relative"], 'width': 1.0, 'height': 1.0, 'crop': "fill"},
  {'overlay': "video:nigeria", 'flags': ["splice", "relative"], 'width': 1.0, 'height': 1.0, 'crop': "fill"},
  {'overlay': "video:perisic", 'flags': ["splice", "relative"], 'width': 1.0, 'height': 1.0, 'crop': "fill"},
  {'overlay': "video:tunisia", 'flags': ["splice", "relative"], 'width': 1.0, 'height': 1.0, 'crop': "fill"},
  {'overlay': "video:deflection", 'flags': ["splice", "relative"], 'width': 1.0, 'height': 1.0, 'crop': "fill"},
  {'overlay': "video:late_winner", 'flags': ["splice", "relative"], 'width': 1.0, 'height': 1.0, 'crop': "fill"},
  {'overlay': "video:belgium", 'flags': ["splice", "relative"], 'width': 1.0, 'height': 1.0, 'crop': "fill"},
  {'overlay': "video:cavani", 'flags': ["splice", "relative"], 'width': 1.0, 'height': 1.0, 'crop': "fill"},
  {'effect': "volume:-100"},
  {'overlay': "video:sound.mp3"}
  ])
Node.js:
Copy to clipboard
cloudinary.video("bade", {transformation: [
  {width: 600, height: 300, crop: "fill"},
  {overlay: "video:messi-100", flags: ["splice", "relative"], width: "1.0", height: "1.0", crop: "fill"},
  {overlay: "video:suarez", flags: ["splice", "relative"], width: "1.0", height: "1.0", crop: "fill"},
  {overlay: "video:nigeria", flags: ["splice", "relative"], width: "1.0", height: "1.0", crop: "fill"},
  {overlay: "video:perisic", flags: ["splice", "relative"], width: "1.0", height: "1.0", crop: "fill"},
  {overlay: "video:tunisia", flags: ["splice", "relative"], width: "1.0", height: "1.0", crop: "fill"},
  {overlay: "video:deflection", flags: ["splice", "relative"], width: "1.0", height: "1.0", crop: "fill"},
  {overlay: "video:late_winner", flags: ["splice", "relative"], width: "1.0", height: "1.0", crop: "fill"},
  {overlay: "video:belgium", flags: ["splice", "relative"], width: "1.0", height: "1.0", crop: "fill"},
  {overlay: "video:cavani", flags: ["splice", "relative"], width: "1.0", height: "1.0", crop: "fill"},
  {effect: "volume:-100"},
  {overlay: "video:sound.mp3"}
  ]})
Java:
Copy to clipboard
cloudinary.url().transformation(new Transformation()
  .width(600).height(300).crop("fill").chain()
  .overlay(new Layer().publicId("video:messi-100")).flags("splice", "relative").width(1.0).height(1.0).crop("fill").chain()
  .overlay(new Layer().publicId("video:suarez")).flags("splice", "relative").width(1.0).height(1.0).crop("fill").chain()
  .overlay(new Layer().publicId("video:nigeria")).flags("splice", "relative").width(1.0).height(1.0).crop("fill").chain()
  .overlay(new Layer().publicId("video:perisic")).flags("splice", "relative").width(1.0).height(1.0).crop("fill").chain()
  .overlay(new Layer().publicId("video:tunisia")).flags("splice", "relative").width(1.0).height(1.0).crop("fill").chain()
  .overlay(new Layer().publicId("video:deflection")).flags("splice", "relative").width(1.0).height(1.0).crop("fill").chain()
  .overlay(new Layer().publicId("video:late_winner")).flags("splice", "relative").width(1.0).height(1.0).crop("fill").chain()
  .overlay(new Layer().publicId("video:belgium")).flags("splice", "relative").width(1.0).height(1.0).crop("fill").chain()
  .overlay(new Layer().publicId("video:cavani")).flags("splice", "relative").width(1.0).height(1.0).crop("fill").chain()
  .effect("volume:-100").chain()
  .overlay(new Layer().publicId("video:sound.mp3"))).videoTag("bade");
JS:
Copy to clipboard
cloudinary.videoTag('bade', {transformation: [
  {width: 600, height: 300, crop: "fill"},
  {overlay: new cloudinary.Layer().publicId("video:messi-100"), flags: ["splice", "relative"], width: "1.0", height: "1.0", crop: "fill"},
  {overlay: new cloudinary.Layer().publicId("video:suarez"), flags: ["splice", "relative"], width: "1.0", height: "1.0", crop: "fill"},
  {overlay: new cloudinary.Layer().publicId("video:nigeria"), flags: ["splice", "relative"], width: "1.0", height: "1.0", crop: "fill"},
  {overlay: new cloudinary.Layer().publicId("video:perisic"), flags: ["splice", "relative"], width: "1.0", height: "1.0", crop: "fill"},
  {overlay: new cloudinary.Layer().publicId("video:tunisia"), flags: ["splice", "relative"], width: "1.0", height: "1.0", crop: "fill"},
  {overlay: new cloudinary.Layer().publicId("video:deflection"), flags: ["splice", "relative"], width: "1.0", height: "1.0", crop: "fill"},
  {overlay: new cloudinary.Layer().publicId("video:late_winner"), flags: ["splice", "relative"], width: "1.0", height: "1.0", crop: "fill"},
  {overlay: new cloudinary.Layer().publicId("video:belgium"), flags: ["splice", "relative"], width: "1.0", height: "1.0", crop: "fill"},
  {overlay: new cloudinary.Layer().publicId("video:cavani"), flags: ["splice", "relative"], width: "1.0", height: "1.0", crop: "fill"},
  {effect: "volume:-100"},
  {overlay: new cloudinary.Layer().publicId("video:sound.mp3")}
  ]}).toHtml();
jQuery:
Copy to clipboard
$.cloudinary.video("bade", {transformation: [
  {width: 600, height: 300, crop: "fill"},
  {overlay: new cloudinary.Layer().publicId("video:messi-100"), flags: ["splice", "relative"], width: "1.0", height: "1.0", crop: "fill"},
  {overlay: new cloudinary.Layer().publicId("video:suarez"), flags: ["splice", "relative"], width: "1.0", height: "1.0", crop: "fill"},
  {overlay: new cloudinary.Layer().publicId("video:nigeria"), flags: ["splice", "relative"], width: "1.0", height: "1.0", crop: "fill"},
  {overlay: new cloudinary.Layer().publicId("video:perisic"), flags: ["splice", "relative"], width: "1.0", height: "1.0", crop: "fill"},
  {overlay: new cloudinary.Layer().publicId("video:tunisia"), flags: ["splice", "relative"], width: "1.0", height: "1.0", crop: "fill"},
  {overlay: new cloudinary.Layer().publicId("video:deflection"), flags: ["splice", "relative"], width: "1.0", height: "1.0", crop: "fill"},
  {overlay: new cloudinary.Layer().publicId("video:late_winner"), flags: ["splice", "relative"], width: "1.0", height: "1.0", crop: "fill"},
  {overlay: new cloudinary.Layer().publicId("video:belgium"), flags: ["splice", "relative"], width: "1.0", height: "1.0", crop: "fill"},
  {overlay: new cloudinary.Layer().publicId("video:cavani"), flags: ["splice", "relative"], width: "1.0", height: "1.0", crop: "fill"},
  {effect: "volume:-100"},
  {overlay: new cloudinary.Layer().publicId("video:sound.mp3")}
  ]})
React:
Copy to clipboard
<Video publicId="bade" >
  <Transformation width="600" height="300" crop="fill" />
  <Transformation overlay="video:messi-100" flags={["splice", "relative"]} width="1.0" height="1.0" crop="fill" />
  <Transformation overlay="video:suarez" flags={["splice", "relative"]} width="1.0" height="1.0" crop="fill" />
  <Transformation overlay="video:nigeria" flags={["splice", "relative"]} width="1.0" height="1.0" crop="fill" />
  <Transformation overlay="video:perisic" flags={["splice", "relative"]} width="1.0" height="1.0" crop="fill" />
  <Transformation overlay="video:tunisia" flags={["splice", "relative"]} width="1.0" height="1.0" crop="fill" />
  <Transformation overlay="video:deflection" flags={["splice", "relative"]} width="1.0" height="1.0" crop="fill" />
  <Transformation overlay="video:late_winner" flags={["splice", "relative"]} width="1.0" height="1.0" crop="fill" />
  <Transformation overlay="video:belgium" flags={["splice", "relative"]} width="1.0" height="1.0" crop="fill" />
  <Transformation overlay="video:cavani" flags={["splice", "relative"]} width="1.0" height="1.0" crop="fill" />
  <Transformation effect="volume:-100" />
  <Transformation overlay="video:sound.mp3" />
</Video>
Vue.js:
Copy to clipboard
<cld-video publicId="bade" >
  <cld-transformation width="600" height="300" crop="fill" />
  <cld-transformation overlay="video:messi-100" flags={["splice", "relative"]} width="1.0" height="1.0" crop="fill" />
  <cld-transformation overlay="video:suarez" flags={["splice", "relative"]} width="1.0" height="1.0" crop="fill" />
  <cld-transformation overlay="video:nigeria" flags={["splice", "relative"]} width="1.0" height="1.0" crop="fill" />
  <cld-transformation overlay="video:perisic" flags={["splice", "relative"]} width="1.0" height="1.0" crop="fill" />
  <cld-transformation overlay="video:tunisia" flags={["splice", "relative"]} width="1.0" height="1.0" crop="fill" />
  <cld-transformation overlay="video:deflection" flags={["splice", "relative"]} width="1.0" height="1.0" crop="fill" />
  <cld-transformation overlay="video:late_winner" flags={["splice", "relative"]} width="1.0" height="1.0" crop="fill" />
  <cld-transformation overlay="video:belgium" flags={["splice", "relative"]} width="1.0" height="1.0" crop="fill" />
  <cld-transformation overlay="video:cavani" flags={["splice", "relative"]} width="1.0" height="1.0" crop="fill" />
  <cld-transformation effect="volume:-100" />
  <cld-transformation overlay="video:sound.mp3" />
</cld-video>
Angular:
Copy to clipboard
<cl-video public-id="bade" >
  <cl-transformation width="600" height="300" crop="fill">
  </cl-transformation>
  <cl-transformation overlay="video:messi-100" flags={{["splice", "relative"]}} width="1.0" height="1.0" crop="fill">
  </cl-transformation>
  <cl-transformation overlay="video:suarez" flags={{["splice", "relative"]}} width="1.0" height="1.0" crop="fill">
  </cl-transformation>
  <cl-transformation overlay="video:nigeria" flags={{["splice", "relative"]}} width="1.0" height="1.0" crop="fill">
  </cl-transformation>
  <cl-transformation overlay="video:perisic" flags={{["splice", "relative"]}} width="1.0" height="1.0" crop="fill">
  </cl-transformation>
  <cl-transformation overlay="video:tunisia" flags={{["splice", "relative"]}} width="1.0" height="1.0" crop="fill">
  </cl-transformation>
  <cl-transformation overlay="video:deflection" flags={{["splice", "relative"]}} width="1.0" height="1.0" crop="fill">
  </cl-transformation>
  <cl-transformation overlay="video:late_winner" flags={{["splice", "relative"]}} width="1.0" height="1.0" crop="fill">
  </cl-transformation>
  <cl-transformation overlay="video:belgium" flags={{["splice", "relative"]}} width="1.0" height="1.0" crop="fill">
  </cl-transformation>
  <cl-transformation overlay="video:cavani" flags={{["splice", "relative"]}} width="1.0" height="1.0" crop="fill">
  </cl-transformation>
  <cl-transformation effect="volume:-100">
  </cl-transformation>
  <cl-transformation overlay="video:sound.mp3">
  </cl-transformation>
</cl-video>
.Net:
Copy to clipboard
cloudinary.Api.UrlVideoUp.Transform(new Transformation()
  .Width(600).Height(300).Crop("fill").Chain()
  .Overlay(new Layer().PublicId("video:messi-100")).Flags("splice", "relative").Width(1.0).Height(1.0).Crop("fill").Chain()
  .Overlay(new Layer().PublicId("video:suarez")).Flags("splice", "relative").Width(1.0).Height(1.0).Crop("fill").Chain()
  .Overlay(new Layer().PublicId("video:nigeria")).Flags("splice", "relative").Width(1.0).Height(1.0).Crop("fill").Chain()
  .Overlay(new Layer().PublicId("video:perisic")).Flags("splice", "relative").Width(1.0).Height(1.0).Crop("fill").Chain()
  .Overlay(new Layer().PublicId("video:tunisia")).Flags("splice", "relative").Width(1.0).Height(1.0).Crop("fill").Chain()
  .Overlay(new Layer().PublicId("video:deflection")).Flags("splice", "relative").Width(1.0).Height(1.0).Crop("fill").Chain()
  .Overlay(new Layer().PublicId("video:late_winner")).Flags("splice", "relative").Width(1.0).Height(1.0).Crop("fill").Chain()
  .Overlay(new Layer().PublicId("video:belgium")).Flags("splice", "relative").Width(1.0).Height(1.0).Crop("fill").Chain()
  .Overlay(new Layer().PublicId("video:cavani")).Flags("splice", "relative").Width(1.0).Height(1.0).Crop("fill").Chain()
  .Effect("volume:-100").Chain()
  .Overlay(new Layer().PublicId("video:sound.mp3"))).BuildVideoTag("bade")
Android:
Copy to clipboard
MediaManager.get().url().transformation(new Transformation()
  .width(600).height(300).crop("fill").chain()
  .overlay(new Layer().publicId("video:messi-100")).flags("splice", "relative").width(1.0).height(1.0).crop("fill").chain()
  .overlay(new Layer().publicId("video:suarez")).flags("splice", "relative").width(1.0).height(1.0).crop("fill").chain()
  .overlay(new Layer().publicId("video:nigeria")).flags("splice", "relative").width(1.0).height(1.0).crop("fill").chain()
  .overlay(new Layer().publicId("video:perisic")).flags("splice", "relative").width(1.0).height(1.0).crop("fill").chain()
  .overlay(new Layer().publicId("video:tunisia")).flags("splice", "relative").width(1.0).height(1.0).crop("fill").chain()
  .overlay(new Layer().publicId("video:deflection")).flags("splice", "relative").width(1.0).height(1.0).crop("fill").chain()
  .overlay(new Layer().publicId("video:late_winner")).flags("splice", "relative").width(1.0).height(1.0).crop("fill").chain()
  .overlay(new Layer().publicId("video:belgium")).flags("splice", "relative").width(1.0).height(1.0).crop("fill").chain()
  .overlay(new Layer().publicId("video:cavani")).flags("splice", "relative").width(1.0).height(1.0).crop("fill").chain()
  .effect("volume:-100").chain()
  .overlay(new Layer().publicId("video:sound.mp3"))).resourceType("video").generate("bade.mp4");
iOS:
Copy to clipboard
cloudinary.createUrl().setResourceType("video").setTransformation(CLDTransformation()
  .setWidth(600).setHeight(300).setCrop("fill").chain()
  .setOverlay("video:messi-100").setFlags("splice", "relative").setWidth(1.0).setHeight(1.0).setCrop("fill").chain()
  .setOverlay("video:suarez").setFlags("splice", "relative").setWidth(1.0).setHeight(1.0).setCrop("fill").chain()
  .setOverlay("video:nigeria").setFlags("splice", "relative").setWidth(1.0).setHeight(1.0).setCrop("fill").chain()
  .setOverlay("video:perisic").setFlags("splice", "relative").setWidth(1.0).setHeight(1.0).setCrop("fill").chain()
  .setOverlay("video:tunisia").setFlags("splice", "relative").setWidth(1.0).setHeight(1.0).setCrop("fill").chain()
  .setOverlay("video:deflection").setFlags("splice", "relative").setWidth(1.0).setHeight(1.0).setCrop("fill").chain()
  .setOverlay("video:late_winner").setFlags("splice", "relative").setWidth(1.0).setHeight(1.0).setCrop("fill").chain()
  .setOverlay("video:belgium").setFlags("splice", "relative").setWidth(1.0).setHeight(1.0).setCrop("fill").chain()
  .setOverlay("video:cavani").setFlags("splice", "relative").setWidth(1.0).setHeight(1.0).setCrop("fill").chain()
  .setEffect("volume:-100").chain()
  .setOverlay("video:sound.mp3")).generate("bade.mp4")

Congratulations! You’ve just built your own FIFA World Cup moments with a customized theme sound.

Explore Cloudinary

As shown above, you can easily leverage some of Cloudinary’s awesome video-management features to create wonderful effects. The sky is the limit to what you can achieve.

Do create an account on Cloudinary and check out its documentation for more fabulous features.


Further Reading on Video Manipulation

Recent Blog Posts

Laravel File Upload to a Local Server Or to the Cloud

Currently, Laravel is the most renowned PHP framework, boasting of a large developer community; several open-source packages, such as Cashier, Sanctum, Scout, and Telescope; and a host of paid platforms, e.g., Laravel Forge, Envoyer, and Vapor. Laravel Forge & Envoyer ably supports deployment and use of Laravel production-based apps.

Read more
TedsVintageArt.com Automates Generation of Captivating Product Images on Cloudinary

At TedsVintageArt.com, we digitally restore historic maps and sell their art prints on multiple platforms, such as Amazon, Etsy, eBay, and Houzz. As our operations ramped up years ago, it took an inordinately long time to generate custom images for our products. Plus, since we sell art, it behooves us to produce multiple high-quality images for each print, which was another time-consuming task.

Read more
lastminute.com Takes a Vacation From Media-Management Headaches With Cloudinary

As a 20-year online leader in travel and leisure retail, Europe-based public company lastminute.com along with its 1,200 employees are committed to enriching the lives of vacationers through comprehensive and enticing products and services. Beyond flight deals and tours, it's the images and videos, whether of that luxury villa in Greece, romantic Parisian street, or exotic stroll through the Marrakech markets, that attract audiences and boost bookings.

Read more