Halaman ini menjelaskan cara membuat spritesheet yang berisi frame dari
video yang Anda transcoding. Frame berukuran yang lebih kecil ini, yang juga dikenal sebagai thumbnail, berguna untuk mengatur dan melihat pratinjau konten. Untuk membuat spritesheet, gunakan array spriteSheets
di template JobConfig
.
Anda memiliki dua opsi untuk menghasilkan spritesheet:
Membuat sejumlah gambar thumbnail
Konfigurasi berikut menghasilkan spritesheet 10x10 yang berisi gambar
besar dan spritesheet 10x10 dari gambar kecil, masing-masing
dengan 100 thumbnail. Perhatikan bahwa spritesheet memerlukan setidaknya satu VideoStream
dalam konfigurasi
tugas.
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_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 /"
},
"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
}
]
}
}
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 /"
},
"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
}
]
}
}
'@ | 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
).
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 /"
},
"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
}
]
}
}
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"
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
}
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';
// 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();
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,
)
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
Catatan: Untuk mempertahankan rasio aspek sumber, tetapkan kolom spriteWidthPixels
atau
kolom spriteHeightPixels
, tetapi jangan keduanya (API akan otomatis
menghitung kolom yang tidak ada).
Gunakan konfigurasi ini pada video contoh
untuk membuat spritesheet berikut:
Gambar 1. Spritesheet gambar kecil (100 thumbnail)
Gambar 2. Spritesheet gambar besar (100 thumbnail)
Buat gambar thumbnail secara berkala
Konfigurasi berikut menghasilkan spritesheet gambar kecil
dan spritesheet gambar besar. Setiap spritesheet berisi
thumbnail yang dibuat setiap 7 detik dari video input. Perhatikan bahwa spritesheet memerlukan setidaknya satu VideoStream
dalam konfigurasi
tugas.
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_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 /"
},
"spriteSheets": [
{
"filePrefix": "small-sprite-sheet",
"spriteHeightPixels": 32,
"spriteWidthPixels": 64,
"interval": "7s"
},
{
"filePrefix": "large-sprite-sheet",
"spriteHeightPixels": 72,
"spriteWidthPixels": 128,
"interval": "7s"
}
]
}
}
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 /"
},
"spriteSheets": [
{
"filePrefix": "small-sprite-sheet",
"spriteHeightPixels": 32,
"spriteWidthPixels": 64,
"interval": "7s"
},
{
"filePrefix": "large-sprite-sheet",
"spriteHeightPixels": 72,
"spriteWidthPixels": 128,
"interval": "7s"
}
]
}
}
'@ | 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
).
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 /"
},
"spriteSheets": [
{
"filePrefix": "small-sprite-sheet",
"spriteHeightPixels": 32,
"spriteWidthPixels": 64,
"interval": "7s"
},
{
"filePrefix": "large-sprite-sheet",
"spriteHeightPixels": 72,
"spriteWidthPixels": 128,
"interval": "7s"
}
]
}
}
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"
)
// 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
}
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_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
Catatan: Untuk mempertahankan rasio aspek sumber, tetapkan kolom spriteWidthPixels
atau
kolom spriteHeightPixels
, tetapi jangan keduanya (API akan otomatis
menghitung kolom yang tidak ada).
Gunakan konfigurasi ini pada video contoh
untuk membuat spritesheet berikut:
Gambar 3. Spritesheet gambar kecil (1 thumbnail setiap 7 detik)
Gambar 4. Spritesheet gambar besar (1 thumbnail setiap 7 detik)
Delapan thumbnail dihasilkan dari video contoh, berdurasi
60 detik.