このページでは、コード変換された動画にオーバーレイを挿入する方法について説明します。オーバーレイは出力動画の上に重ねて挿入される画像で構成され、必要に応じて指定した期間内でフェードインまたはフェードアウトできます。オーバーレイを挿入するには、JobConfig
テンプレート内の overlays
配列を使用します。
サポートされている画像ファイル形式のリスト をご覧ください。
Cloud Storage に画像をアップロードする
まず、次の手順で、オーバーレイ イメージを Cloud Storage バケットにアップロードします。
Google Cloud コンソールで、Cloud Storage ブラウザページに移動します。[Cloud Storage ブラウザ] ページに移動
バケットの名前をクリックしてバケットを開きます。
[ファイルをアップロード ] をクリックします。
ローカルマシンからアップロードする画像ファイルを選択します。
オーバーレイを作成する
静的 とアニメーション の 2 種類のオーバーレイを作成できます。どちらのオーバーレイも静止画像を使用します。静的オーバーレイの表示と非表示を切り替えることができます。アニメーション オーバーレイは、画像のフェードインとフェードアウトをサポートしています。
1 つの出力動画に複数のオーバーレイを挿入できます。
静的オーバーレイを作成する
image
オブジェクトの uri
フィールドを使用して、Cloud Storage 内のオーバーレイ イメージを指定します。resolution
オブジェクトで、x と y の値を 0~1.0 に設定します。値が 0 の場合は、そのサイズに対するソース画像の解像度が維持されます。値が 1.0 の場合は、出力動画のサイズに合わせて画像が伸縮されます。たとえば、x: 1
と y:
0.5
の値を使用すると、出力動画と同じ幅で、高さは出力動画の半分に伸縮されます。
animations
配列で、x と y 座標が 0 から 1.0 の animationStatic
オブジェクトを作成します。これらの座標は、出力動画の解像度に基づきます。値 x: 0
と y: 0
を使用して、出力動画の左上隅にオーバーレイの左上隅を配置します。オーバーレイを出力動画のタイムラインに表示するタイミングは、startTimeOffset
フィールドを使用して指定します。
静的アニメーションを削除するには、animationEnd
オブジェクトを作成します。startTimeOffset
フィールドを使用して、出力動画タイムラインでアニメーションを終了する(つまり、オーバーレイを非表示にする)タイミングを指定します。
この構成をジョブ テンプレート に追加するか、アドホック ジョブ構成 に含めることができます。
REST
リクエストのデータを使用する前に、次のように置き換えます。
PROJECT_ID
: IAM 設定 に載っている Google Cloud プロジェクト ID。
LOCATION
: ジョブを実行するロケーション。サポートされているリージョン のいずれかを使用します。
3~7 つの店舗を表示
us-central1
us-west1
us-west2
us-east1
us-east4
southamerica-east1
northamerica-northeast1
asia-east1
asia-northeast1
asia-northeast3
asia-south1
asia-southeast1
australia-southeast1
europe-west1
europe-west2
europe-west4
STORAGE_BUCKET_NAME
: 作成した Cloud Storage バケットの名前。
STORAGE_INPUT_VIDEO
: コード変換する Cloud Storage バケット内の動画の名前(my-vid.mp4
など)。このフィールドでは、バケットで作成したフォルダ(input/my-vid.mp4
など)を考慮する必要があります。
STORAGE_INPUT_OVERLAY
: Cloud Storage バケットにありオーバーレイに使用する画像の名前(my-overlay.png
など)。このフィールドでは、バケットで作成したフォルダ(input/my-overlay.png
など)を考慮する必要があります。
STORAGE_OUTPUT_FOLDER
: エンコードされた動画出力を保存する Cloud Storage フォルダ名。注: ジョブを作成する前に出力フォルダ オブジェクトを作成する必要はありません。ジョブを処理する際、Transcoder API は、自動的に指定したフォルダ名を Cloud Storage に保存されたオブジェクトの名前の一部として先頭に付加します。
リクエストを送信するには、次のいずれかのオプションを展開します。
curl(Linux、macOS、Cloud Shell)
リクエスト本文を request.json
という名前のファイルに保存します。ターミナルで次のコマンドを実行して、このファイルを現在のディレクトリに作成または上書きします。
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
その後、次のコマンドを実行して REST リクエストを送信します。
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)
リクエスト本文を request.json
という名前のファイルに保存します。ターミナルで次のコマンドを実行して、このファイルを現在のディレクトリに作成または上書きします。
@'
{
"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
その後、次のコマンドを実行して REST リクエストを送信します。
$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
次のような JSON レスポンスが返されます。
{
"name": "projects/PROJECT_NUMBER /locations/LOCATION /jobs/JOB_ID ",
"config": {
...
},
"state": "PENDING",
"createTime": CREATE_TIME ,
"ttlAfterCompletionDays": 30
}
gcloud
ジョブ フィールドを定義する request.json
ファイルを作成します。gcloud
コマンドを次のように置き換えます。STORAGE_BUCKET_NAME : 作成した Cloud Storage バケットの名前。
STORAGE_INPUT_VIDEO : コード変換する Cloud Storage バケット内の動画の名前(my-vid.mp4
など)。このフィールドでは、バケットで作成したフォルダ(input/my-vid.mp4
など)を考慮する必要があります。
STORAGE_INPUT_OVERLAY : Cloud Storage バケットにありオーバーレイに使用する画像ファイルの名前(my-overlay.png
など)。このフィールドでは、バケットに作成したフォルダ(input/my-overlay.png
など)を含める必要があります。
LOCATION : ジョブを実行するロケーション。次に挙げるロケーションの 1 つを使用します。
3~7 つの店舗を表示
us-central1
us-west1
us-west2
us-east1
us-east4
southamerica-east1
northamerica-northeast1
asia-east1
asia-northeast1
asia-northeast3
asia-south1
asia-southeast1
australia-southeast1
europe-west1
europe-west2
europe-west4
STORAGE_OUTPUT_FOLDER : エンコードされた動画出力を保存する Cloud Storage フォルダ名。注: ジョブを作成する前に出力フォルダ オブジェクトを作成する必要はありません。ジョブを処理する際、Transcoder API は、自動的に指定したフォルダ名を 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"
}
}
]
}
]
}
}
次のコマンドを実行します。
gcloud transcoder jobs create --location=LOCATION --file="request.json"
次のようなレスポンスが表示されます。
{
"name": "projects/PROJECT_NUMBER /locations/LOCATION /jobs/JOB_ID ",
"config": {
...
},
"state": "PENDING",
"createTime": CREATE_TIME ,
"ttlAfterCompletionDays": 30
}
Go
このサンプルを試す前に、クライアント ライブラリを使用した Transcoder API クイックスタート にある Go の設定手順を行ってください。
詳細については、Transcoder API Go の API のリファレンス ドキュメント をご覧ください。
Transcoder API への認証を行うには、アプリケーションのデフォルト認証情報を設定します。詳細については、ローカル開発環境の認証を設定する をご覧ください。
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
このサンプルを試す前に、クライアント ライブラリを使用した Transcoder API クイックスタート にある Node.js の設定手順を行ってください。
詳細については、Transcoder API Node.js の API のリファレンス ドキュメント をご覧ください。
Transcoder API への認証を行うには、アプリケーションのデフォルト認証情報を設定します。詳細については、ローカル開発環境の認証を設定する をご覧ください。
/**
* 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
このサンプルを試す前に、クライアント ライブラリを使用した Transcoder API クイックスタート にある Python の設定手順を行ってください。
詳細については、Transcoder API Python の API のリファレンス ドキュメント をご覧ください。
Transcoder API への認証を行うには、アプリケーションのデフォルト認証情報を設定します。詳細については、ローカル開発環境の認証を設定する をご覧ください。
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
出力動画に表示される静的オーバーレイは、次の特性を有しています。
タイムラインの始めに 10 秒間表示されます。
出力動画の全幅と半分の高さの両方を継承します。
出力動画の左上隅に配置されます。
この構成については、サンプル出力動画 をご覧ください。この動画では、サンプル オーバーレイ画像 を使用しています。
アニメーション オーバーレイの作成
image
オブジェクトの uri
フィールドを使用して、Cloud Storage 内のオーバーレイ イメージを指定します。resolution
オブジェクトで、x と y の値を 0~1.0 に設定します。値が 0 の場合は、そのサイズに対するソース画像の解像度が維持されます。値が 1.0 の場合は、出力動画のサイズに合わせて画像が伸縮されます。たとえば、値 x: 0
と y: 0
を使用して、オーバーレイ画像の元の解像度を維持します。
animations
配列で、fadeType
を FADE_IN
として animationFade
オブジェクトを作成します。x 座標と y 座標は、0~1.0 に設定します。これらの座標は、出力動画の解像度に基づきます。値 x: 0.5
と y: 0.5
を使用して、出力動画の中心にオーバーレイの左上隅を配置します。startTimeOffset
フィールドを使用して、出力動画タイムラインでオーバーレイを表示し始めるタイミングを指定します。オーバーレイは、endTimeOffset
フィールドで設定された時間に完全に表示されます。
オーバーレイをフェードアウトするには、別の animationFade
オブジェクトを作成します。今回は、fadeType
を FADE_OUT
に設定します。前と同じように、位置座標、開始時刻、終了時刻を入力します。
この構成をジョブ テンプレート に追加するか、アドホック ジョブ構成 に含めることができます。
REST
リクエストのデータを使用する前に、次のように置き換えます。
PROJECT_ID
: IAM 設定 に載っている Google Cloud プロジェクト ID。
LOCATION
: ジョブを実行するロケーション。サポートされているリージョン のいずれかを使用します。
3~7 つの店舗を表示
us-central1
us-west1
us-west2
us-east1
us-east4
southamerica-east1
northamerica-northeast1
asia-east1
asia-northeast1
asia-northeast3
asia-south1
asia-southeast1
australia-southeast1
europe-west1
europe-west2
europe-west4
STORAGE_BUCKET_NAME
: 作成した Cloud Storage バケットの名前。
STORAGE_INPUT_VIDEO
: コード変換する Cloud Storage バケット内の動画の名前(my-vid.mp4
など)。このフィールドでは、バケットで作成したフォルダ(input/my-vid.mp4
など)を考慮する必要があります。
STORAGE_INPUT_OVERLAY
: Cloud Storage バケットにありオーバーレイに使用する画像の名前(my-overlay.png
など)。このフィールドでは、バケットで作成したフォルダ(input/my-overlay.png
など)を考慮する必要があります。
STORAGE_OUTPUT_FOLDER
: エンコードされた動画出力を保存する Cloud Storage フォルダ名。注: ジョブを作成する前に出力フォルダ オブジェクトを作成する必要はありません。ジョブを処理する際、Transcoder API は、自動的に指定したフォルダ名を Cloud Storage に保存されたオブジェクトの名前の一部として先頭に付加します。
リクエストを送信するには、次のいずれかのオプションを展開します。
curl(Linux、macOS、Cloud Shell)
リクエスト本文を request.json
という名前のファイルに保存します。ターミナルで次のコマンドを実行して、このファイルを現在のディレクトリに作成または上書きします。
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
その後、次のコマンドを実行して REST リクエストを送信します。
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)
リクエスト本文を request.json
という名前のファイルに保存します。ターミナルで次のコマンドを実行して、このファイルを現在のディレクトリに作成または上書きします。
@'
{
"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
その後、次のコマンドを実行して REST リクエストを送信します。
$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
次のような JSON レスポンスが返されます。
{
"name": "projects/PROJECT_NUMBER /locations/LOCATION /jobs/JOB_ID ",
"config": {
...
},
"state": "PENDING",
"createTime": CREATE_TIME ,
"ttlAfterCompletionDays": 30
}
gcloud
ジョブ フィールドを定義する request.json
ファイルを作成します。gcloud
コマンドを次のように置き換えます。STORAGE_BUCKET_NAME : 作成した Cloud Storage バケットの名前。
STORAGE_INPUT_VIDEO : コード変換する Cloud Storage バケット内の動画の名前(my-vid.mp4
など)。このフィールドでは、バケットで作成したフォルダ(input/my-vid.mp4
など)を考慮する必要があります。
STORAGE_INPUT_OVERLAY : Cloud Storage バケットにありオーバーレイに使用する画像ファイルの名前(my-overlay.png
など)。このフィールドでは、バケットに作成したフォルダ(input/my-overlay.png
など)を含める必要があります。
LOCATION : ジョブを実行するロケーション。次に挙げるロケーションの 1 つを使用します。
3~7 つの店舗を表示
us-central1
us-west1
us-west2
us-east1
us-east4
southamerica-east1
northamerica-northeast1
asia-east1
asia-northeast1
asia-northeast3
asia-south1
asia-southeast1
australia-southeast1
europe-west1
europe-west2
europe-west4
STORAGE_OUTPUT_FOLDER : エンコードされた動画出力を保存する Cloud Storage フォルダ名。注: ジョブを作成する前に出力フォルダ オブジェクトを作成する必要はありません。ジョブを処理する際、Transcoder API は、自動的に指定したフォルダ名を 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"
}
}
]
}
]
}
}
次のコマンドを実行します。
gcloud transcoder jobs create --location=LOCATION --file="request.json"
次のようなレスポンスが表示されます。
{
"name": "projects/PROJECT_NUMBER /locations/LOCATION /jobs/JOB_ID ",
"config": {
...
},
"state": "PENDING",
"createTime": CREATE_TIME ,
"ttlAfterCompletionDays": 30
}
Go
このサンプルを試す前に、クライアント ライブラリを使用した Transcoder API クイックスタート にある Go の設定手順を行ってください。
詳細については、Transcoder API Go の API のリファレンス ドキュメント をご覧ください。
Transcoder API への認証を行うには、アプリケーションのデフォルト認証情報を設定します。詳細については、ローカル開発環境の認証を設定する をご覧ください。
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
このサンプルを試す前に、クライアント ライブラリを使用した Transcoder API クイックスタート にある Node.js の設定手順を行ってください。
詳細については、Transcoder API Node.js の API のリファレンス ドキュメント をご覧ください。
Transcoder API への認証を行うには、アプリケーションのデフォルト認証情報を設定します。詳細については、ローカル開発環境の認証を設定する をご覧ください。
/**
* 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
このサンプルを試す前に、クライアント ライブラリを使用した Transcoder API クイックスタート にある Python の設定手順を行ってください。
詳細については、Transcoder API Python の API のリファレンス ドキュメント をご覧ください。
Transcoder API への認証を行うには、アプリケーションのデフォルト認証情報を設定します。詳細については、ローカル開発環境の認証を設定する をご覧ください。
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
結果として生成される動画では、アニメーション オーバーレイに次のような特徴があります。
出力動画の 5 秒のマークでフェードインを開始します。オーバーレイのアルファ値は 0 から始まり、1.0 で終了します。オーバーレイの左上隅が出力動画の中央に表示されます。オーバーレイは、オーバーレイ画像の元の解像度で表示されます。
フェードイン後、オーバーレイは 2 秒間表示されます。
出力動画の 12 秒のマークでフェードアウトを開始します。オーバーレイのアルファ値は 1.0 で始まり、0 で終了します。
15 秒のマークでアニメーションが非表示になります。
この構成については、サンプル出力動画 をご覧ください。この動画では、サンプル オーバーレイ画像 を使用しています。