動画フレームのスプライト シートの生成

このページでは、コード変換する動画のフレームを含むスプライト シートを生成する方法について説明します。この縮小サイズのフレーム(サムネイルとも呼ばれます)は、コンテンツの整理やプレビューに役立ちます。スプライト シートを生成するには、JobConfig テンプレートの spriteSheets 配列を使用します。

スプライト シートの生成には、次の 2 つの方法があります。

設定した数のサムネイル画像を生成する

次の構成では、大きな画像の 10x10 スプライト シートと、小さな画像の 10x10 スプライト シートがそれぞれ 100 個(サムネイル)生成されます。 スプライト シートでは、ジョブ構成に少なくとも 1 つの VideoStream が必要です。

この構成をジョブ テンプレートに追加するか、アドホック ジョブ構成に含めることができます。

REST

リクエストのデータを使用する前に、次のように置き換えます。

  • PROJECT_ID: IAM 設定に記載されている Google Cloud プロジェクト ID。
  • LOCATION: ジョブを実行するロケーション。サポートされているリージョンのいずれかを使用します。
    ロケーションを表示
    • 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
    • me-west1
    • me-central1
    • me-central2
  • STORAGE_BUCKET_NAME: 作成した Cloud Storage バケットの名前。
  • STORAGE_INPUT_VIDEO: コード変換する Cloud Storage バケット内の動画の名前(my-vid.mp4 など)。このフィールドでは、バケットで作成したフォルダ(input/my-vid.mp4 など)を考慮する必要があります。
  • STORAGE_OUTPUT_FOLDER: エンコードされた動画出力を保存する Cloud Storage フォルダ名。

リクエストを送信するには、次のいずれかのオプションを展開します。

次のような JSON レスポンスが返されます。

 {   "name": "projects/PROJECT_NUMBER/locations/LOCATION/jobs/JOB_ID",   "config": {    ...   },   "state": "PENDING",   "createTime": CREATE_TIME,   "ttlAfterCompletionDays": 30 } 

gcloud

  1. ジョブ フィールドを定義する request.json ファイルを作成します。gcloud コマンドを次のように置き換えます。
    • STORAGE_BUCKET_NAME: 作成した Cloud Storage バケットの名前。
    • STORAGE_INPUT_VIDEO: コード変換する Cloud Storage バケット内の動画の名前(my-vid.mp4 など)。このフィールドでは、バケットで作成したフォルダ(input/my-vid.mp4 など)を考慮する必要があります。
    • LOCATION: ジョブを実行するロケーション。次に挙げるロケーションの 1 つを使用します。
      ロケーションを表示
      • 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
      • me-west1
      • me-central1
      • me-central2
    • STORAGE_OUTPUT_FOLDER: エンコードされた動画出力を保存する 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/"     },     "spriteSheets": [       {         "filePrefix": "small-sprite-sheet",         "spriteHeightPixels": 32,         "spriteWidthPixels": 64,         "columnCount": 10,         "rowCount": 10,         "totalCount": 100       },       {         "filePrefix": "large-sprite-sheet",         "spriteHeightPixels": 72,         "spriteWidthPixels": 128,         "columnCount": 10,         "rowCount": 10,         "totalCount": 100       }     ]   } }
  2. 次のコマンドを実行します。
    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 } 

C#

このサンプルを試す前に、クライアント ライブラリを使用した Transcoder API クイックスタートにある C# の設定手順を行ってください。 詳細については、Transcoder API C# の API のリファレンス ドキュメントをご覧ください。

