in media/transcoder/src/main/java/com/example/transcoder/CreateJobWithAnimatedOverlay.java [54:156]
public static void createJobWithAnimatedOverlay(
String projectId, String location, String inputUri, String overlayImageUri, String outputUri)
throws IOException {
// Initialize client that will be used to send requests. This client only needs to be created
// once, and can be reused for multiple requests.
try (TranscoderServiceClient transcoderServiceClient = TranscoderServiceClient.create()) {
VideoStream videoStream0 =
VideoStream.newBuilder()
.setH264(
VideoStream.H264CodecSettings.newBuilder()
.setBitrateBps(550000)
.setFrameRate(60)
.setHeightPixels(360)
.setWidthPixels(640))
.build();
AudioStream audioStream0 =
AudioStream.newBuilder().setCodec("aac").setBitrateBps(64000).build();
// Create the overlay image. Image resolution is based on output video resolution.
// This example uses the values x: 0 and y: 0 to maintain the original resolution
// of the overlay image.
Overlay.Image overlayImage =
Overlay.Image.newBuilder()
.setUri(overlayImageUri)
.setResolution(NormalizedCoordinate.newBuilder().setX(0).setY(0).build())
.setAlpha(1)
.build();
// Create the starting animation (when the overlay starts to fade in). Use the values x: 0.5
// and y: 0.5 to position the top-left corner of the overlay in the top-left corner of the
// output video.
Overlay.Animation animationFadeIn =
Animation.newBuilder()
.setAnimationFade(
AnimationFade.newBuilder()
.setFadeType(FadeType.FADE_IN)
.setXy(NormalizedCoordinate.newBuilder().setX(0.5).setY(0.5).build())
.setStartTimeOffset(Duration.newBuilder().setSeconds(5).build())
.setEndTimeOffset(Duration.newBuilder().setSeconds(10).build())
.build())
.build();
// Create the ending animation (when the overlay starts to fade out). The overlay will start
// to fade out at the 12-second mark in the output video.
Overlay.Animation animationFadeOut =
Animation.newBuilder()
.setAnimationFade(
AnimationFade.newBuilder()
.setFadeType(FadeType.FADE_OUT)
.setXy(NormalizedCoordinate.newBuilder().setX(0.5).setY(0.5).build())
.setStartTimeOffset(Duration.newBuilder().setSeconds(12).build())
.setEndTimeOffset(Duration.newBuilder().setSeconds(15).build())
.build())
.build();
// Create the overlay and add the image and animations to it.
Overlay overlay =
Overlay.newBuilder()
.setImage(overlayImage)
.addAnimations(animationFadeIn)
.addAnimations(animationFadeOut)
.build();
JobConfig config =
JobConfig.newBuilder()
.addInputs(Input.newBuilder().setKey("input0").setUri(inputUri))
.setOutput(Output.newBuilder().setUri(outputUri))
.addElementaryStreams(
ElementaryStream.newBuilder()
.setKey("video_stream0")
.setVideoStream(videoStream0))
.addElementaryStreams(
ElementaryStream.newBuilder()
.setKey("audio_stream0")
.setAudioStream(audioStream0))
.addMuxStreams(
MuxStream.newBuilder()
.setKey("sd")
.setContainer("mp4")
.addElementaryStreams("video_stream0")
.addElementaryStreams("audio_stream0")
.build())
.addOverlays(overlay) // Add the overlay to the job config
.build();
CreateJobRequest createJobRequest =
CreateJobRequest.newBuilder()
.setJob(
Job.newBuilder()
.setInputUri(inputUri)
.setOutputUri(outputUri)
.setConfig(config)
.build())
.setParent(LocationName.of(projectId, location).toString())
.build();
// Send the job creation request and process the response.
Job job = transcoderServiceClient.createJob(createJobRequest);
System.out.println("Job: " + job.getName());
}
}