Halaman ini menjelaskan cara menyisipkan overlay ke video yang di-transcoding. Overlay
terdiri dari gambar yang dimasukkan di atas video output, dan dapat
menjadi jelas atau memudar secara opsional selama jangka waktu tertentu. Untuk menyisipkan
overlay, gunakan
array overlays
di
template JobConfig
.
Lihat
daftar format file gambar yang didukung .
Mengupload gambar ke Cloud Storage
Untuk memulai, lakukan langkah berikut guna mengupload gambar overlay ke bucket Cloud Storage:
Di konsol Google Cloud, buka halaman Browser Cloud Storage.
Buka halaman Browser Cloud Storage
Klik nama bucket untuk membukanya.
Klik Upload files .
Pilih file image yang akan diupload dari komputer Anda.
Membuat overlay
Anda dapat membuat dua jenis overlay: statis atau
animasi . Kedua jenis overlay menggunakan gambar statis.
Anda dapat menampilkan atau menyembunyikan overlay statis. Overlay animasi mendukung animasi fade-in dan fade out pada gambar.
Anda dapat menyisipkan beberapa overlay ke dalam satu video output.
Membuat overlay statis
Pada objek image
, gunakan kolom uri
untuk menentukan gambar overlay di Cloud Storage. Pada objek resolution
, tetapkan
nilai x dan y dari 0 hingga 1,0. Nilai 0 mempertahankan resolusi
gambar sumber untuk dimensi tersebut; nilai 1,0 akan merentangkan gambar agar sesuai
dengan dimensi video output. Misalnya, gunakan nilai x: 1
dan y:
0.5
untuk melebarkan gambar overlay dengan lebar penuh dan setengah dari tinggi video output.
Dalam array animations
, buat objek animationStatic
dengan koordinat x dan y
dari 0 hingga 1,0. Koordinat ini didasarkan pada resolusi video output. Gunakan nilai x: 0
dan y: 0
untuk memosisikan sudut kiri atas overlay di pojok kiri atas video output. Tentukan kapan overlay
akan muncul di linimasa video output menggunakan kolom startTimeOffset
.
Untuk menghapus animasi statis, buat objek animationEnd
. Tentukan kapan
animasi akan berakhir (yaitu, overlay akan menghilang) di linimasa video
output menggunakan kolom startTimeOffset
.
Anda dapat menambahkan konfigurasi ini ke template tugas atau menyertakannya dalam konfigurasi tugas ad-hoc :
REST
Sebelum menggunakan salah satu data permintaan,
lakukan penggantian berikut:
PROJECT_ID
: Project ID Google Cloud Anda yang tercantum di Setelan IAM .
LOCATION
: Lokasi tempat tugas akan dijalankan. Gunakan salah satu wilayah yang didukung .
Tampilkan lokasi
us-central1
us-west1
us-west2
us-east1
us-east4
southamerica-east1
asia-east1
asia-south1
asia-southeast1
europe-west1
europe-west2
europe-west4
STORAGE_BUCKET_NAME
: Nama bucket Cloud Storage yang Anda buat.
STORAGE_INPUT_VIDEO
: Nama video di bucket Cloud Storage yang di-transcoding, seperti my-vid.mp4
.
Kolom ini harus mempertimbangkan setiap folder yang Anda buat di bucket (misalnya, input/my-vid.mp4
).
STORAGE_INPUT_OVERLAY
: Nama gambar di bucket Cloud Storage yang Anda gunakan untuk overlay, seperti my-overlay.png
. Kolom ini harus mempertimbangkan setiap folder yang Anda buat di bucket (misalnya, input/my-overlay.png
).
STORAGE_OUTPUT_FOLDER
: Nama folder Cloud Storage
tempat Anda ingin menyimpan output video yang dienkode.
Catatan: Anda tidak perlu membuat objek folder output sebelum
membuat tugas. Saat memproses tugas, Transcoder API secara otomatis menambahkan nama folder yang Anda tentukan sebagai bagian dari nama objek yang disimpan ke Cloud Storage.
Untuk mengirim permintaan Anda, perluas salah satu opsi berikut:
curl (Linux, macOS, atau Cloud Shell)
Catatan:
Perintah berikut mengasumsikan bahwa Anda telah login ke CLI gcloud
dengan akun pengguna Anda dengan menjalankan gcloud init
atau gcloud auth login
, atau menggunakan Cloud Shell , yang secara otomatis membuat Anda login ke CLI gcloud
.
Anda dapat memeriksa akun yang aktif saat ini dengan menjalankan
gcloud auth list
.
Simpan isi permintaan dalam file bernama request.json
.
Jalankan perintah berikut di terminal untuk membuat atau menimpa file ini di direktori saat ini:
cat > request.json << 'EOF'
{
"config": {
"inputs": [
{
"key": "input0",
"uri": "gs://STORAGE_BUCKET_NAME /STORAGE_INPUT_VIDEO "
}
],
"elementaryStreams": [
{
"key": "video-stream0",
"videoStream": {
"h264": {
"heightPixels": 360,
"widthPixels": 640,
"bitrateBps": 550000,
"frameRate": 60
}
}
},
{
"key": "audio-stream0",
"audioStream": {
"codec": "aac",
"bitrateBps": 64000
}
}
],
"muxStreams": [
{
"key": "sd",
"container": "mp4",
"elementaryStreams": [
"video-stream0",
"audio-stream0"
]
}
],
"output": {
"uri": "gs://STORAGE_BUCKET_NAME /STORAGE_OUTPUT_FOLDER /"
},
"overlays": [
{
"image": {
"uri": "gs://STORAGE_BUCKET_NAME /STORAGE_INPUT_OVERLAY ",
"resolution": {
"x": 1,
"y": 0.5
},
"alpha": 1
},
"animations": [
{
"animationStatic": {
"xy": {
"x": 0,
"y": 0
},
"startTimeOffset": "0s"
}
},
{
"animationEnd": {
"startTimeOffset": "10s"
}
}
]
}
]
}
}
EOF
Kemudian jalankan perintah berikut untuk mengirim permintaan REST Anda:
curl -X POST \ -H "Authorization: Bearer $(gcloud auth print-access-token)" \ -H "Content-Type: application/json; charset=utf-8" \ -d @request.json \ "https://transcoder.googleapis.com/v1/projects/PROJECT_ID /locations/LOCATION /jobs"
PowerShell (Windows)
Catatan: Perintah berikut mengasumsikan bahwa Anda telah login ke CLI gcloud
dengan akun pengguna Anda dengan menjalankan gcloud init
atau gcloud auth login
.
Anda dapat memeriksa akun yang aktif saat ini dengan menjalankan
gcloud auth list
.
Simpan isi permintaan dalam file bernama request.json
.
Jalankan perintah berikut di terminal untuk membuat atau menimpa file ini di direktori saat ini:
@'
{
"config": {
"inputs": [
{
"key": "input0",
"uri": "gs://STORAGE_BUCKET_NAME /STORAGE_INPUT_VIDEO "
}
],
"elementaryStreams": [
{
"key": "video-stream0",
"videoStream": {
"h264": {
"heightPixels": 360,
"widthPixels": 640,
"bitrateBps": 550000,
"frameRate": 60
}
}
},
{
"key": "audio-stream0",
"audioStream": {
"codec": "aac",
"bitrateBps": 64000
}
}
],
"muxStreams": [
{
"key": "sd",
"container": "mp4",
"elementaryStreams": [
"video-stream0",
"audio-stream0"
]
}
],
"output": {
"uri": "gs://STORAGE_BUCKET_NAME /STORAGE_OUTPUT_FOLDER /"
},
"overlays": [
{
"image": {
"uri": "gs://STORAGE_BUCKET_NAME /STORAGE_INPUT_OVERLAY ",
"resolution": {
"x": 1,
"y": 0.5
},
"alpha": 1
},
"animations": [
{
"animationStatic": {
"xy": {
"x": 0,
"y": 0
},
"startTimeOffset": "0s"
}
},
{
"animationEnd": {
"startTimeOffset": "10s"
}
}
]
}
]
}
}
'@ | Out-File -FilePath request.json -Encoding utf8
Kemudian jalankan perintah berikut untuk mengirim permintaan REST Anda:
$cred = gcloud auth print-access-token $headers = @{ "Authorization" = "Bearer $cred" } Invoke-WebRequest ` -Method POST ` -Headers $headers ` -ContentType: "application/json; charset=utf-8" ` -InFile request.json ` -Uri "https://transcoder.googleapis.com/v1/projects/PROJECT_ID /locations/LOCATION /jobs" | Select-Object -Expand Content
Anda akan melihat respons JSON seperti berikut:
{
"name": "projects/PROJECT_NUMBER /locations/LOCATION /jobs/JOB_ID ",
"config": {
...
},
"state": "PENDING",
"createTime": CREATE_TIME ,
"ttlAfterCompletionDays": 30
}
gcloud
Buat file request.json
yang menentukan kolom lowongan. Lakukan
pengganti berikut untuk perintah
gcloud
:
STORAGE_BUCKET_NAME : Nama bucket Cloud Storage yang Anda buat.
STORAGE_INPUT_VIDEO : Nama video di bucket Cloud Storage yang di-transcoding, seperti my-vid.mp4
. Kolom ini harus mempertimbangkan setiap folder yang Anda buat di bucket (misalnya, input/my-vid.mp4
).
STORAGE_INPUT_OVERLAY : Nama file gambar di bucket Cloud Storage yang Anda gunakan untuk overlay, seperti my-overlay.png
. Kolom ini harus mempertimbangkan setiap folder yang Anda buat di bucket (misalnya, input/my-overlay.png
).
LOCATION : Lokasi tempat
tugas akan dijalankan. Gunakan lokasi dari daftar berikut.
Tampilkan lokasi
us-central1
us-west1
us-west2
us-east1
us-east4
southamerica-east1
asia-east1
asia-south1
asia-southeast1
europe-west1
europe-west2
europe-west4
STORAGE_OUTPUT_FOLDER : Nama folder Cloud Storage tempat Anda ingin menyimpan output video yang dienkode.
Catatan: Anda tidak perlu membuat objek folder output sebelum
membuat tugas. Saat memproses tugas, Transcoder API secara otomatis menambahkan nama folder yang Anda tentukan sebagai bagian dari nama objek yang disimpan ke Cloud Storage.
{
"config": {
"inputs": [
{
"key": "input0",
"uri": "gs://STORAGE_BUCKET_NAME /STORAGE_INPUT_VIDEO "
}
],
"elementaryStreams": [
{
"key": "video-stream0",
"videoStream": {
"h264": {
"heightPixels": 360,
"widthPixels": 640,
"bitrateBps": 550000,
"frameRate": 60
}
}
},
{
"key": "audio-stream0",
"audioStream": {
"codec": "aac",
"bitrateBps": 64000
}
}
],
"muxStreams": [
{
"key": "sd",
"container": "mp4",
"elementaryStreams": [
"video-stream0",
"audio-stream0"
]
}
],
"output": {
"uri": "gs://STORAGE_BUCKET_NAME /STORAGE_OUTPUT_FOLDER /"
},
"overlays": [
{
"image": {
"uri": "gs://STORAGE_BUCKET_NAME /STORAGE_INPUT_OVERLAY ",
"resolution": {
"x": 1,
"y": 0.5
},
"alpha": 1
},
"animations": [
{
"animationStatic": {
"xy": {
"x": 0,
"y": 0
},
"startTimeOffset": "0s"
}
},
{
"animationEnd": {
"startTimeOffset": "10s"
}
}
]
}
]
}
}
Jalankan perintah berikut:
gcloud transcoder jobs create --location=LOCATION --file="request.json"
Anda akan melihat respons seperti berikut:
{
"name": "projects/PROJECT_NUMBER /locations/LOCATION /jobs/JOB_ID ",
"config": {
...
},
"state": "PENDING",
"createTime": CREATE_TIME ,
"ttlAfterCompletionDays": 30
}
Go
Sebelum mencoba contoh ini, ikuti petunjuk penyiapan Go di
Panduan memulai Transcoder API menggunakan
library klien .
Untuk informasi selengkapnya, lihat Dokumentasi referensi API Go Transcoder API .
Untuk melakukan autentikasi ke Transcoder API, siapkan Kredensial Default Aplikasi.
Untuk mengetahui informasi selengkapnya, baca
Menyiapkan autentikasi untuk lingkungan pengembangan lokal .
import (
"context"
"fmt"
"io"
"github.com/golang/protobuf/ptypes/duration"
transcoder "cloud.google.com/go/video/transcoder/apiv1"
"cloud.google.com/go/video/transcoder/apiv1/transcoderpb"
)
// createJobWithStaticOverlay creates a job based on a given configuration that
// includes a static overlay. See
// https://cloud.google.com/transcoder/docs/how-to/create-overlays#create-static-overlay
// for more information.
func createJobWithStaticOverlay(w io.Writer, projectID string, location string, inputURI string, overlayImageURI string, outputURI string) error {
// projectID := "my-project-id"
// location := "us-central1"
// inputURI := "gs://my-bucket/my-video-file"
// overlayImageURI := "gs://my-bucket/my-overlay-image-file"
// outputURI := "gs://my-bucket/my-output-folder/"
ctx := context.Background()
client, err := transcoder.NewClient(ctx)
if err != nil {
return fmt.Errorf("NewClient: %w", err)
}
defer client.Close()
req := &transcoderpb.CreateJobRequest{
Parent: fmt.Sprintf("projects/%s/locations/%s", projectID, location),
Job: &transcoderpb.Job{
InputUri: inputURI,
OutputUri: outputURI,
JobConfig: &transcoderpb.Job_Config{
Config: &transcoderpb.JobConfig{
ElementaryStreams: []*transcoderpb.ElementaryStream{
{
Key: "video_stream0",
ElementaryStream: &transcoderpb.ElementaryStream_VideoStream{
VideoStream: &transcoderpb.VideoStream{
CodecSettings: &transcoderpb.VideoStream_H264{
H264: &transcoderpb.VideoStream_H264CodecSettings{
BitrateBps: 550000,
FrameRate: 60,
HeightPixels: 360,
WidthPixels: 640,
},
},
},
},
},
{
Key: "audio_stream0",
ElementaryStream: &transcoderpb.ElementaryStream_AudioStream{
AudioStream: &transcoderpb.AudioStream{
Codec: "aac",
BitrateBps: 64000,
},
},
},
},
MuxStreams: []*transcoderpb.MuxStream{
{
Key: "sd",
Container: "mp4",
ElementaryStreams: []string{"video_stream0", "audio_stream0"},
},
},
Overlays: []*transcoderpb.Overlay{
{
Image: &transcoderpb.Overlay_Image{
Uri: overlayImageURI,
Resolution: &transcoderpb.Overlay_NormalizedCoordinate{
X: 1,
Y: 0.5,
},
Alpha: 1,
},
Animations: []*transcoderpb.Overlay_Animation{
{
AnimationType: &transcoderpb.Overlay_Animation_AnimationStatic{
AnimationStatic: &transcoderpb.Overlay_AnimationStatic{
Xy: &transcoderpb.Overlay_NormalizedCoordinate{
X: 0,
Y: 0,
},
StartTimeOffset: &duration.Duration{
Seconds: 0,
},
},
},
},
{
AnimationType: &transcoderpb.Overlay_Animation_AnimationEnd{
AnimationEnd: &transcoderpb.Overlay_AnimationEnd{
StartTimeOffset: &duration.Duration{
Seconds: 10,
},
},
},
},
},
},
},
},
},
},
}
// Creates the job. Jobs take a variable amount of time to run.
// You can query for the job state; see getJob() in get_job.go.
response, err := client.CreateJob(ctx, req)
if err != nil {
return fmt.Errorf("createJobWithStaticOverlay: %w", err)
}
fmt.Fprintf(w, "Job: %v", response.GetName())
return nil
}
Node.js
Sebelum mencoba contoh ini, ikuti petunjuk penyiapan Node.js di
Panduan memulai Transcoder API menggunakan
library klien .
Untuk informasi selengkapnya, lihat Dokumentasi referensi API Node.js Transcoder API .
Untuk melakukan autentikasi ke Transcoder API, siapkan Kredensial Default Aplikasi.
Untuk mengetahui informasi selengkapnya, baca
Menyiapkan autentikasi untuk lingkungan pengembangan lokal .
/**
* TODO(developer): Uncomment these variables before running the sample.
*/
// projectId = 'my-project-id';
// location = 'us-central1';
// inputUri = 'gs://my-bucket/my-video-file';
// overlayImageUri = 'gs://my-bucket/my-overlay-image-file';
// outputUri = 'gs://my-bucket/my-output-folder/';
// Imports the Transcoder library
const {TranscoderServiceClient} =
require('@google-cloud/video-transcoder').v1;
// Instantiates a client
const transcoderServiceClient = new TranscoderServiceClient();
async function createJobFromStaticOverlay() {
// Construct request
const request = {
parent: transcoderServiceClient.locationPath(projectId, location),
job: {
inputUri: inputUri,
outputUri: outputUri,
config: {
elementaryStreams: [
{
key: 'video-stream0',
videoStream: {
h264: {
heightPixels: 360,
widthPixels: 640,
bitrateBps: 550000,
frameRate: 60,
},
},
},
{
key: 'audio-stream0',
audioStream: {
codec: 'aac',
bitrateBps: 64000,
},
},
],
muxStreams: [
{
key: 'sd',
container: 'mp4',
elementaryStreams: ['video-stream0', 'audio-stream0'],
},
],
overlays: [
{
image: {
uri: overlayImageUri,
resolution: {
x: 1,
y: 0.5,
},
alpha: 1.0,
},
animations: [
{
animationStatic: {
xy: {
x: 0,
y: 0,
},
startTimeOffset: {
seconds: 0,
},
},
},
{
animationEnd: {
startTimeOffset: {
seconds: 10,
},
},
},
],
},
],
},
},
};
// Run request
const [response] = await transcoderServiceClient.createJob(request);
console.log(`Job: ${response.name}`);
}
createJobFromStaticOverlay();
Python
Sebelum mencoba contoh ini, ikuti petunjuk penyiapan Python di
Panduan memulai Transcoder API menggunakan
library klien .
Untuk informasi selengkapnya, lihat Dokumentasi referensi API Python Transcoder API .
Untuk melakukan autentikasi ke Transcoder API, siapkan Kredensial Default Aplikasi.
Untuk mengetahui informasi selengkapnya, baca
Menyiapkan autentikasi untuk lingkungan pengembangan lokal .
import argparse
from google.cloud.video import transcoder_v1
from google.cloud.video.transcoder_v1.services.transcoder_service import (
TranscoderServiceClient,
)
from google.protobuf import duration_pb2 as duration
def create_job_with_static_overlay(
project_id: str,
location: str,
input_uri: str,
overlay_image_uri: str,
output_uri: str,
) -> transcoder_v1.types.resources.Job:
"""Creates a job based on an ad-hoc job configuration that includes a static image overlay.
Args:
project_id: The GCP project ID.
location: The location to start the job in.
input_uri: Uri of the video in the Cloud Storage bucket.
overlay_image_uri: Uri of the image for the overlay in the Cloud Storage bucket.
output_uri: Uri of the video output folder in the Cloud Storage bucket.
Returns:
The job resource.
"""
client = TranscoderServiceClient()
parent = f"projects/{project_id}/locations/{location}"
job = transcoder_v1.types.Job()
job.input_uri = input_uri
job.output_uri = output_uri
job.config = transcoder_v1.types.JobConfig(
elementary_streams=[
transcoder_v1.types.ElementaryStream(
key="video-stream0",
video_stream=transcoder_v1.types.VideoStream(
h264=transcoder_v1.types.VideoStream.H264CodecSettings(
height_pixels=360,
width_pixels=640,
bitrate_bps=550000,
frame_rate=60,
),
),
),
transcoder_v1.types.ElementaryStream(
key="audio-stream0",
audio_stream=transcoder_v1.types.AudioStream(
codec="aac", bitrate_bps=64000
),
),
],
mux_streams=[
transcoder_v1.types.MuxStream(
key="sd",
container="mp4",
elementary_streams=["video-stream0", "audio-stream0"],
),
],
overlays=[
transcoder_v1.types.Overlay(
image=transcoder_v1.types.Overlay.Image(
uri=overlay_image_uri,
resolution=transcoder_v1.types.Overlay.NormalizedCoordinate(
x=1,
y=0.5,
),
alpha=1,
),
animations=[
transcoder_v1.types.Overlay.Animation(
animation_static=transcoder_v1.types.Overlay.AnimationStatic(
xy=transcoder_v1.types.Overlay.NormalizedCoordinate(
x=0,
y=0,
),
start_time_offset=duration.Duration(
seconds=0,
),
),
),
transcoder_v1.types.Overlay.Animation(
animation_end=transcoder_v1.types.Overlay.AnimationEnd(
start_time_offset=duration.Duration(
seconds=10,
),
),
),
],
),
],
)
response = client.create_job(parent=parent, job=job)
print(f"Job: {response.name}")
return response
Dalam video output, overlay statis memiliki karakteristik berikut:
Tombol ini muncul di awal linimasa dan terlihat selama 10 detik.
Gambar ini merentangkan lebar penuh dan setengah dari tinggi video output.
Ikon ini diposisikan di pojok kiri atas video output.
Lihat video output contoh untuk
konfigurasi ini. Video ini menggunakan
gambar overlay contoh .
Membuat overlay animasi
Pada objek image
, gunakan kolom uri
untuk menentukan gambar overlay di Cloud Storage. Pada objek resolution
, tetapkan
nilai x dan y dari 0 hingga 1,0. Nilai 0 mempertahankan resolusi
gambar sumber untuk dimensi tersebut; nilai 1,0 akan merentangkan gambar agar sesuai
dengan dimensi video output. Misalnya, gunakan nilai x: 0
dan y: 0
untuk mempertahankan resolusi asli gambar overlay.
Dalam array animations
, buat objek animationFade
dengan fadeType
dari FADE_IN
. Menetapkan koordinat x dan y dari 0 hingga 1,0. Koordinat ini didasarkan pada resolusi video output. Gunakan nilai x: 0.5
dan y: 0.5
untuk
memosisikan sudut kiri atas overlay di tengah video output.
Tentukan kapan overlay akan mulai muncul di linimasa video output
menggunakan kolom startTimeOffset
. Overlay harus terlihat sepenuhnya pada
waktu yang disetel di kolom endTimeOffset
.
Untuk memudarkan overlay, buat objek animationFade
lain. Kali ini, tetapkan
fadeType
ke FADE_OUT
. Masukkan koordinat posisi serta waktu mulai dan berakhir seperti sebelumnya.
Anda dapat menambahkan konfigurasi ini ke template tugas atau menyertakannya dalam konfigurasi tugas ad-hoc :
REST
Sebelum menggunakan salah satu data permintaan,
lakukan penggantian berikut:
PROJECT_ID
: Project ID Google Cloud Anda yang tercantum di Setelan IAM .
LOCATION
: Lokasi tempat tugas akan dijalankan. Gunakan salah satu wilayah yang didukung .
Tampilkan lokasi
us-central1
us-west1
us-west2
us-east1
us-east4
southamerica-east1
asia-east1
asia-south1
asia-southeast1
europe-west1
europe-west2
europe-west4
STORAGE_BUCKET_NAME
: Nama bucket Cloud Storage yang Anda buat.
STORAGE_INPUT_VIDEO
: Nama video di bucket Cloud Storage yang di-transcoding, seperti my-vid.mp4
.
Kolom ini harus mempertimbangkan setiap folder yang Anda buat di bucket (misalnya, input/my-vid.mp4
).
STORAGE_INPUT_OVERLAY
: Nama gambar di bucket Cloud Storage yang Anda gunakan untuk overlay, seperti my-overlay.png
. Kolom ini harus mempertimbangkan setiap folder yang Anda buat di bucket (misalnya, input/my-overlay.png
).
STORAGE_OUTPUT_FOLDER
: Nama folder Cloud Storage
tempat Anda ingin menyimpan output video yang dienkode.
Catatan: Anda tidak perlu membuat objek folder output sebelum
membuat tugas. Saat memproses tugas, Transcoder API secara otomatis menambahkan nama folder yang Anda tentukan sebagai bagian dari nama objek yang disimpan ke Cloud Storage.
Untuk mengirim permintaan Anda, perluas salah satu opsi berikut:
curl (Linux, macOS, atau Cloud Shell)
Catatan:
Perintah berikut mengasumsikan bahwa Anda telah login ke CLI gcloud
dengan akun pengguna Anda dengan menjalankan gcloud init
atau gcloud auth login
, atau menggunakan Cloud Shell , yang secara otomatis membuat Anda login ke CLI gcloud
.
Anda dapat memeriksa akun yang aktif saat ini dengan menjalankan
gcloud auth list
.
Simpan isi permintaan dalam file bernama request.json
.
Jalankan perintah berikut di terminal untuk membuat atau menimpa file ini di direktori saat ini:
cat > request.json << 'EOF'
{
"config": {
"inputs": [
{
"key": "input0",
"uri": "gs://STORAGE_BUCKET_NAME /STORAGE_INPUT_VIDEO "
}
],
"elementaryStreams": [
{
"key": "video-stream0",
"videoStream": {
"h264": {
"heightPixels": 360,
"widthPixels": 640,
"bitrateBps": 550000,
"frameRate": 60
}
}
},
{
"key": "audio-stream0",
"audioStream": {
"codec": "aac",
"bitrateBps": 64000
}
}
],
"muxStreams": [
{
"key": "sd",
"container": "mp4",
"elementaryStreams": [
"video-stream0",
"audio-stream0"
]
}
],
"output": {
"uri": "gs://STORAGE_BUCKET_NAME /STORAGE_OUTPUT_FOLDER /"
},
"overlays": [
{
"image": {
"uri": "gs://STORAGE_BUCKET_NAME /STORAGE_INPUT_OVERLAY ",
"resolution": {
"x": 0,
"y": 0
},
"alpha": 1
},
"animations": [
{
"animationFade": {
"fadeType": "FADE_IN",
"xy": {
"x": 0.5,
"y": 0.5
},
"startTimeOffset": "5s",
"endTimeOffset": "10s"
}
},
{
"animationFade": {
"fadeType": "FADE_OUT",
"xy": {
"x": 0.5,
"y": 0.5
},
"startTimeOffset": "12s",
"endTimeOffset": "15s"
}
}
]
}
]
}
}
EOF
Kemudian jalankan perintah berikut untuk mengirim permintaan REST Anda:
curl -X POST \ -H "Authorization: Bearer $(gcloud auth print-access-token)" \ -H "Content-Type: application/json; charset=utf-8" \ -d @request.json \ "https://transcoder.googleapis.com/v1/projects/PROJECT_ID /locations/LOCATION /jobs"
PowerShell (Windows)
Catatan: Perintah berikut mengasumsikan bahwa Anda telah login ke CLI gcloud
dengan akun pengguna Anda dengan menjalankan gcloud init
atau gcloud auth login
.
Anda dapat memeriksa akun yang aktif saat ini dengan menjalankan
gcloud auth list
.
Simpan isi permintaan dalam file bernama request.json
.
Jalankan perintah berikut di terminal untuk membuat atau menimpa file ini di direktori saat ini:
@'
{
"config": {
"inputs": [
{
"key": "input0",
"uri": "gs://STORAGE_BUCKET_NAME /STORAGE_INPUT_VIDEO "
}
],
"elementaryStreams": [
{
"key": "video-stream0",
"videoStream": {
"h264": {
"heightPixels": 360,
"widthPixels": 640,
"bitrateBps": 550000,
"frameRate": 60
}
}
},
{
"key": "audio-stream0",
"audioStream": {
"codec": "aac",
"bitrateBps": 64000
}
}
],
"muxStreams": [
{
"key": "sd",
"container": "mp4",
"elementaryStreams": [
"video-stream0",
"audio-stream0"
]
}
],
"output": {
"uri": "gs://STORAGE_BUCKET_NAME /STORAGE_OUTPUT_FOLDER /"
},
"overlays": [
{
"image": {
"uri": "gs://STORAGE_BUCKET_NAME /STORAGE_INPUT_OVERLAY ",
"resolution": {
"x": 0,
"y": 0
},
"alpha": 1
},
"animations": [
{
"animationFade": {
"fadeType": "FADE_IN",
"xy": {
"x": 0.5,
"y": 0.5
},
"startTimeOffset": "5s",
"endTimeOffset": "10s"
}
},
{
"animationFade": {
"fadeType": "FADE_OUT",
"xy": {
"x": 0.5,
"y": 0.5
},
"startTimeOffset": "12s",
"endTimeOffset": "15s"
}
}
]
}
]
}
}
'@ | Out-File -FilePath request.json -Encoding utf8
Kemudian jalankan perintah berikut untuk mengirim permintaan REST Anda:
$cred = gcloud auth print-access-token $headers = @{ "Authorization" = "Bearer $cred" } Invoke-WebRequest ` -Method POST ` -Headers $headers ` -ContentType: "application/json; charset=utf-8" ` -InFile request.json ` -Uri "https://transcoder.googleapis.com/v1/projects/PROJECT_ID /locations/LOCATION /jobs" | Select-Object -Expand Content
Anda akan melihat respons JSON seperti berikut:
{
"name": "projects/PROJECT_NUMBER /locations/LOCATION /jobs/JOB_ID ",
"config": {
...
},
"state": "PENDING",
"createTime": CREATE_TIME ,
"ttlAfterCompletionDays": 30
}
gcloud
Buat file request.json
yang menentukan kolom lowongan. Lakukan
pengganti berikut untuk perintah
gcloud
:
STORAGE_BUCKET_NAME : Nama bucket Cloud Storage yang Anda buat.
STORAGE_INPUT_VIDEO : Nama video di bucket Cloud Storage yang di-transcoding, seperti my-vid.mp4
. Kolom ini harus mempertimbangkan setiap folder yang Anda buat di bucket (misalnya, input/my-vid.mp4
).
STORAGE_INPUT_OVERLAY : Nama file gambar di bucket Cloud Storage yang Anda gunakan untuk overlay, seperti my-overlay.png
. Kolom ini harus mempertimbangkan setiap folder yang Anda buat di bucket (misalnya, input/my-overlay.png
).
LOCATION : Lokasi tempat
tugas akan dijalankan. Gunakan lokasi dari daftar berikut.
Tampilkan lokasi
us-central1
us-west1
us-west2
us-east1
us-east4
southamerica-east1
asia-east1
asia-south1
asia-southeast1
europe-west1
europe-west2
europe-west4
STORAGE_OUTPUT_FOLDER : Nama folder Cloud Storage tempat Anda ingin menyimpan output video yang dienkode.
Catatan: Anda tidak perlu membuat objek folder output sebelum
membuat tugas. Saat memproses tugas, Transcoder API secara otomatis menambahkan nama folder yang Anda tentukan sebagai bagian dari nama objek yang disimpan ke Cloud Storage.
{
"config": {
"inputs": [
{
"key": "input0",
"uri": "gs://STORAGE_BUCKET_NAME /STORAGE_INPUT_VIDEO "
}
],
"elementaryStreams": [
{
"key": "video-stream0",
"videoStream": {
"h264": {
"heightPixels": 360,
"widthPixels": 640,
"bitrateBps": 550000,
"frameRate": 60
}
}
},
{
"key": "audio-stream0",
"audioStream": {
"codec": "aac",
"bitrateBps": 64000
}
}
],
"muxStreams": [
{
"key": "sd",
"container": "mp4",
"elementaryStreams": [
"video-stream0",
"audio-stream0"
]
}
],
"output": {
"uri": "gs://STORAGE_BUCKET_NAME /STORAGE_OUTPUT_FOLDER /"
},
"overlays": [
{
"image": {
"uri": "gs://STORAGE_BUCKET_NAME /STORAGE_INPUT_OVERLAY ",
"resolution": {
"x": 0,
"y": 0
},
"alpha": 1
},
"animations": [
{
"animationFade": {
"fadeType": "FADE_IN",
"xy": {
"x": 0.5,
"y": 0.5
},
"startTimeOffset": "5s",
"endTimeOffset": "10s"
}
},
{
"animationFade": {
"fadeType": "FADE_OUT",
"xy": {
"x": 0.5,
"y": 0.5
},
"startTimeOffset": "12s",
"endTimeOffset": "15s"
}
}
]
}
]
}
}
Jalankan perintah berikut:
gcloud transcoder jobs create --location=LOCATION --file="request.json"
Anda akan melihat respons seperti berikut:
{
"name": "projects/PROJECT_NUMBER /locations/LOCATION /jobs/JOB_ID ",
"config": {
...
},
"state": "PENDING",
"createTime": CREATE_TIME ,
"ttlAfterCompletionDays": 30
}
Go
Sebelum mencoba contoh ini, ikuti petunjuk penyiapan Go di
Panduan memulai Transcoder API menggunakan
library klien .
Untuk informasi selengkapnya, lihat Dokumentasi referensi API Go Transcoder API .
Untuk melakukan autentikasi ke Transcoder API, siapkan Kredensial Default Aplikasi.
Untuk mengetahui informasi selengkapnya, baca
Menyiapkan autentikasi untuk lingkungan pengembangan lokal .
import (
"context"
"fmt"
"io"
"github.com/golang/protobuf/ptypes/duration"
transcoder "cloud.google.com/go/video/transcoder/apiv1"
"cloud.google.com/go/video/transcoder/apiv1/transcoderpb"
)
// createJobWithAnimatedOverlay creates a job based on a given configuration that
// includes an animated overlay. See
// https://cloud.google.com/transcoder/docs/how-to/create-overlays#create-animated-overlay
// for more information.
func createJobWithAnimatedOverlay(w io.Writer, projectID string, location string, inputURI string, overlayImageURI string, outputURI string) error {
// projectID := "my-project-id"
// location := "us-central1"
// inputURI := "gs://my-bucket/my-video-file"
// overlayImageURI := "gs://my-bucket/my-overlay-image-file"
// outputURI := "gs://my-bucket/my-output-folder/"
ctx := context.Background()
client, err := transcoder.NewClient(ctx)
if err != nil {
return fmt.Errorf("NewClient: %w", err)
}
defer client.Close()
req := &transcoderpb.CreateJobRequest{
Parent: fmt.Sprintf("projects/%s/locations/%s", projectID, location),
Job: &transcoderpb.Job{
InputUri: inputURI,
OutputUri: outputURI,
JobConfig: &transcoderpb.Job_Config{
Config: &transcoderpb.JobConfig{
ElementaryStreams: []*transcoderpb.ElementaryStream{
{
Key: "video_stream0",
ElementaryStream: &transcoderpb.ElementaryStream_VideoStream{
VideoStream: &transcoderpb.VideoStream{
CodecSettings: &transcoderpb.VideoStream_H264{
H264: &transcoderpb.VideoStream_H264CodecSettings{
BitrateBps: 550000,
FrameRate: 60,
HeightPixels: 360,
WidthPixels: 640,
},
},
},
},
},
{
Key: "audio_stream0",
ElementaryStream: &transcoderpb.ElementaryStream_AudioStream{
AudioStream: &transcoderpb.AudioStream{
Codec: "aac",
BitrateBps: 64000,
},
},
},
},
MuxStreams: []*transcoderpb.MuxStream{
{
Key: "sd",
Container: "mp4",
ElementaryStreams: []string{"video_stream0", "audio_stream0"},
},
},
Overlays: []*transcoderpb.Overlay{
{
Image: &transcoderpb.Overlay_Image{
Uri: overlayImageURI,
Resolution: &transcoderpb.Overlay_NormalizedCoordinate{
X: 0,
Y: 0,
},
Alpha: 1,
},
Animations: []*transcoderpb.Overlay_Animation{
{
AnimationType: &transcoderpb.Overlay_Animation_AnimationFade{
AnimationFade: &transcoderpb.Overlay_AnimationFade{
FadeType: transcoderpb.Overlay_FADE_IN,
Xy: &transcoderpb.Overlay_NormalizedCoordinate{
X: 0.5,
Y: 0.5,
},
StartTimeOffset: &duration.Duration{
Seconds: 5,
},
EndTimeOffset: &duration.Duration{
Seconds: 10,
},
},
},
},
{
AnimationType: &transcoderpb.Overlay_Animation_AnimationFade{
AnimationFade: &transcoderpb.Overlay_AnimationFade{
FadeType: transcoderpb.Overlay_FADE_OUT,
Xy: &transcoderpb.Overlay_NormalizedCoordinate{
X: 0.5,
Y: 0.5,
},
StartTimeOffset: &duration.Duration{
Seconds: 12,
},
EndTimeOffset: &duration.Duration{
Seconds: 15,
},
},
},
},
},
},
},
},
},
},
}
// Creates the job. Jobs take a variable amount of time to run.
// You can query for the job state; see getJob() in get_job.go.
response, err := client.CreateJob(ctx, req)
if err != nil {
return fmt.Errorf("createJobWithAnimatedOverlay: %w", err)
}
fmt.Fprintf(w, "Job: %v", response.GetName())
return nil
}
Node.js
Sebelum mencoba contoh ini, ikuti petunjuk penyiapan Node.js di
Panduan memulai Transcoder API menggunakan
library klien .
Untuk informasi selengkapnya, lihat Dokumentasi referensi API Node.js Transcoder API .
Untuk melakukan autentikasi ke Transcoder API, siapkan Kredensial Default Aplikasi.
Untuk mengetahui informasi selengkapnya, baca
Menyiapkan autentikasi untuk lingkungan pengembangan lokal .
/**
* TODO(developer): Uncomment these variables before running the sample.
*/
// projectId = 'my-project-id';
// location = 'us-central1';
// inputUri = 'gs://my-bucket/my-video-file';
// overlayImageUri = 'gs://my-bucket/my-overlay-image-file';
// outputUri = 'gs://my-bucket/my-output-folder/';
// Imports the Transcoder library
const {TranscoderServiceClient} =
require('@google-cloud/video-transcoder').v1;
// Instantiates a client
const transcoderServiceClient = new TranscoderServiceClient();
async function createJobFromAnimatedOverlay() {
// Construct request
const request = {
parent: transcoderServiceClient.locationPath(projectId, location),
job: {
inputUri: inputUri,
outputUri: outputUri,
config: {
elementaryStreams: [
{
key: 'video-stream0',
videoStream: {
h264: {
heightPixels: 360,
widthPixels: 640,
bitrateBps: 550000,
frameRate: 60,
},
},
},
{
key: 'audio-stream0',
audioStream: {
codec: 'aac',
bitrateBps: 64000,
},
},
],
muxStreams: [
{
key: 'sd',
container: 'mp4',
elementaryStreams: ['video-stream0', 'audio-stream0'],
},
],
overlays: [
{
image: {
uri: overlayImageUri,
resolution: {
x: 0,
y: 0,
},
alpha: 1.0,
},
animations: [
{
animationFade: {
fadeType: 'FADE_IN',
xy: {
x: 0.5,
y: 0.5,
},
startTimeOffset: {
seconds: 5,
},
endTimeOffset: {
seconds: 10,
},
},
},
{
animationFade: {
fadeType: 'FADE_OUT',
xy: {
x: 0.5,
y: 0.5,
},
startTimeOffset: {
seconds: 12,
},
endTimeOffset: {
seconds: 15,
},
},
},
],
},
],
},
},
};
// Run request
const [response] = await transcoderServiceClient.createJob(request);
console.log(`Job: ${response.name}`);
}
createJobFromAnimatedOverlay();
Python
Sebelum mencoba contoh ini, ikuti petunjuk penyiapan Python di
Panduan memulai Transcoder API menggunakan
library klien .
Untuk informasi selengkapnya, lihat Dokumentasi referensi API Python Transcoder API .
Untuk melakukan autentikasi ke Transcoder API, siapkan Kredensial Default Aplikasi.
Untuk mengetahui informasi selengkapnya, baca
Menyiapkan autentikasi untuk lingkungan pengembangan lokal .
import argparse
from google.cloud.video import transcoder_v1
from google.cloud.video.transcoder_v1.services.transcoder_service import (
TranscoderServiceClient,
)
from google.protobuf import duration_pb2 as duration
def create_job_with_animated_overlay(
project_id: str,
location: str,
input_uri: str,
overlay_image_uri: str,
output_uri: str,
) -> transcoder_v1.types.resources.Job:
"""Creates a job based on an ad-hoc job configuration that includes an animated image overlay.
Args:
project_id: The GCP project ID.
location: The location to start the job in.
input_uri: Uri of the video in the Cloud Storage bucket.
overlay_image_uri: Uri of the image for the overlay in the Cloud Storage bucket.
output_uri: Uri of the video output folder in the Cloud Storage bucket.
Returns:
The job resource.
"""
client = TranscoderServiceClient()
parent = f"projects/{project_id}/locations/{location}"
job = transcoder_v1.types.Job()
job.input_uri = input_uri
job.output_uri = output_uri
job.config = transcoder_v1.types.JobConfig(
elementary_streams=[
transcoder_v1.types.ElementaryStream(
key="video-stream0",
video_stream=transcoder_v1.types.VideoStream(
h264=transcoder_v1.types.VideoStream.H264CodecSettings(
height_pixels=360,
width_pixels=640,
bitrate_bps=550000,
frame_rate=60,
),
),
),
transcoder_v1.types.ElementaryStream(
key="audio-stream0",
audio_stream=transcoder_v1.types.AudioStream(
codec="aac", bitrate_bps=64000
),
),
],
mux_streams=[
transcoder_v1.types.MuxStream(
key="sd",
container="mp4",
elementary_streams=["video-stream0", "audio-stream0"],
),
],
overlays=[
transcoder_v1.types.Overlay(
image=transcoder_v1.types.Overlay.Image(
uri=overlay_image_uri,
resolution=transcoder_v1.types.Overlay.NormalizedCoordinate(
x=0,
y=0,
),
alpha=1,
),
animations=[
transcoder_v1.types.Overlay.Animation(
animation_fade=transcoder_v1.types.Overlay.AnimationFade(
fade_type=transcoder_v1.types.Overlay.FadeType.FADE_IN,
xy=transcoder_v1.types.Overlay.NormalizedCoordinate(
x=0.5,
y=0.5,
),
start_time_offset=duration.Duration(
seconds=5,
),
end_time_offset=duration.Duration(
seconds=10,
),
),
),
transcoder_v1.types.Overlay.Animation(
animation_fade=transcoder_v1.types.Overlay.AnimationFade(
fade_type=transcoder_v1.types.Overlay.FadeType.FADE_OUT,
xy=transcoder_v1.types.Overlay.NormalizedCoordinate(
x=0.5,
y=0.5,
),
start_time_offset=duration.Duration(
seconds=12,
),
end_time_offset=duration.Duration(
seconds=15,
),
),
),
],
),
],
)
response = client.create_job(parent=parent, job=job)
print(f"Job: {response.name}")
return response
Pada video yang dihasilkan, overlay animasi memiliki karakteristik berikut:
Ikon mulai memudar pada tanda 5 detik dalam video output. Nilai alfa
untuk overlay dimulai dari 0 dan berakhir di 1,0. Sudut kiri atas
overlay muncul di tengah video output. Overlay akan muncul
dengan resolusi asli gambar overlay.
Setelah menghilang, overlay akan ditampilkan selama 2 detik.
Tombol mulai memudar pada tanda 12 detik dalam video output. Nilai alfa
untuk overlay dimulai dari 1,0 dan berakhir di 0.
Animasi akan menghilang selama tanda 15 detik.
Lihat video output contoh
untuk konfigurasi ini. Video ini menggunakan
gambar overlay contoh .