Transcoder API への認証を行うには、アプリケーションのデフォルト認証情報を設定します。詳細については、ローカル開発環境の認証を設定するをご覧ください。

 using Google.Api.Gax.ResourceNames; using Google.Cloud.Video.Transcoder.V1;  public class CreateJobWithSetNumberImagesSpritesheetSample {     public const string SmallSpritesheetFilePrefix = "small-sprite-sheet";     public const string LargeSpritesheetFilePrefix = "large-sprite-sheet";     public Job CreateJobWithSetNumberImagesSpritesheet(         string projectId, string location, string inputUri, string outputUri)     {         // Create the client.         TranscoderServiceClient client = TranscoderServiceClient.Create();          // Build the parent location name.         LocationName parent = new LocationName(projectId, location);          // Build the job config.         VideoStream videoStream0 = new VideoStream         {             H264 = new VideoStream.Types.H264CodecSettings             {                 BitrateBps = 550000,                 FrameRate = 60,                 HeightPixels = 360,                 WidthPixels = 640             }         };          AudioStream audioStream0 = new AudioStream         {             Codec = "aac",             BitrateBps = 64000         };          // Generates a 10x10 spritesheet of small images from the input video.         // To preserve the source aspect ratio, you should set the         // SpriteWidthPixels field or the SpriteHeightPixels field, but not         // both (the API will automatically calculate the missing field). For         // this sample, we don't care about the aspect ratio so we set both         // fields.         SpriteSheet smallSpriteSheet = new SpriteSheet         {             FilePrefix = SmallSpritesheetFilePrefix,             SpriteHeightPixels = 32,             SpriteWidthPixels = 64,             ColumnCount = 10,             RowCount = 10,             TotalCount = 100         };          // Generates a 10x10 spritesheet of larger images from the input video.         // input video. To preserve the source aspect ratio, you should set the         // SpriteWidthPixels field or the SpriteHeightPixels field, but not         // both (the API will automatically calculate the missing field). For         // this sample, we don't care about the aspect ratio so we set both         // fields.         SpriteSheet largeSpriteSheet = new SpriteSheet         {             FilePrefix = LargeSpritesheetFilePrefix,             SpriteHeightPixels = 72,             SpriteWidthPixels = 128,             ColumnCount = 10,             RowCount = 10,             TotalCount = 100         };          ElementaryStream elementaryStream0 = new ElementaryStream         {             Key = "video_stream0",             VideoStream = videoStream0         };          ElementaryStream elementaryStream1 = new ElementaryStream         {             Key = "audio_stream0",             AudioStream = audioStream0         };          MuxStream muxStream0 = new MuxStream         {             Key = "sd",             Container = "mp4",             ElementaryStreams = { "video_stream0", "audio_stream0" }         };          Input input = new Input         {             Key = "input0",             Uri = inputUri         };          Output output = new Output         {             Uri = outputUri         };          JobConfig jobConfig = new JobConfig         {             Inputs = { input },             Output = output,             ElementaryStreams = { elementaryStream0, elementaryStream1 },             MuxStreams = { muxStream0 },             SpriteSheets = { smallSpriteSheet, largeSpriteSheet }         };          // Build the job.         Job newJob = new Job();         newJob.InputUri = inputUri;         newJob.OutputUri = outputUri;         newJob.Config = jobConfig;          // Call the API.         Job job = client.CreateJob(parent, newJob);          // Return the result.         return job;     } }

Go

このサンプルを試す前に、クライアント ライブラリを使用した Transcoder API クイックスタートにある Go の設定手順を行ってください。 詳細については、Transcoder API Go の API のリファレンス ドキュメントをご覧ください。

Transcoder API への認証を行うには、アプリケーションのデフォルト認証情報を設定します。詳細については、ローカル開発環境の認証を設定するをご覧ください。

import ( 	"context" 	"fmt" 	"io"  	transcoder "cloud.google.com/go/video/transcoder/apiv1" 	"cloud.google.com/go/video/transcoder/apiv1/transcoderpb" )  // createJobWithSetNumberImagesSpritesheet creates a job from an ad-hoc configuration and generates // two spritesheets from the input video. Each spritesheet contains a set number of images. func createJobWithSetNumberImagesSpritesheet(w io.Writer, projectID string, location string, inputURI string, outputURI string) error { 	// projectID := "my-project-id" 	// location := "us-central1" 	// inputURI := "gs://my-bucket/my-video-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"}, 						}, 					}, 					SpriteSheets: []*transcoderpb.SpriteSheet{ 						{ 							FilePrefix:         "small-sprite-sheet", 							SpriteWidthPixels:  64, 							SpriteHeightPixels: 32, 							ColumnCount:        10, 							RowCount:           10, 							ExtractionStrategy: &transcoderpb.SpriteSheet_TotalCount{ 								TotalCount: 100, 							}, 						}, 						{ 							FilePrefix:         "large-sprite-sheet", 							SpriteWidthPixels:  128, 							SpriteHeightPixels: 72, 							ColumnCount:        10, 							RowCount:           10, 							ExtractionStrategy: &transcoderpb.SpriteSheet_TotalCount{ 								TotalCount: 100, 							}, 						}, 					}, 				}, 			}, 		}, 	} 	// Creates the job. Jobs take a variable amount of time to run. You can query for the job state. 	// See https://cloud.google.com/transcoder/docs/how-to/jobs#check_job_status for more info. 	response, err := client.CreateJob(ctx, req) 	if err != nil { 		return fmt.Errorf("createJobWithSetNumberImagesSpritesheet: %w", err) 	}  	fmt.Fprintf(w, "Job: %v", response.GetName()) 	return nil } 

Java

このサンプルを試す前に、クライアント ライブラリを使用した Transcoder API クイックスタートにある Java の設定手順を行ってください。 詳細については、Transcoder API Java の API のリファレンス ドキュメントをご覧ください。

Transcoder API への認証を行うには、アプリケーションのデフォルト認証情報を設定します。詳細については、ローカル開発環境の認証を設定するをご覧ください。

 import com.google.cloud.video.transcoder.v1.AudioStream; import com.google.cloud.video.transcoder.v1.CreateJobRequest; import com.google.cloud.video.transcoder.v1.ElementaryStream; import com.google.cloud.video.transcoder.v1.Input; import com.google.cloud.video.transcoder.v1.Job; import com.google.cloud.video.transcoder.v1.JobConfig; import com.google.cloud.video.transcoder.v1.LocationName; import com.google.cloud.video.transcoder.v1.MuxStream; import com.google.cloud.video.transcoder.v1.Output; import com.google.cloud.video.transcoder.v1.SpriteSheet; import com.google.cloud.video.transcoder.v1.TranscoderServiceClient; import com.google.cloud.video.transcoder.v1.VideoStream; import java.io.IOException;  public class CreateJobWithSetNumberImagesSpritesheet {    public static final String smallSpritesheetFilePrefix = "small-sprite-sheet";   public static final String largeSpritesheetFilePrefix = "large-sprite-sheet";   public static final String spritesheetFileSuffix = "0000000000.jpeg";    public static void main(String[] args) throws IOException {     // TODO(developer): Replace these variables before running the sample.     String projectId = "my-project-id";     String location = "us-central1";     String inputUri = "gs://my-bucket/my-video-file";     String outputUri = "gs://my-bucket/my-output-folder/";      createJobWithSetNumberImagesSpritesheet(projectId, location, inputUri, outputUri);   }    // Creates a job from an ad-hoc configuration and generates two spritesheets from the input video.   // Each spritesheet contains a set number of images.   public static void createJobWithSetNumberImagesSpritesheet(       String projectId, String location, String inputUri, 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();        // Generates a 10x10 spritesheet of small images from the input video. To preserve the source       // aspect ratio, you should set the spriteWidthPixels field or the spriteHeightPixels       // field, but not both.       SpriteSheet smallSpriteSheet =           SpriteSheet.newBuilder()               .setFilePrefix(smallSpritesheetFilePrefix)               .setSpriteHeightPixels(32)               .setSpriteWidthPixels(64)               .setColumnCount(10)               .setRowCount(10)               .setTotalCount(100)               .build();        // Generates a 10x10 spritesheet of larger images from the input video.       SpriteSheet largeSpriteSheet =           SpriteSheet.newBuilder()               .setFilePrefix(largeSpritesheetFilePrefix)               .setSpriteHeightPixels(72)               .setSpriteWidthPixels(128)               .setColumnCount(10)               .setRowCount(10)               .setTotalCount(100)               .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())               .addSpriteSheets(smallSpriteSheet) // Add the spritesheet config to the job config               .addSpriteSheets(largeSpriteSheet) // Add the spritesheet config 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());     }   } }

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'; // 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 createJobWithSetNumberImagesSpritesheet() {   // 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'],           },         ],         spriteSheets: [           {             filePrefix: 'small-sprite-sheet',             spriteHeightPixels: 32,             spriteWidthPixels: 64,             columnCount: 10,             rowCount: 10,             totalCount: 100,           },           {             filePrefix: 'large-sprite-sheet',             spriteHeightPixels: 72,             spriteWidthPixels: 128,             columnCount: 10,             rowCount: 10,             totalCount: 100,           },         ],       },     },   };    // Run request   const [response] = await transcoderServiceClient.createJob(request);   console.log(`Job: ${response.name}`); }  createJobWithSetNumberImagesSpritesheet();

PHP

このサンプルを試す前に、クライアント ライブラリを使用した Transcoder API クイックスタートにある PHP の設定手順を行ってください。 詳細については、Transcoder API PHP の API のリファレンス ドキュメントをご覧ください。

Transcoder API への認証を行うには、アプリケーションのデフォルト認証情報を設定します。詳細については、ローカル開発環境の認証を設定するをご覧ください。

use Google\Cloud\Video\Transcoder\V1\AudioStream; use Google\Cloud\Video\Transcoder\V1\Client\TranscoderServiceClient; use Google\Cloud\Video\Transcoder\V1\CreateJobRequest; use Google\Cloud\Video\Transcoder\V1\ElementaryStream; use Google\Cloud\Video\Transcoder\V1\Job; use Google\Cloud\Video\Transcoder\V1\JobConfig; use Google\Cloud\Video\Transcoder\V1\MuxStream; use Google\Cloud\Video\Transcoder\V1\SpriteSheet; use Google\Cloud\Video\Transcoder\V1\VideoStream;  /**  * Creates a job that generates two spritesheets from the input video. Each  * spritesheet contains a set number of images.  *  * @param string $projectId The ID of your Google Cloud Platform project.  * @param string $location The location of the job.  * @param string $inputUri Uri of the video in the Cloud Storage bucket.  * @param string $outputUri Uri of the video output folder in the Cloud Storage bucket.  */ function create_job_with_set_number_images_spritesheet($projectId, $location, $inputUri, $outputUri) {     // Instantiate a client.     $transcoderServiceClient = new TranscoderServiceClient();      $formattedParent = $transcoderServiceClient->locationName($projectId, $location);     $jobConfig =         (new JobConfig())->setElementaryStreams([             (new ElementaryStream())                 ->setKey('video-stream0')                 ->setVideoStream(                     (new VideoStream())                         ->setH264(                             (new VideoStream\H264CodecSettings())                                 ->setBitrateBps(550000)                                 ->setFrameRate(60)                                 ->setHeightPixels(360)                                 ->setWidthPixels(640)                         )                 ),             (new ElementaryStream())                 ->setKey('audio-stream0')                 ->setAudioStream(                     (new AudioStream())                         ->setCodec('aac')                         ->setBitrateBps(64000)                 )         ])->setMuxStreams([             (new MuxStream())                 ->setKey('sd')                 ->setContainer('mp4')                 ->setElementaryStreams(['video-stream0', 'audio-stream0'])         ])->setSpriteSheets([             (new SpriteSheet())                 ->setFilePrefix('small-sprite-sheet')                 ->setSpriteWidthPixels(64)                 ->setSpriteHeightPixels(32)                 ->setColumnCount(10)                 ->setRowCount(10)                 ->setTotalCount(100),             (new SpriteSheet())                 ->setFilePrefix('large-sprite-sheet')                 ->setSpriteWidthPixels(128)                 ->setSpriteHeightPixels(72)                 ->setColumnCount(10)                 ->setRowCount(10)                 ->setTotalCount(100)         ]);      $job = (new Job())         ->setInputUri($inputUri)         ->setOutputUri($outputUri)         ->setConfig($jobConfig);     $request = (new CreateJobRequest())         ->setParent($formattedParent)         ->setJob($job);      $response = $transcoderServiceClient->createJob($request);      // Print job name.     printf('Job: %s' . PHP_EOL, $response->getName()); }

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, )   def create_job_with_set_number_images_spritesheet(     project_id: str,     location: str,     input_uri: str,     output_uri: str, ) -> transcoder_v1.types.resources.Job:     """Creates a job based on an ad-hoc job configuration that generates two spritesheets.      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.         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(         # Create an ad-hoc job. For more information, see https://cloud.google.com/transcoder/docs/how-to/jobs#create_jobs_ad_hoc.         # See all options for the job config at https://cloud.google.com/transcoder/docs/reference/rest/v1/JobConfig.         elementary_streams=[             # This section defines the output video stream.             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,                     ),                 ),             ),             # This section defines the output audio stream.             transcoder_v1.types.ElementaryStream(                 key="audio-stream0",                 audio_stream=transcoder_v1.types.AudioStream(                     codec="aac", bitrate_bps=64000                 ),             ),         ],         # This section multiplexes the output audio and video together into a container.         mux_streams=[             transcoder_v1.types.MuxStream(                 key="sd",                 container="mp4",                 elementary_streams=["video-stream0", "audio-stream0"],             ),         ],         # Generate two sprite sheets from the input video into the GCS bucket. For more information, see         # https://cloud.google.com/transcoder/docs/how-to/generate-spritesheet#generate_set_number_of_images.         sprite_sheets=[             # Generate a 10x10 sprite sheet with 64x32px images.             transcoder_v1.types.SpriteSheet(                 file_prefix="small-sprite-sheet",                 sprite_width_pixels=64,                 sprite_height_pixels=32,                 column_count=10,                 row_count=10,                 total_count=100,             ),             # Generate a 10x10 sprite sheet with 128x72px images.             transcoder_v1.types.SpriteSheet(                 file_prefix="large-sprite-sheet",                 sprite_width_pixels=128,                 sprite_height_pixels=72,                 column_count=10,                 row_count=10,                 total_count=100,             ),         ],     )     response = client.create_job(parent=parent, job=job)     print(f"Job: {response.name}")     return response  

Ruby

このサンプルを試す前に、クライアント ライブラリを使用した Transcoder API クイックスタートにある Ruby の設定手順を行ってください。 詳細については、Transcoder API Ruby の API のリファレンス ドキュメントをご覧ください。

Transcoder API への認証を行うには、アプリケーションのデフォルト認証情報を設定します。詳細については、ローカル開発環境の認証を設定するをご覧ください。

# project_id  = "YOUR-GOOGLE-CLOUD-PROJECT"  # (e.g. "my-project") # location    = "YOUR-JOB-LOCATION"  # (e.g. "us-central1") # input_uri   = "YOUR-GCS-INPUT-VIDEO"  # (e.g. "gs://my-bucket/my-video-file") # output_uri  = "YOUR-GCS-OUTPUT-FOLDER/"  # (e.g. "gs://my-bucket/my-output-folder/")  # Require the Transcoder client library. require "google/cloud/video/transcoder"  # Create a Transcoder client. client = Google::Cloud::Video::Transcoder.transcoder_service  # Build the resource name of the parent. parent = client.location_path project: project_id, location: location  # Build the job config. new_job = {   input_uri: input_uri,   output_uri: output_uri,   config: {     elementary_streams: [       {         key: "video-stream0",         video_stream: {           h264: {             height_pixels: 360,             width_pixels: 640,             bitrate_bps: 550_000,             frame_rate: 60           }         }       },       {         key: "audio-stream0",         audio_stream: {           codec: "aac",           bitrate_bps: 64_000         }       }     ],     mux_streams: [       {         key: "sd",         container: "mp4",         elementary_streams: [           "video-stream0",           "audio-stream0"         ]       }     ],     sprite_sheets: [       {         file_prefix: "small-sprite-sheet",         sprite_width_pixels: 64,         sprite_height_pixels: 32,         column_count: 10,         row_count: 10,         total_count: 100       },       {         file_prefix: "large-sprite-sheet",         sprite_width_pixels: 128,         sprite_height_pixels: 72,         column_count: 10,         row_count: 10,         total_count: 100       }     ]   } }  job = client.create_job parent: parent, job: new_job  # Print the job name. puts "Job: #{job.name}"

サンプル動画でこの構成を使用して、次のスプライトシートを生成します。

小さい画像のスプライトシート
図 1.小さい画像のスプライトシート(100 個のサムネイル)

大きい画像のスプライトシート
図 2.大きい画像のスプライトシート(100 個のサムネイル)

定期的にサムネイル画像を生成する

次の構成は、小さな画像のスプライトシートと、大きな画像のスプライト シートを生成します。各スプライト シートには、入力動画から 7 秒ごとに生成されたサムネイルが含まれます。 スプライト シートでは、ジョブ構成に少なくとも 1 つの VideoStream が必要です。

この構成をジョブ テンプレートに追加するか、アドホック ジョブ構成に含めることができます。

REST

リクエストのデータを使用する前に、次のように置き換えます。

  • PROJECT_ID: IAM 設定に記載されている Google Cloud プロジェクト ID。
  • LOCATION: ジョブを実行するロケーション。サポートされているリージョンのいずれかを使用します。
    ロケーションを表示
    • 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
    • me-west1
    • me-central1
    • me-central2
  • STORAGE_BUCKET_NAME: 作成した Cloud Storage バケットの名前。
  • STORAGE_INPUT_VIDEO: コード変換する Cloud Storage バケット内の動画の名前(my-vid.mp4 など)。このフィールドでは、バケットで作成したフォルダ(input/my-vid.mp4 など)を考慮する必要があります。
  • STORAGE_OUTPUT_FOLDER: エンコードされた動画出力を保存する Cloud Storage フォルダ名。

リクエストを送信するには、次のいずれかのオプションを展開します。

次のような JSON レスポンスが返されます。

 {   "name": "projects/PROJECT_NUMBER/locations/LOCATION/jobs/JOB_ID",   "config": {    ...   },   "state": "PENDING",   "createTime": CREATE_TIME,   "ttlAfterCompletionDays": 30 } 

gcloud

  1. ジョブ フィールドを定義する request.json ファイルを作成します。gcloud コマンドを次のように置き換えます。
    • STORAGE_BUCKET_NAME: 作成した Cloud Storage バケットの名前。
    • STORAGE_INPUT_VIDEO: コード変換する Cloud Storage バケット内の動画の名前(my-vid.mp4 など)。このフィールドでは、バケットで作成したフォルダ(input/my-vid.mp4 など)を考慮する必要があります。
    • LOCATION: ジョブを実行するロケーション。次に挙げるロケーションの 1 つを使用します。
      ロケーションを表示
      • 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
      • me-west1
      • me-central1
      • me-central2
    • STORAGE_OUTPUT_FOLDER: エンコードされた動画出力を保存する 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/"     },     "spriteSheets": [       {         "filePrefix": "small-sprite-sheet",         "spriteHeightPixels": 32,         "spriteWidthPixels": 64,         "interval": "7s"       },       {         "filePrefix": "large-sprite-sheet",         "spriteHeightPixels": 72,         "spriteWidthPixels": 128,         "interval": "7s"       }     ]   } }
  2. 次のコマンドを実行します。
    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 } 

C#

このサンプルを試す前に、クライアント ライブラリを使用した Transcoder API クイックスタートにある C# の設定手順を行ってください。 詳細については、Transcoder API C# の API のリファレンス ドキュメントをご覧ください。

Transcoder API への認証を行うには、アプリケーションのデフォルト認証情報を設定します。詳細については、ローカル開発環境の認証を設定するをご覧ください。

 using Google.Api.Gax.ResourceNames; using Google.Cloud.Video.Transcoder.V1; using Google.Protobuf.WellKnownTypes; using System;  public class CreateJobWithPeriodicImagesSpritesheetSample {     public const string SmallSpritesheetFilePrefix = "small-sprite-sheet";     public const string LargeSpritesheetFilePrefix = "large-sprite-sheet";     public Job CreateJobWithPeriodicImagesSpritesheet(         string projectId, string location, string inputUri, string outputUri)     {         // Create the client.         TranscoderServiceClient client = TranscoderServiceClient.Create();          // Build the parent location name.         LocationName parent = new LocationName(projectId, location);          // Build the job config.         VideoStream videoStream0 = new VideoStream         {             H264 = new VideoStream.Types.H264CodecSettings             {                 BitrateBps = 550000,                 FrameRate = 60,                 HeightPixels = 360,                 WidthPixels = 640             }         };          AudioStream audioStream0 = new AudioStream         {             Codec = "aac",             BitrateBps = 64000         };          // Generates a spritesheet of small images taken periodically from the         // input video. To preserve the source aspect ratio, you should set the         // SpriteWidthPixels field or the SpriteHeightPixels field, but not         // both (the API will automatically calculate the missing field). For         // this sample, we don't care about the aspect ratio so we set both         // fields.         SpriteSheet smallSpriteSheet = new SpriteSheet         {             FilePrefix = SmallSpritesheetFilePrefix,             SpriteHeightPixels = 32,             SpriteWidthPixels = 64,             Interval = Duration.FromTimeSpan(TimeSpan.FromSeconds(7))         };          // Generates a spritesheet of larger images taken periodically from the         // input video. To preserve the source aspect ratio, you should set the         // SpriteWidthPixels field or the SpriteHeightPixels field, but not         // both (the API will automatically calculate the missing field). For         // this sample, we don't care about the aspect ratio so we set both         // fields.         SpriteSheet largeSpriteSheet = new SpriteSheet         {             FilePrefix = LargeSpritesheetFilePrefix,             SpriteHeightPixels = 72,             SpriteWidthPixels = 128,             Interval = Duration.FromTimeSpan(TimeSpan.FromSeconds(7))         };          ElementaryStream elementaryStream0 = new ElementaryStream         {             Key = "video_stream0",             VideoStream = videoStream0         };          ElementaryStream elementaryStream1 = new ElementaryStream         {             Key = "audio_stream0",             AudioStream = audioStream0         };          MuxStream muxStream0 = new MuxStream         {             Key = "sd",             Container = "mp4",             ElementaryStreams = { "video_stream0", "audio_stream0" }         };          Input input = new Input         {             Key = "input0",             Uri = inputUri         };          Output output = new Output         {             Uri = outputUri         };          JobConfig jobConfig = new JobConfig         {             Inputs = { input },             Output = output,             ElementaryStreams = { elementaryStream0, elementaryStream1 },             MuxStreams = { muxStream0 },             SpriteSheets = { smallSpriteSheet, largeSpriteSheet }         };          // Build the job.         Job newJob = new Job         {             InputUri = inputUri,             OutputUri = outputUri,             Config = jobConfig         };          // Call the API.         Job job = client.CreateJob(parent, newJob);          // Return the result.         return job;     } }

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" )  // createJobWithPeriodicImagesSpritesheet creates a job from an ad-hoc configuration and generates // two spritesheets from the input video. Each spritesheet contains images that are captured // periodically based on a user-defined time interval. func createJobWithPeriodicImagesSpritesheet(w io.Writer, projectID string, location string, inputURI string, outputURI string) error { 	// projectID := "my-project-id" 	// location := "us-central1" 	// inputURI := "gs://my-bucket/my-video-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"}, 						}, 					}, 					SpriteSheets: []*transcoderpb.SpriteSheet{ 						{ 							FilePrefix:         "small-sprite-sheet", 							SpriteWidthPixels:  64, 							SpriteHeightPixels: 32, 							ExtractionStrategy: &transcoderpb.SpriteSheet_Interval{ 								Interval: &duration.Duration{ 									Seconds: 7, 								}, 							}, 						}, 						{ 							FilePrefix:         "large-sprite-sheet", 							SpriteWidthPixels:  128, 							SpriteHeightPixels: 72, 							ExtractionStrategy: &transcoderpb.SpriteSheet_Interval{ 								Interval: &duration.Duration{ 									Seconds: 7, 								}, 							}, 						}, 					}, 				}, 			}, 		}, 	} 	// Creates the job. Jobs take a variable amount of time to run. You can query for the job state. 	// See https://cloud.google.com/transcoder/docs/how-to/jobs#check_job_status for more info. 	response, err := client.CreateJob(ctx, req) 	if err != nil { 		return fmt.Errorf("createJobWithPeriodicImagesSpritesheet: %w", err) 	}  	fmt.Fprintf(w, "Job: %v", response.GetName()) 	return nil } 

Java

このサンプルを試す前に、クライアント ライブラリを使用した Transcoder API クイックスタートにある Java の設定手順を行ってください。 詳細については、Transcoder API Java の API のリファレンス ドキュメントをご覧ください。

Transcoder API への認証を行うには、アプリケーションのデフォルト認証情報を設定します。詳細については、ローカル開発環境の認証を設定するをご覧ください。

 import com.google.cloud.video.transcoder.v1.AudioStream; import com.google.cloud.video.transcoder.v1.CreateJobRequest; import com.google.cloud.video.transcoder.v1.ElementaryStream; import com.google.cloud.video.transcoder.v1.Input; import com.google.cloud.video.transcoder.v1.Job; import com.google.cloud.video.transcoder.v1.JobConfig; import com.google.cloud.video.transcoder.v1.LocationName; import com.google.cloud.video.transcoder.v1.MuxStream; import com.google.cloud.video.transcoder.v1.Output; import com.google.cloud.video.transcoder.v1.SpriteSheet; import com.google.cloud.video.transcoder.v1.TranscoderServiceClient; import com.google.cloud.video.transcoder.v1.VideoStream; import com.google.protobuf.Duration; import java.io.IOException;  public class CreateJobWithPeriodicImagesSpritesheet {    public static final String smallSpritesheetFilePrefix = "small-sprite-sheet";   public static final String largeSpritesheetFilePrefix = "large-sprite-sheet";   public static final String spritesheetFileSuffix = "0000000000.jpeg";    public static void main(String[] args) throws IOException {     // TODO(developer): Replace these variables before running the sample.     String projectId = "my-project-id";     String location = "us-central1";     String inputUri = "gs://my-bucket/my-video-file";     String outputUri = "gs://my-bucket/my-output-folder/";      createJobWithPeriodicImagesSpritesheet(projectId, location, inputUri, outputUri);   }    // Creates a job from an ad-hoc configuration and generates two spritesheets from the input video.   // Each spritesheet contains images that are captured periodically based on a user-defined time   // interval.   public static void createJobWithPeriodicImagesSpritesheet(       String projectId, String location, String inputUri, 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();        // Generates a spritesheet of small images taken periodically from the input video. To       // preserve the source aspect ratio, you should set the spriteWidthPixels field or the       // spriteHeightPixels field, but not both.       SpriteSheet smallSpriteSheet =           SpriteSheet.newBuilder()               .setFilePrefix(smallSpritesheetFilePrefix)               .setSpriteHeightPixels(32)               .setSpriteWidthPixels(64)               .setInterval(Duration.newBuilder().setSeconds(7).build())               .build();        // Generates a spritesheet of larger images taken periodically from the input video. To       SpriteSheet largeSpriteSheet =           SpriteSheet.newBuilder()               .setFilePrefix(largeSpritesheetFilePrefix)               .setSpriteHeightPixels(72)               .setSpriteWidthPixels(128)               .setInterval(Duration.newBuilder().setSeconds(7).build())               .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())               .addSpriteSheets(smallSpriteSheet) // Add the spritesheet config to the job config               .addSpriteSheets(largeSpriteSheet) // Add the spritesheet config 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());     }   } }

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'; // 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 createJobWithPeriodicImagesSpritesheet() {   // 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'],           },         ],         spriteSheets: [           {             filePrefix: 'small-sprite-sheet',             spriteHeightPixels: 32,             spriteWidthPixels: 64,             interval: {               seconds: 7,             },           },           {             filePrefix: 'large-sprite-sheet',             spriteHeightPixels: 72,             spriteWidthPixels: 128,             interval: {               seconds: 7,             },           },         ],       },     },   };    // Run request   const [response] = await transcoderServiceClient.createJob(request);   console.log(`Job: ${response.name}`); }  createJobWithPeriodicImagesSpritesheet();

PHP

このサンプルを試す前に、クライアント ライブラリを使用した Transcoder API クイックスタートにある PHP の設定手順を行ってください。 詳細については、Transcoder API PHP の API のリファレンス ドキュメントをご覧ください。

Transcoder API への認証を行うには、アプリケーションのデフォルト認証情報を設定します。詳細については、ローカル開発環境の認証を設定するをご覧ください。

use Google\Cloud\Video\Transcoder\V1\AudioStream; use Google\Cloud\Video\Transcoder\V1\Client\TranscoderServiceClient; use Google\Cloud\Video\Transcoder\V1\CreateJobRequest; use Google\Cloud\Video\Transcoder\V1\ElementaryStream; use Google\Cloud\Video\Transcoder\V1\Job; use Google\Cloud\Video\Transcoder\V1\JobConfig; use Google\Cloud\Video\Transcoder\V1\MuxStream; use Google\Cloud\Video\Transcoder\V1\SpriteSheet; use Google\Cloud\Video\Transcoder\V1\VideoStream; use Google\Protobuf\Duration;  /**  * Creates a job that generates two spritesheets from the input video. Each  * spritesheet contains images that are captured periodically.  *  * @param string $projectId The ID of your Google Cloud Platform project.  * @param string $location The location of the job.  * @param string $inputUri Uri of the video in the Cloud Storage bucket.  * @param string $outputUri Uri of the video output folder in the Cloud Storage bucket.  */ function create_job_with_periodic_images_spritesheet($projectId, $location, $inputUri, $outputUri) {     // Instantiate a client.     $transcoderServiceClient = new TranscoderServiceClient();      $formattedParent = $transcoderServiceClient->locationName($projectId, $location);     $jobConfig =         (new JobConfig())->setElementaryStreams([             (new ElementaryStream())                 ->setKey('video-stream0')                 ->setVideoStream(                     (new VideoStream())                         ->setH264(                             (new VideoStream\H264CodecSettings())                                 ->setBitrateBps(550000)                                 ->setFrameRate(60)                                 ->setHeightPixels(360)                                 ->setWidthPixels(640)                         )                 ),             (new ElementaryStream())                 ->setKey('audio-stream0')                 ->setAudioStream(                     (new AudioStream())                         ->setCodec('aac')                         ->setBitrateBps(64000)                 )         ])->setMuxStreams([             (new MuxStream())                 ->setKey('sd')                 ->setContainer('mp4')                 ->setElementaryStreams(['video-stream0', 'audio-stream0'])         ])->setSpriteSheets([             (new SpriteSheet())                 ->setFilePrefix('small-sprite-sheet')                 ->setSpriteWidthPixels(64)                 ->setSpriteHeightPixels(32)                 ->setInterval(                     (new Duration())                         ->setSeconds(7)                 ),             (new SpriteSheet())                 ->setFilePrefix('large-sprite-sheet')                 ->setSpriteWidthPixels(128)                 ->setSpriteHeightPixels(72)                 ->setInterval(new Duration(['seconds' => 7]))         ]);      $job = (new Job())         ->setInputUri($inputUri)         ->setOutputUri($outputUri)         ->setConfig($jobConfig);     $request = (new CreateJobRequest())         ->setParent($formattedParent)         ->setJob($job);      $response = $transcoderServiceClient->createJob($request);      // Print job name.     printf('Job: %s' . PHP_EOL, $response->getName()); }

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_periodic_images_spritesheet(     project_id: str,     location: str,     input_uri: str,     output_uri: str, ) -> transcoder_v1.types.resources.Job:     """Creates a job based on an ad-hoc job configuration that generates two spritesheets.      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.         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(         # Create an ad-hoc job. For more information, see https://cloud.google.com/transcoder/docs/how-to/jobs#create_jobs_ad_hoc.         # See all options for the job config at https://cloud.google.com/transcoder/docs/reference/rest/v1/JobConfig.         elementary_streams=[             # This section defines the output video stream.             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,                     ),                 ),             ),             # This section defines the output audio stream.             transcoder_v1.types.ElementaryStream(                 key="audio-stream0",                 audio_stream=transcoder_v1.types.AudioStream(                     codec="aac", bitrate_bps=64000                 ),             ),         ],         # This section multiplexes the output audio and video together into a container.         mux_streams=[             transcoder_v1.types.MuxStream(                 key="sd",                 container="mp4",                 elementary_streams=["video-stream0", "audio-stream0"],             ),         ],         # Generate two sprite sheets from the input video into the GCS bucket. For more information, see         # https://cloud.google.com/transcoder/docs/how-to/generate-spritesheet#generate_image_periodically.         sprite_sheets=[             # Generate a sprite sheet with 64x32px images. An image is taken every 7 seconds from the video.             transcoder_v1.types.SpriteSheet(                 file_prefix="small-sprite-sheet",                 sprite_width_pixels=64,                 sprite_height_pixels=32,                 interval=duration.Duration(                     seconds=7,                 ),             ),             # Generate a sprite sheet with 128x72px images. An image is taken every 7 seconds from the video.             transcoder_v1.types.SpriteSheet(                 file_prefix="large-sprite-sheet",                 sprite_width_pixels=128,                 sprite_height_pixels=72,                 interval=duration.Duration(                     seconds=7,                 ),             ),         ],     )     response = client.create_job(parent=parent, job=job)     print(f"Job: {response.name}")     return response  

Ruby

このサンプルを試す前に、クライアント ライブラリを使用した Transcoder API クイックスタートにある Ruby の設定手順を行ってください。 詳細については、Transcoder API Ruby の API のリファレンス ドキュメントをご覧ください。

Transcoder API への認証を行うには、アプリケーションのデフォルト認証情報を設定します。詳細については、ローカル開発環境の認証を設定するをご覧ください。

# project_id  = "YOUR-GOOGLE-CLOUD-PROJECT"  # (e.g. "my-project") # location    = "YOUR-JOB-LOCATION"  # (e.g. "us-central1") # input_uri   = "YOUR-GCS-INPUT-VIDEO"  # (e.g. "gs://my-bucket/my-video-file") # output_uri  = "YOUR-GCS-OUTPUT-FOLDER/"  # (e.g. "gs://my-bucket/my-output-folder/")  # Require the Transcoder client library. require "google/cloud/video/transcoder"  # Create a Transcoder client. client = Google::Cloud::Video::Transcoder.transcoder_service  # Build the resource name of the parent. parent = client.location_path project: project_id, location: location  # Build the job config. new_job = {   input_uri: input_uri,   output_uri: output_uri,   config: {     elementary_streams: [       {         key: "video-stream0",         video_stream: {           h264: {             height_pixels: 360,             width_pixels: 640,             bitrate_bps: 550_000,             frame_rate: 60           }         }       },       {         key: "audio-stream0",         audio_stream: {           codec: "aac",           bitrate_bps: 64_000         }       }     ],     mux_streams: [       {         key: "sd",         container: "mp4",         elementary_streams: [           "video-stream0",           "audio-stream0"         ]       }     ],     sprite_sheets: [       {         file_prefix: "small-sprite-sheet",         sprite_width_pixels: 64,         sprite_height_pixels: 32,         interval: {           seconds: 7         }       },       {         file_prefix: "large-sprite-sheet",         sprite_width_pixels: 128,         sprite_height_pixels: 72,         interval: {           seconds: 7         }       }     ]   } }  job = client.create_job parent: parent, job: new_job  # Print the job name. puts "Job: #{job.name}"

サンプル動画でこの構成を使用して、次のスプライトシートを生成します。

小さい画像のスプライトシート
図 3.小さい画像のスプライトシート(7 秒ごとに 1 サムネイル)

大きい画像のスプライトシート
図 4.大きい画像スプライトシート(7 秒ごとに 1 サムネイル)

サンプル動画から 8 個のサムネイル(長さは 60 秒)が生成されます。