Auf dieser Seite wird erläutert, wie einem ausgegebenen Video Untertitel hinzugefügt werden.
Untertitel (oder einfach Untertitel ) sind die visuelle Darstellung der Audioinhalte in einem Video. Untertitel haben in der Regel dieselbe Sprache wie der Ton und beinhalten Hintergrundgeräusche sowie Sprecherwechsel.
Mit Untertiteln wird in der Regel der Dialog eines Videos in eine andere Sprache übersetzt. Bei Untertiteln sind in der Regel keine Hintergrundgeräusche oder Lautsprecherwechsel enthalten.
Auf dieser Seite wird der Begriff Untertiteldatei eingeben für eine Textdatei verwendet, die Untertitel enthält. Sie stellen diese Datei als Eingabe für einen Job bereit.
Untertitel zu einer Jobkonfiguration hinzufügen
Informationen zu den unterstützten Eingabedateiformaten für Untertiteldateien finden Sie unter Unterstützte Ein- und Ausgaben . Zum Testen Ihrer Konfiguration werden Ihnen eine Beispielvideodatei und Beispiele für Untertiteldateien zur Verfügung gestellt.
Verwenden Sie die Informationen in den folgenden Abschnitten, um einer Jobkonfiguration Untertitel hinzuzufügen. Auf dieser Seite wird davon ausgegangen, dass Sie mit der grundlegenden JobConfig vertraut sind. Weitere Informationen zum Erstellen von Transcodierungsjobs finden Sie unter Jobs erstellen und verwalten .
Untertitel hinzufügen
So erstellen Sie einen Job, der Untertitel in den Ausgabevideodateicontainer einbettet:
Fügen Sie am Anfang der Jobkonfiguration ein inputs
-Array hinzu.
Fügen Sie dem inputs
-Array ein Input
-Objekt hinzu, das den Schlüssel und den URI für das zugehörige Eingabevideo definiert.
Fügen Sie ein weiteres Input
-Objekt hinzu, das den Pfad zur eingegebenen Untertiteldatei enthält.
Hinweis: Fügen Sie in der Untertiteldatei für die Eingabe keine leeren Zeilen zwischen den Textzeilen ein.
Fügen Sie der Jobkonfiguration ein editList
-Array hinzu. Mit diesem Array werden der Zeitachse des Ausgabevideos Eingaben hinzugefügt.
Fügen Sie dem Array editList
ein EditAtom
-Objekt hinzu. Dieses EditAtom
-Objekt muss auf die Schlüssel für das Eingabevideo und die Untertitel verweisen, die Sie im inputs
-Array hinzugefügt haben. Sie können einen startTimeOffset
und einen endTimeOffset
festlegen, um das Eingabevideo zuzuschneiden.
Fügen Sie den Ausgabecontainern die Untertitel hinzu. Fügen Sie dazu dem elementaryStreams
-Array ein textStream
-Objekt hinzu. Es wird nur ein eingebetteter Textstream unterstützt und allen Ausgabevideos hinzugefügt (da es nur eine Ausgabezeitachse gibt).
Verwenden Sie das mapping
-Array im textStream
-Konfigurationsobjekt, um auf den EditAtom
-Objektschlüssel zu verweisen.
Mit der folgenden Beispielkonfiguration werden CEA-608-Untertitel in ein Video eingebettet.
Sie können diese Konfiguration einer Jobvorlage hinzufügen oder sie in eine Ad-hoc-Jobkonfiguration einbinden:
REST
Bevor Sie die Anfragedaten verwenden, ersetzen Sie die folgenden Werte:
PROJECT_ID
: Ihre Google Cloud-Projekt-ID, die unter IAM-Einstellungen aufgeführt ist.
LOCATION
: Der Standort, an dem der Job ausgeführt werden soll. Verwenden Sie eine der unterstützten Regionen .
Standorte anzeigen
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
: Der Name des Cloud Storage-Buckets, den Sie erstellt haben.
STORAGE_INPUT_VIDEO
: Der Name des Videos in Ihrem Cloud Storage-Bucket, den Sie transcodieren, z. B. my-vid.mp4
.
In diesem Feld sollten alle Ordner berücksichtigt werden, die Sie im Bucket erstellt haben (z. B. input/my-vid.mp4
).
STORAGE_CAPTIONS_FILE
: Der Name einer Untertiteldatei in Ihrem Cloud Storage-Bucket, z. B. captions.srt
.
In diesem Feld sollten alle Ordner berücksichtigt werden, die Sie im Bucket erstellt haben (z. B. input/captions.srt
).
STORAGE_OUTPUT_FOLDER
: Der Name des Ausgabeordners in Ihrem Cloud Storage-Bucket, in dem Sie die codierten Videoausgaben speichern möchten.
Hinweis: Sie müssen das Ausgabeordnerobjekt nicht vor dem Job erstellen. Bei der Verarbeitung des Jobs stellt die Transcoder API automatisch den Ordnername voran, den Sie als Teil der Namen der in Cloud Storage gespeicherten Objekte angeben.
Wenn Sie die Anfrage senden möchten, maximieren Sie eine der folgenden Optionen:
curl (Linux, macOS oder Cloud Shell)
Hinweis: Der folgende Befehl setzt voraus, dass Sie sich mit Ihrem Nutzerkonto in der gcloud
CLI angemeldet haben. Dazu haben Sie gcloud init
oder gcloud auth login
ausgeführt oder die Cloud Shell genutzt, die Sie automatisch in der gcloud
CLI anmeldet.
Um herauszufinden, welches Konto gerade aktiv ist, führen Sie gcloud auth list
aus.
Speichern Sie den Anfragetext in einer Datei mit dem Namen request.json
.
Führen Sie folgenden Befehl im Terminal aus, um diese Datei im aktuellen Verzeichnis zu erstellen oder zu überschreiben:
cat > request.json << 'EOF'
{
"config": {
"inputs": [
{
"key": "input0",
"uri": "gs://STORAGE_BUCKET_NAME /STORAGE_INPUT_VIDEO "
},
{
"key": "caption_input0",
"uri": "gs://STORAGE_BUCKET_NAME /STORAGE_CAPTIONS_FILE "
}
],
"editList": [
{
"key": "atom0",
"inputs": [
"input0",
"caption_input0"
]
}
],
"elementaryStreams": [
{
"key": "video-stream0",
"videoStream": {
"h264": {
"heightPixels": 360,
"widthPixels": 640,
"bitrateBps": 550000,
"frameRate": 60
}
}
},
{
"key": "audio-stream0",
"audioStream": {
"codec": "aac",
"bitrateBps": 64000
}
},
{
"key": "cea-stream0",
"textStream": {
"codec": "cea608",
"mapping": [
{
"atomKey": "atom0",
"inputKey": "caption_input0",
"inputTrack": 0
}
],
"languageCode": "en-US",
"displayName": "English"
}
}
],
"muxStreams": [
{
"key": "sd-hls",
"container": "ts",
"elementaryStreams": [
"video-stream0",
"audio-stream0"
]
},
{
"key": "sd-dash",
"container": "fmp4",
"elementaryStreams": [
"video-stream0"
]
},
{
"key": "audio-dash",
"container": "fmp4",
"elementaryStreams": [
"audio-stream0"
]
}
],
"manifests": [
{
"fileName": "manifest.m3u8",
"type": "HLS",
"muxStreams": [
"sd-hls"
]
},
{
"fileName": "manifest.mpd",
"type": "DASH",
"muxStreams": [
"sd-dash",
"audio-dash"
]
}
],
"output": {
"uri": "gs://STORAGE_BUCKET_NAME /STORAGE_OUTPUT_FOLDER /"
}
}
}
EOF
Führen Sie dann folgenden Befehl aus, um Ihre REST-Anfrage zu senden:
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)
Hinweis: Der folgende Befehl setzt voraus, dass Sie sich mit Ihrem Nutzerkonto in der gcloud
CLI angemeldet haben. Dazu haben Sie gcloud init
oder gcloud auth login
ausgeführt oder die Cloud Shell genutzt, die Sie automatisch in der gcloud
CLI anmeldet.
Um herauszufinden, welches Konto gerade aktiv ist, führen Sie gcloud auth list
aus.
Speichern Sie den Anfragetext in einer Datei mit dem Namen request.json
.
Führen Sie folgenden Befehl im Terminal aus, um diese Datei im aktuellen Verzeichnis zu erstellen oder zu überschreiben:
@'
{
"config": {
"inputs": [
{
"key": "input0",
"uri": "gs://STORAGE_BUCKET_NAME /STORAGE_INPUT_VIDEO "
},
{
"key": "caption_input0",
"uri": "gs://STORAGE_BUCKET_NAME /STORAGE_CAPTIONS_FILE "
}
],
"editList": [
{
"key": "atom0",
"inputs": [
"input0",
"caption_input0"
]
}
],
"elementaryStreams": [
{
"key": "video-stream0",
"videoStream": {
"h264": {
"heightPixels": 360,
"widthPixels": 640,
"bitrateBps": 550000,
"frameRate": 60
}
}
},
{
"key": "audio-stream0",
"audioStream": {
"codec": "aac",
"bitrateBps": 64000
}
},
{
"key": "cea-stream0",
"textStream": {
"codec": "cea608",
"mapping": [
{
"atomKey": "atom0",
"inputKey": "caption_input0",
"inputTrack": 0
}
],
"languageCode": "en-US",
"displayName": "English"
}
}
],
"muxStreams": [
{
"key": "sd-hls",
"container": "ts",
"elementaryStreams": [
"video-stream0",
"audio-stream0"
]
},
{
"key": "sd-dash",
"container": "fmp4",
"elementaryStreams": [
"video-stream0"
]
},
{
"key": "audio-dash",
"container": "fmp4",
"elementaryStreams": [
"audio-stream0"
]
}
],
"manifests": [
{
"fileName": "manifest.m3u8",
"type": "HLS",
"muxStreams": [
"sd-hls"
]
},
{
"fileName": "manifest.mpd",
"type": "DASH",
"muxStreams": [
"sd-dash",
"audio-dash"
]
}
],
"output": {
"uri": "gs://STORAGE_BUCKET_NAME /STORAGE_OUTPUT_FOLDER /"
}
}
}
'@ | Out-File -FilePath request.json -Encoding utf8
Führen Sie dann folgenden Befehl aus, um Ihre REST-Anfrage zu senden:
$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
Sie sollten in etwa folgende JSON-Antwort erhalten:
{
"name": "projects/PROJECT_NUMBER /locations/LOCATION /jobs/JOB_ID ",
"config": {
...
},
"state": "PENDING",
"createTime": CREATE_TIME ,
"ttlAfterCompletionDays": 30
}
gcloud
Bevor Sie die folgenden Befehlsdaten verwenden, ersetzen Sie die folgenden Werte:
LOCATION
: Der Standort, an dem der Job ausgeführt werden soll. Verwenden Sie eine der unterstützten Regionen .
Standorte anzeigen
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
: Der Name des Cloud Storage-Buckets, den Sie erstellt haben.
STORAGE_INPUT_VIDEO
: Der Name des Videos in Ihrem Cloud Storage-Bucket, den Sie transcodieren, z. B. my-vid.mp4
.
In diesem Feld sollten alle Ordner berücksichtigt werden, die Sie im Bucket erstellt haben (z. B. input/my-vid.mp4
).
STORAGE_CAPTIONS_FILE
: Der Name einer Untertiteldatei in Ihrem Cloud Storage-Bucket, z. B. captions.srt
.
In diesem Feld sollten alle Ordner berücksichtigt werden, die Sie im Bucket erstellt haben (z. B. input/captions.srt
).
STORAGE_OUTPUT_FOLDER
: Der Name des Ausgabeordners in Ihrem Cloud Storage-Bucket, in dem Sie die codierten Videoausgaben speichern möchten.
Hinweis: Sie müssen das Ausgabeordnerobjekt nicht vor dem Job erstellen. Bei der Verarbeitung des Jobs stellt die Transcoder API automatisch den Ordnername voran, den Sie als Teil der Namen der in Cloud Storage gespeicherten Objekte angeben.
Speichern Sie den folgenden Inhalt in einer Datei mit dem Namen request.json
:
{
"config": {
"inputs": [
{
"key": "input0",
"uri": "gs://STORAGE_BUCKET_NAME /STORAGE_INPUT_VIDEO "
},
{
"key": "caption_input0",
"uri": "gs://STORAGE_BUCKET_NAME /STORAGE_CAPTIONS_FILE "
}
],
"editList": [
{
"key": "atom0",
"inputs": [
"input0",
"caption_input0"
]
}
],
"elementaryStreams": [
{
"key": "video-stream0",
"videoStream": {
"h264": {
"heightPixels": 360,
"widthPixels": 640,
"bitrateBps": 550000,
"frameRate": 60
}
}
},
{
"key": "audio-stream0",
"audioStream": {
"codec": "aac",
"bitrateBps": 64000
}
},
{
"key": "cea-stream0",
"textStream": {
"codec": "cea608",
"mapping": [
{
"atomKey": "atom0",
"inputKey": "caption_input0",
"inputTrack": 0
}
],
"languageCode": "en-US",
"displayName": "English"
}
}
],
"muxStreams": [
{
"key": "sd-hls",
"container": "ts",
"elementaryStreams": [
"video-stream0",
"audio-stream0"
]
},
{
"key": "sd-dash",
"container": "fmp4",
"elementaryStreams": [
"video-stream0"
]
},
{
"key": "audio-dash",
"container": "fmp4",
"elementaryStreams": [
"audio-stream0"
]
}
],
"manifests": [
{
"fileName": "manifest.m3u8",
"type": "HLS",
"muxStreams": [
"sd-hls"
]
},
{
"fileName": "manifest.mpd",
"type": "DASH",
"muxStreams": [
"sd-dash",
"audio-dash"
]
}
],
"output": {
"uri": "gs://STORAGE_BUCKET_NAME /STORAGE_OUTPUT_FOLDER /"
}
}
}
Führen Sie den folgenden Befehl aus:
Linux, macOS oder Cloud Shell
gcloud transcoder jobs create --location=LOCATION --file=request.json
Windows (PowerShell)
gcloud transcoder jobs create --location=LOCATION --file=request.json
Windows (cmd.exe)
gcloud transcoder jobs create --location=LOCATION --file=request.json
Sie sollten eine Antwort ähnlich der folgenden erhalten:
{
"name": "projects/PROJECT_NUMBER /locations/LOCATION /jobs/JOB_ID ",
"config": {
...
},
"state": "PENDING",
"createTime": CREATE_TIME ,
"ttlAfterCompletionDays": 30
}
Go
Folgen Sie der Einrichtungsanleitung für Go in der Transcoder API-Kurzanleitung zur Verwendung von Clientbibliotheken , bevor Sie dieses Beispiel ausprobieren.
Weitere Informationen finden Sie in der Go API-Referenzdokumentation zur Transcoder API .
Richten Sie Standardanmeldedaten für Anwendungen ein, um sich bei der Transcoder API zu authentifizieren.
Weitere Informationen finden Sie unter Authentifizierung für eine lokale Entwicklungsumgebung einrichten .
import (
"context"
"fmt"
"io"
transcoder "cloud.google.com/go/video/transcoder/apiv1"
"cloud.google.com/go/video/transcoder/apiv1/transcoderpb"
)
// createJobWithEmbeddedCaptions creates a job that embeds closed captions in the
// output video. See https://cloud.google.com/transcoder/docs/how-to/captions-and-subtitles
// for more information.
func createJobWithEmbeddedCaptions(w io.Writer, projectID string, location string, inputVideoURI string, inputCaptionsURI string, outputURI string) error {
// projectID := "my-project-id"
// location := "us-central1"
// inputVideoURI := "gs://my-bucket/my-video-file"
// inputCaptionsURI := "gs://my-bucket/my-captions-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()
// Set up elementary streams. The InputKey field refers to inputs in
// the Inputs array defined the job config.
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,
},
},
},
{
Key: "cea_stream0",
ElementaryStream: &transcoderpb.ElementaryStream_TextStream{
TextStream: &transcoderpb.TextStream{
Codec: "cea608",
Mapping: []*transcoderpb.TextStream_TextMapping{
{
AtomKey: "atom0",
InputKey: "caption_input0",
InputTrack: 0,
},
},
LanguageCode: "en-US",
DisplayName: "English",
},
},
},
}
req := &transcoderpb.CreateJobRequest{
Parent: fmt.Sprintf("projects/%s/locations/%s", projectID, location),
Job: &transcoderpb.Job{
OutputUri: outputURI,
JobConfig: &transcoderpb.Job_Config{
Config: &transcoderpb.JobConfig{
Inputs: []*transcoderpb.Input{
{
Key: "input0",
Uri: inputVideoURI,
},
{
Key: "caption_input0",
Uri: inputCaptionsURI,
},
},
EditList: []*transcoderpb.EditAtom{
{
Key: "atom0",
Inputs: []string{"input0", "caption_input0"},
},
},
ElementaryStreams: elementaryStreams,
MuxStreams: []*transcoderpb.MuxStream{
{
Key: "sd-hls",
Container: "ts",
ElementaryStreams: []string{"video_stream0", "audio_stream0"},
},
{
Key: "sd-dash",
Container: "fmp4",
ElementaryStreams: []string{"video_stream0"},
},
{
Key: "audio-dash",
Container: "fmp4",
ElementaryStreams: []string{"audio_stream0"},
},
},
Manifests: []*transcoderpb.Manifest{
{
FileName: "manifest.m3u8",
Type: transcoderpb.Manifest_HLS,
MuxStreams: []string{"sd-hls"},
},
{
FileName: "manifest.mpd",
Type: transcoderpb.Manifest_DASH,
MuxStreams: []string{"sd-dash", "audio-dash"},
},
},
},
},
},
}
// 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("CreateJob: %w", err)
}
fmt.Fprintf(w, "Job: %v", response.GetName())
return nil
}
Node.js
Folgen Sie der Einrichtungsanleitung für Node.js in der Transcoder API-Kurzanleitung zur Verwendung von Clientbibliotheken , bevor Sie dieses Beispiel ausprobieren.
Weitere Informationen finden Sie in der Node.js API-Referenzdokumentation zur Transcoder API .
Richten Sie Standardanmeldedaten für Anwendungen ein, um sich bei der Transcoder API zu authentifizieren.
Weitere Informationen finden Sie unter Authentifizierung für eine lokale Entwicklungsumgebung einrichten .
/**
* TODO(developer): Uncomment these variables before running the sample.
*/
// projectId = 'my-project-id';
// location = 'us-central1';
// inputVideoUri = 'gs://my-bucket/my-video-file';
// inputCaptionsUri = 'gs://my-bucket/my-captions-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 createJobWithEmbeddedCaptions() {
// Construct request
const request = {
parent: transcoderServiceClient.locationPath(projectId, location),
job: {
outputUri: outputUri,
config: {
inputs: [
{
key: 'input0',
uri: inputVideoUri,
},
{
key: 'caption_input0',
uri: inputCaptionsUri,
},
],
editList: [
{
key: 'atom0',
inputs: ['input0', 'caption_input0'],
},
],
elementaryStreams: [
{
key: 'video-stream0',
videoStream: {
h264: {
heightPixels: 360,
widthPixels: 640,
bitrateBps: 550000,
frameRate: 60,
},
},
},
{
key: 'audio-stream0',
audioStream: {
codec: 'aac',
bitrateBps: 64000,
},
},
{
key: 'cea-stream0',
textStream: {
codec: 'cea608',
mapping: [
{
atomKey: 'atom0',
inputKey: 'caption_input0',
inputTrack: 0,
},
],
languageCode: 'en-US',
displayName: 'English',
},
},
],
muxStreams: [
{
key: 'sd-hls',
container: 'ts',
elementaryStreams: ['video-stream0', 'audio-stream0'],
},
{
key: 'sd-dash',
container: 'fmp4',
elementaryStreams: ['video-stream0'],
},
{
key: 'audio-dash',
container: 'fmp4',
elementaryStreams: ['audio-stream0'],
},
],
manifests: [
{
fileName: 'manifest.m3u8',
type: 'HLS',
muxStreams: ['sd-hls'],
},
{
fileName: 'manifest.mpd',
type: 'DASH',
muxStreams: ['sd-dash', 'audio-dash'],
},
],
},
},
};
// Run request
const [response] = await transcoderServiceClient.createJob(request);
console.log(`Job: ${response.name}`);
}
createJobWithEmbeddedCaptions();
Python
Folgen Sie der Einrichtungsanleitung für Python in der Transcoder API-Kurzanleitung zur Verwendung von Clientbibliotheken , bevor Sie dieses Beispiel ausprobieren.
Weitere Informationen finden Sie in der Python API-Referenzdokumentation zur Transcoder API .
Richten Sie Standardanmeldedaten für Anwendungen ein, um sich bei der Transcoder API zu authentifizieren.
Weitere Informationen finden Sie unter Authentifizierung für eine lokale Entwicklungsumgebung einrichten .
import argparse
from google.cloud.video import transcoder_v1
from google.cloud.video.transcoder_v1.services.transcoder_service import (
TranscoderServiceClient,
)
def create_job_with_embedded_captions(
project_id: str,
location: str,
input_video_uri: str,
input_captions_uri: str,
output_uri: str,
) -> transcoder_v1.types.resources.Job:
"""Creates a job based on an ad-hoc job configuration that embeds closed captions in the output video.
Args:
project_id (str): The GCP project ID.
location (str): The location to start the job in.
input_video_uri (str): Uri of the input video in the Cloud Storage
bucket.
input_captions_uri (str): Uri of the input captions file in the Cloud
Storage bucket.
output_uri (str): 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.output_uri = output_uri
job.config = transcoder_v1.types.JobConfig(
inputs=[
transcoder_v1.types.Input(
key="input0",
uri=input_video_uri,
),
transcoder_v1.types.Input(
key="caption-input0",
uri=input_captions_uri,
),
],
edit_list=[
transcoder_v1.types.EditAtom(
key="atom0",
inputs=["input0", "caption-input0"],
),
],
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,
),
),
transcoder_v1.types.ElementaryStream(
key="cea-stream0",
text_stream=transcoder_v1.types.TextStream(
codec="cea608",
mapping_=[
transcoder_v1.types.TextStream.TextMapping(
atom_key="atom0",
input_key="caption-input0",
input_track=0,
),
],
language_code="en-US",
display_name="English",
),
),
],
mux_streams=[
transcoder_v1.types.MuxStream(
key="sd-hls",
container="ts",
elementary_streams=["video-stream0", "audio-stream0"],
),
transcoder_v1.types.MuxStream(
key="sd-dash",
container="fmp4",
elementary_streams=["video-stream0"],
),
transcoder_v1.types.MuxStream(
key="audio-dash",
container="fmp4",
elementary_streams=["audio-stream0"],
),
],
manifests=[
transcoder_v1.types.Manifest(
file_name="manifest.m3u8",
type_="HLS",
mux_streams=["sd-hls"],
),
transcoder_v1.types.Manifest(
file_name="manifest.mpd",
type_="DASH",
mux_streams=["sd-dash", "audio-dash"],
),
],
)
response = client.create_job(parent=parent, job=job)
print(f"Job: {response.name}")
return response
Untertitel hinzufügen
So erstellen Sie einen Job, der mehrsprachige Untertiteldateien erzeugt, die über ein Manifest wiedergegeben werden:
Fügen Sie der Jobkonfiguration ein inputs
-Array hinzu.
Fügen Sie dem inputs
-Array ein Input
-Objekt hinzu, das den Schlüssel und den URI für das zugehörige Eingabevideo definiert.
Fügen Sie ein weiteres Input
-Objekt hinzu, das den URI für die eingegebene Untertiteldatei definiert.
Fügen Sie der Konfiguration ein editList
-Array hinzu. Mit diesem Array werden die Eingaben zur Zeitachse des Ausgabevideos hinzugefügt.
Fügen Sie dem editList
-Array ein EditAtom
-Objekt hinzu, das anhand des Schlüssels auf die Objekte im inputs
-Array verweist. Sie können einen startTimeOffset
und einen endTimeOffset
festlegen, um das Eingabevideo zuzuschneiden.
Fügen Sie den Ausgabecontainern die Untertitel hinzu. Fügen Sie dazu dem elementaryStreams
-Array ein textStream
-Objekt hinzu.
Geben Sie für die eigenständige Untertiteldatei den Container im Array muxStream
an. Siehe die Objekte mit den Schlüsseln text-vtt-en
und text-vtt-es
in der folgenden Konfiguration. Für eingebettete Untertitel benötigst du nur den Elementarstream.
Mit der folgenden Konfiguration werden mehrere WebVTT-Dateien generiert, eine für englische und eine für spanische Untertitel.
Hinweis :Untertitel werden nur in HLS-Manifesten unterstützt. In DASH-Manifesten und MP4-Dateien werden keine Untertitel unterstützt.
Sie können diese Konfiguration einer Jobvorlage hinzufügen oder sie in eine Ad-hoc-Jobkonfiguration einbinden:
REST
Bevor Sie die Anfragedaten verwenden, ersetzen Sie die folgenden Werte:
PROJECT_ID
: Ihre Google Cloud-Projekt-ID, die unter IAM-Einstellungen aufgeführt ist.
LOCATION
: Der Standort, an dem der Job ausgeführt werden soll. Verwenden Sie eine der unterstützten Regionen .
Standorte anzeigen
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
: Der Name des Cloud Storage-Buckets, den Sie erstellt haben.
STORAGE_INPUT_VIDEO
: Der Name des Videos in Ihrem Cloud Storage-Bucket, den Sie transcodieren, z. B. my-vid.mp4
.
In diesem Feld sollten alle Ordner berücksichtigt werden, die Sie im Bucket erstellt haben (z. B. input/my-vid.mp4
).
STORAGE_SUBTITLES_FILE1
: Der Name der Untertiteldatei in Ihrem Cloud Storage-Bucket, z. B. subtitles-en.srt
für englischsprachige Untertitel. In diesem Feld sollten alle Ordner berücksichtigt werden, die Sie im Bucket erstellt haben (z. B. input/subtitles-en.srt
).
STORAGE_SUBTITLES_FILE2
: Der Name einer anderen Untertiteldatei in Ihrem Cloud Storage-Bucket, z. B. subtitles-es.srt
für Untertitel in spanischer Sprache. In diesem Feld sollten alle Ordner berücksichtigt werden, die Sie im Bucket erstellt haben (z. B. input/subtitles-es.srt
).
STORAGE_OUTPUT_FOLDER
: Der Name des Ausgabeordners in Ihrem Cloud Storage-Bucket, in dem Sie die codierten Videoausgaben speichern möchten.
Hinweis: Sie müssen das Ausgabeordnerobjekt nicht vor dem Job erstellen. Bei der Verarbeitung des Jobs stellt die Transcoder API automatisch den Ordnername voran, den Sie als Teil der Namen der in Cloud Storage gespeicherten Objekte angeben.
Wenn Sie die Anfrage senden möchten, maximieren Sie eine der folgenden Optionen:
curl (Linux, macOS oder Cloud Shell)
Hinweis: Der folgende Befehl setzt voraus, dass Sie sich mit Ihrem Nutzerkonto in der gcloud
CLI angemeldet haben. Dazu haben Sie gcloud init
oder gcloud auth login
ausgeführt oder die Cloud Shell genutzt, die Sie automatisch in der gcloud
CLI anmeldet.
Um herauszufinden, welches Konto gerade aktiv ist, führen Sie gcloud auth list
aus.
Speichern Sie den Anfragetext in einer Datei mit dem Namen request.json
.
Führen Sie folgenden Befehl im Terminal aus, um diese Datei im aktuellen Verzeichnis zu erstellen oder zu überschreiben:
cat > request.json << 'EOF'
{
"config": {
"inputs": [
{
"key": "input0",
"uri": "gs://STORAGE_BUCKET_NAME /STORAGE_INPUT_VIDEO "
},
{
"key": "subtitle_input_en",
"uri": "gs://STORAGE_BUCKET_NAME /STORAGE_SUBTITLES_FILE1 "
},
{
"key": "subtitle_input_es",
"uri": "gs://STORAGE_BUCKET_NAME /STORAGE_SUBTITLES_FILE2 "
}
],
"editList": [
{
"key": "atom0",
"inputs": [
"input0",
"subtitle_input_en",
"subtitle_input_es"
]
}
],
"elementaryStreams": [
{
"key": "video-stream0",
"videoStream": {
"h264": {
"heightPixels": 360,
"widthPixels": 640,
"bitrateBps": 550000,
"frameRate": 60
}
}
},
{
"key": "audio-stream0",
"audioStream": {
"codec": "aac",
"bitrateBps": 64000
}
},
{
"key": "vtt-stream-en",
"textStream": {
"codec": "webvtt",
"languageCode": "en-US",
"displayName": "English",
"mapping": [
{
"atomKey": "atom0",
"inputKey": "subtitle_input_en"
}
]
}
},
{
"key": "vtt-stream-es",
"textStream": {
"codec": "webvtt",
"languageCode": "es-ES",
"displayName": "Spanish",
"mapping": [
{
"atomKey": "atom0",
"inputKey": "subtitle_input_es"
}
]
}
}
],
"muxStreams": [
{
"key": "sd-hls-fmp4",
"container": "fmp4",
"elementaryStreams": [
"video-stream0"
]
},
{
"key": "audio-hls-fmp4",
"container": "fmp4",
"elementaryStreams": [
"audio-stream0"
]
},
{
"key": "text-vtt-en",
"container": "vtt",
"elementaryStreams": [
"vtt-stream-en"
],
"segmentSettings": {
"segmentDuration": "6s",
"individualSegments": true
}
},
{
"key": "text-vtt-es",
"container": "vtt",
"elementaryStreams": [
"vtt-stream-es"
],
"segmentSettings": {
"segmentDuration": "6s",
"individualSegments": true
}
}
],
"manifests": [
{
"fileName": "manifest.m3u8",
"type": "HLS",
"muxStreams": [
"sd-hls-fmp4",
"audio-hls-fmp4",
"text-vtt-en",
"text-vtt-es"
]
}
],
"output": {
"uri": "gs://STORAGE_BUCKET_NAME /STORAGE_OUTPUT_FOLDER /"
}
}
}
EOF
Führen Sie dann folgenden Befehl aus, um Ihre REST-Anfrage zu senden:
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)
Hinweis: Der folgende Befehl setzt voraus, dass Sie sich mit Ihrem Nutzerkonto in der gcloud
CLI angemeldet haben. Dazu haben Sie gcloud init
oder gcloud auth login
ausgeführt oder die Cloud Shell genutzt, die Sie automatisch in der gcloud
CLI anmeldet.
Um herauszufinden, welches Konto gerade aktiv ist, führen Sie gcloud auth list
aus.
Speichern Sie den Anfragetext in einer Datei mit dem Namen request.json
.
Führen Sie folgenden Befehl im Terminal aus, um diese Datei im aktuellen Verzeichnis zu erstellen oder zu überschreiben:
@'
{
"config": {
"inputs": [
{
"key": "input0",
"uri": "gs://STORAGE_BUCKET_NAME /STORAGE_INPUT_VIDEO "
},
{
"key": "subtitle_input_en",
"uri": "gs://STORAGE_BUCKET_NAME /STORAGE_SUBTITLES_FILE1 "
},
{
"key": "subtitle_input_es",
"uri": "gs://STORAGE_BUCKET_NAME /STORAGE_SUBTITLES_FILE2 "
}
],
"editList": [
{
"key": "atom0",
"inputs": [
"input0",
"subtitle_input_en",
"subtitle_input_es"
]
}
],
"elementaryStreams": [
{
"key": "video-stream0",
"videoStream": {
"h264": {
"heightPixels": 360,
"widthPixels": 640,
"bitrateBps": 550000,
"frameRate": 60
}
}
},
{
"key": "audio-stream0",
"audioStream": {
"codec": "aac",
"bitrateBps": 64000
}
},
{
"key": "vtt-stream-en",
"textStream": {
"codec": "webvtt",
"languageCode": "en-US",
"displayName": "English",
"mapping": [
{
"atomKey": "atom0",
"inputKey": "subtitle_input_en"
}
]
}
},
{
"key": "vtt-stream-es",
"textStream": {
"codec": "webvtt",
"languageCode": "es-ES",
"displayName": "Spanish",
"mapping": [
{
"atomKey": "atom0",
"inputKey": "subtitle_input_es"
}
]
}
}
],
"muxStreams": [
{
"key": "sd-hls-fmp4",
"container": "fmp4",
"elementaryStreams": [
"video-stream0"
]
},
{
"key": "audio-hls-fmp4",
"container": "fmp4",
"elementaryStreams": [
"audio-stream0"
]
},
{
"key": "text-vtt-en",
"container": "vtt",
"elementaryStreams": [
"vtt-stream-en"
],
"segmentSettings": {
"segmentDuration": "6s",
"individualSegments": true
}
},
{
"key": "text-vtt-es",
"container": "vtt",
"elementaryStreams": [
"vtt-stream-es"
],
"segmentSettings": {
"segmentDuration": "6s",
"individualSegments": true
}
}
],
"manifests": [
{
"fileName": "manifest.m3u8",
"type": "HLS",
"muxStreams": [
"sd-hls-fmp4",
"audio-hls-fmp4",
"text-vtt-en",
"text-vtt-es"
]
}
],
"output": {
"uri": "gs://STORAGE_BUCKET_NAME /STORAGE_OUTPUT_FOLDER /"
}
}
}
'@ | Out-File -FilePath request.json -Encoding utf8
Führen Sie dann folgenden Befehl aus, um Ihre REST-Anfrage zu senden:
$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
Sie sollten in etwa folgende JSON-Antwort erhalten:
{
"name": "projects/PROJECT_NUMBER /locations/LOCATION /jobs/JOB_ID ",
"config": {
...
},
"state": "PENDING",
"createTime": CREATE_TIME ,
"ttlAfterCompletionDays": 30
}
gcloud
Bevor Sie die folgenden Befehlsdaten verwenden, ersetzen Sie die folgenden Werte:
LOCATION
: Der Standort, an dem der Job ausgeführt werden soll. Verwenden Sie eine der unterstützten Regionen .
Standorte anzeigen
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
: Der Name des Cloud Storage-Buckets, den Sie erstellt haben.
STORAGE_INPUT_VIDEO
: Der Name des Videos in Ihrem Cloud Storage-Bucket, den Sie transcodieren, z. B. my-vid.mp4
.
In diesem Feld sollten alle Ordner berücksichtigt werden, die Sie im Bucket erstellt haben (z. B. input/my-vid.mp4
).
STORAGE_SUBTITLES_FILE1
: Der Name der Untertiteldatei in Ihrem Cloud Storage-Bucket, z. B. subtitles-en.srt
für englischsprachige Untertitel. In diesem Feld sollten alle Ordner berücksichtigt werden, die Sie im Bucket erstellt haben (z. B. input/subtitles-en.srt
).
STORAGE_SUBTITLES_FILE2
: Der Name einer anderen Untertiteldatei in Ihrem Cloud Storage-Bucket, z. B. subtitles-es.srt
für Untertitel in spanischer Sprache. In diesem Feld sollten alle Ordner berücksichtigt werden, die Sie im Bucket erstellt haben (z. B. input/subtitles-es.srt
).
STORAGE_OUTPUT_FOLDER
: Der Name des Ausgabeordners in Ihrem Cloud Storage-Bucket, in dem Sie die codierten Videoausgaben speichern möchten.
Hinweis: Sie müssen das Ausgabeordnerobjekt nicht vor dem Job erstellen. Bei der Verarbeitung des Jobs stellt die Transcoder API automatisch den Ordnername voran, den Sie als Teil der Namen der in Cloud Storage gespeicherten Objekte angeben.
Speichern Sie den folgenden Inhalt in einer Datei mit dem Namen request.json
:
{
"config": {
"inputs": [
{
"key": "input0",
"uri": "gs://STORAGE_BUCKET_NAME /STORAGE_INPUT_VIDEO "
},
{
"key": "subtitle_input_en",
"uri": "gs://STORAGE_BUCKET_NAME /STORAGE_SUBTITLES_FILE1 "
},
{
"key": "subtitle_input_es",
"uri": "gs://STORAGE_BUCKET_NAME /STORAGE_SUBTITLES_FILE2 "
}
],
"editList": [
{
"key": "atom0",
"inputs": [
"input0",
"subtitle_input_en",
"subtitle_input_es"
]
}
],
"elementaryStreams": [
{
"key": "video-stream0",
"videoStream": {
"h264": {
"heightPixels": 360,
"widthPixels": 640,
"bitrateBps": 550000,
"frameRate": 60
}
}
},
{
"key": "audio-stream0",
"audioStream": {
"codec": "aac",
"bitrateBps": 64000
}
},
{
"key": "vtt-stream-en",
"textStream": {
"codec": "webvtt",
"languageCode": "en-US",
"displayName": "English",
"mapping": [
{
"atomKey": "atom0",
"inputKey": "subtitle_input_en"
}
]
}
},
{
"key": "vtt-stream-es",
"textStream": {
"codec": "webvtt",
"languageCode": "es-ES",
"displayName": "Spanish",
"mapping": [
{
"atomKey": "atom0",
"inputKey": "subtitle_input_es"
}
]
}
}
],
"muxStreams": [
{
"key": "sd-hls-fmp4",
"container": "fmp4",
"elementaryStreams": [
"video-stream0"
]
},
{
"key": "audio-hls-fmp4",
"container": "fmp4",
"elementaryStreams": [
"audio-stream0"
]
},
{
"key": "text-vtt-en",
"container": "vtt",
"elementaryStreams": [
"vtt-stream-en"
],
"segmentSettings": {
"segmentDuration": "6s",
"individualSegments": true
}
},
{
"key": "text-vtt-es",
"container": "vtt",
"elementaryStreams": [
"vtt-stream-es"
],
"segmentSettings": {
"segmentDuration": "6s",
"individualSegments": true
}
}
],
"manifests": [
{
"fileName": "manifest.m3u8",
"type": "HLS",
"muxStreams": [
"sd-hls-fmp4",
"audio-hls-fmp4",
"text-vtt-en",
"text-vtt-es"
]
}
],
"output": {
"uri": "gs://STORAGE_BUCKET_NAME /STORAGE_OUTPUT_FOLDER /"
}
}
}
Führen Sie den folgenden Befehl aus:
Linux, macOS oder Cloud Shell
gcloud transcoder jobs create --location=LOCATION --file=request.json
Windows (PowerShell)
gcloud transcoder jobs create --location=LOCATION --file=request.json
Windows (cmd.exe)
gcloud transcoder jobs create --location=LOCATION --file=request.json
Sie sollten eine Antwort ähnlich der folgenden erhalten:
{
"name": "projects/PROJECT_NUMBER /locations/LOCATION /jobs/JOB_ID ",
"config": {
...
},
"state": "PENDING",
"createTime": CREATE_TIME ,
"ttlAfterCompletionDays": 30
}
Go
Folgen Sie der Einrichtungsanleitung für Go in der Transcoder API-Kurzanleitung zur Verwendung von Clientbibliotheken , bevor Sie dieses Beispiel ausprobieren.
Weitere Informationen finden Sie in der Go API-Referenzdokumentation zur Transcoder API .
Richten Sie Standardanmeldedaten für Anwendungen ein, um sich bei der Transcoder API zu authentifizieren.
Weitere Informationen finden Sie unter Authentifizierung für eine lokale Entwicklungsumgebung einrichten .
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"
)
// createJobWithStandaloneCaptions creates a job that can use subtitles from a
// standalone file. See https://cloud.google.com/transcoder/docs/how-to/captions-and-subtitles
// for more information.
func createJobWithStandaloneCaptions(w io.Writer, projectID string, location string, inputVideoURI string, inputSubtitles1URI string, inputSubtitles2URI string, outputURI string) error {
// projectID := "my-project-id"
// location := "us-central1"
// inputVideoURI := "gs://my-bucket/my-video-file"
// inputSubtitles1URI := "gs://my-bucket/my-subtitles-file1"
// inputSubtitles2URI := "gs://my-bucket/my-subtitles-file2"
// 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()
// Set up elementary streams. The InputKey field refers to inputs in
// the Inputs array defined the job config.
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,
},
},
},
{
Key: "vtt_stream_en",
ElementaryStream: &transcoderpb.ElementaryStream_TextStream{
TextStream: &transcoderpb.TextStream{
Codec: "webvtt",
LanguageCode: "en-US",
DisplayName: "English",
Mapping: []*transcoderpb.TextStream_TextMapping{
{
AtomKey: "atom0",
InputKey: "subtitle_input_en",
},
},
},
},
},
{
Key: "vtt_stream_es",
ElementaryStream: &transcoderpb.ElementaryStream_TextStream{
TextStream: &transcoderpb.TextStream{
Codec: "webvtt",
LanguageCode: "es-ES",
DisplayName: "Spanish",
Mapping: []*transcoderpb.TextStream_TextMapping{
{
AtomKey: "atom0",
InputKey: "subtitle_input_es",
},
},
},
},
},
}
req := &transcoderpb.CreateJobRequest{
Parent: fmt.Sprintf("projects/%s/locations/%s", projectID, location),
Job: &transcoderpb.Job{
OutputUri: outputURI,
JobConfig: &transcoderpb.Job_Config{
Config: &transcoderpb.JobConfig{
Inputs: []*transcoderpb.Input{
{
Key: "input0",
Uri: inputVideoURI,
},
{
Key: "subtitle_input_en",
Uri: inputSubtitles1URI,
},
{
Key: "subtitle_input_es",
Uri: inputSubtitles2URI,
},
},
EditList: []*transcoderpb.EditAtom{
{
Key: "atom0",
Inputs: []string{"input0", "subtitle_input_en", "subtitle_input_es"},
},
},
ElementaryStreams: elementaryStreams,
MuxStreams: []*transcoderpb.MuxStream{
{
Key: "sd-hls-fmp4",
Container: "fmp4",
ElementaryStreams: []string{"video_stream0"},
},
{
Key: "audio-hls-fmp4",
Container: "fmp4",
ElementaryStreams: []string{"audio_stream0"},
},
{
Key: "text-vtt-en",
Container: "vtt",
ElementaryStreams: []string{"vtt_stream_en"},
SegmentSettings: &transcoderpb.SegmentSettings{
SegmentDuration: &duration.Duration{
Seconds: 6,
},
IndividualSegments: true,
},
},
{
Key: "text-vtt-es",
Container: "vtt",
ElementaryStreams: []string{"vtt_stream_es"},
SegmentSettings: &transcoderpb.SegmentSettings{
SegmentDuration: &duration.Duration{
Seconds: 6,
},
IndividualSegments: true,
},
},
},
Manifests: []*transcoderpb.Manifest{
{
FileName: "manifest.m3u8",
Type: transcoderpb.Manifest_HLS,
MuxStreams: []string{"sd-hls-fmp4", "audio-hls-fmp4", "text-vtt-en", "text-vtt-es"},
},
},
},
},
},
}
// 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("CreateJob: %w", err)
}
fmt.Fprintf(w, "Job: %v", response.GetName())
return nil
}
Node.js
Folgen Sie der Einrichtungsanleitung für Node.js in der Transcoder API-Kurzanleitung zur Verwendung von Clientbibliotheken , bevor Sie dieses Beispiel ausprobieren.
Weitere Informationen finden Sie in der Node.js API-Referenzdokumentation zur Transcoder API .
Richten Sie Standardanmeldedaten für Anwendungen ein, um sich bei der Transcoder API zu authentifizieren.
Weitere Informationen finden Sie unter Authentifizierung für eine lokale Entwicklungsumgebung einrichten .
/**
* TODO(developer): Uncomment these variables before running the sample.
*/
// projectId = 'my-project-id';
// location = 'us-central1';
// inputVideoUri = 'gs://my-bucket/my-video-file';
// inputSubtitles1Uri = 'gs://my-bucket/my-captions-file1';
// inputSubtitles2Uri = 'gs://my-bucket/my-captions-file2';
// 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 createJobWithStandaloneCaptions() {
// Construct request
const request = {
parent: transcoderServiceClient.locationPath(projectId, location),
job: {
outputUri: outputUri,
config: {
inputs: [
{
key: 'input0',
uri: inputVideoUri,
},
{
key: 'subtitle_input_en',
uri: inputSubtitles1Uri,
},
{
key: 'subtitle_input_es',
uri: inputSubtitles2Uri,
},
],
editList: [
{
key: 'atom0',
inputs: ['input0', 'subtitle_input_en', 'subtitle_input_es'],
},
],
elementaryStreams: [
{
key: 'video-stream0',
videoStream: {
h264: {
heightPixels: 360,
widthPixels: 640,
bitrateBps: 550000,
frameRate: 60,
},
},
},
{
key: 'audio-stream0',
audioStream: {
codec: 'aac',
bitrateBps: 64000,
},
},
{
key: 'vtt-stream-en',
textStream: {
codec: 'webvtt',
languageCode: 'en-US',
displayName: 'English',
mapping: [
{
atomKey: 'atom0',
inputKey: 'subtitle_input_en',
},
],
},
},
{
key: 'vtt-stream-es',
textStream: {
codec: 'webvtt',
languageCode: 'es-ES',
displayName: 'Spanish',
mapping: [
{
atomKey: 'atom0',
inputKey: 'subtitle_input_es',
},
],
},
},
],
muxStreams: [
{
key: 'sd-hls-fmp4',
container: 'fmp4',
elementaryStreams: ['video-stream0'],
},
{
key: 'audio-hls-fmp4',
container: 'fmp4',
elementaryStreams: ['audio-stream0'],
},
{
key: 'text-vtt-en',
container: 'vtt',
elementaryStreams: ['vtt-stream-en'],
segmentSettings: {
segmentDuration: {
seconds: 6,
},
individualSegments: true,
},
},
{
key: 'text-vtt-es',
container: 'vtt',
elementaryStreams: ['vtt-stream-es'],
segmentSettings: {
segmentDuration: {
seconds: 6,
},
individualSegments: true,
},
},
],
manifests: [
{
fileName: 'manifest.m3u8',
type: 'HLS',
muxStreams: [
'sd-hls-fmp4',
'audio-hls-fmp4',
'text-vtt-en',
'text-vtt-es',
],
},
],
},
},
};
// Run request
const [response] = await transcoderServiceClient.createJob(request);
console.log(`Job: ${response.name}`);
}
createJobWithStandaloneCaptions();
Python
Folgen Sie der Einrichtungsanleitung für Python in der Transcoder API-Kurzanleitung zur Verwendung von Clientbibliotheken , bevor Sie dieses Beispiel ausprobieren.
Weitere Informationen finden Sie in der Python API-Referenzdokumentation zur Transcoder API .
Richten Sie Standardanmeldedaten für Anwendungen ein, um sich bei der Transcoder API zu authentifizieren.
Weitere Informationen finden Sie unter Authentifizierung für eine lokale Entwicklungsumgebung einrichten .
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_standalone_captions(
project_id: str,
location: str,
input_video_uri: str,
input_subtitles1_uri: str,
input_subtitles2_uri: str,
output_uri: str,
) -> transcoder_v1.types.resources.Job:
"""Creates a job based on an ad-hoc job configuration that can use subtitles from a standalone file.
Args:
project_id (str): The GCP project ID.
location (str): The location to start the job in.
input_video_uri (str): Uri of the input video in the Cloud Storage
bucket.
input_subtitles1_uri (str): Uri of an input subtitles file in the Cloud
Storage bucket.
input_subtitles2_uri (str): Uri of an input subtitles file in the Cloud
Storage bucket.
output_uri (str): 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.output_uri = output_uri
job.config = transcoder_v1.types.JobConfig(
inputs=[
transcoder_v1.types.Input(
key="input0",
uri=input_video_uri,
),
transcoder_v1.types.Input(
key="subtitle-input-en",
uri=input_subtitles1_uri,
),
transcoder_v1.types.Input(
key="subtitle-input-es",
uri=input_subtitles2_uri,
),
],
edit_list=[
transcoder_v1.types.EditAtom(
key="atom0",
inputs=["input0", "subtitle-input-en", "subtitle-input-es"],
),
],
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,
),
),
transcoder_v1.types.ElementaryStream(
key="vtt-stream-en",
text_stream=transcoder_v1.types.TextStream(
codec="webvtt",
language_code="en-US",
display_name="English",
mapping_=[
transcoder_v1.types.TextStream.TextMapping(
atom_key="atom0",
input_key="subtitle-input-en",
),
],
),
),
transcoder_v1.types.ElementaryStream(
key="vtt-stream-es",
text_stream=transcoder_v1.types.TextStream(
codec="webvtt",
language_code="es-ES",
display_name="Spanish",
mapping_=[
transcoder_v1.types.TextStream.TextMapping(
atom_key="atom0",
input_key="subtitle-input-es",
),
],
),
),
],
mux_streams=[
transcoder_v1.types.MuxStream(
key="sd-hls-fmp4",
container="fmp4",
elementary_streams=["video-stream0"],
),
transcoder_v1.types.MuxStream(
key="audio-hls-fmp4",
container="fmp4",
elementary_streams=["audio-stream0"],
),
transcoder_v1.types.MuxStream(
key="text-vtt-en",
container="vtt",
elementary_streams=["vtt-stream-en"],
segment_settings=transcoder_v1.types.SegmentSettings(
segment_duration=duration.Duration(
seconds=6,
),
individual_segments=True,
),
),
transcoder_v1.types.MuxStream(
key="text-vtt-es",
container="vtt",
elementary_streams=["vtt-stream-es"],
segment_settings=transcoder_v1.types.SegmentSettings(
segment_duration=duration.Duration(
seconds=6,
),
individual_segments=True,
),
),
],
manifests=[
transcoder_v1.types.Manifest(
file_name="manifest.m3u8",
type_="HLS",
mux_streams=[
"sd-hls-fmp4",
"audio-hls-fmp4",
"text-vtt-en",
"text-vtt-es",
],
),
],
)
response = client.create_job(parent=parent, job=job)
print(f"Job: {response.name}")
return response
Spielen Sie Ihr Video ab.
Um die Untertitel unter Windows anzusehen, spielen Sie das Video in der Play Filme & Serien App ab. Achten Sie darauf, den Untertitel auszuwählen.
Unter macOS oder Linux können Sie das Video im Shaka-Player abspielen. Achte darauf, Untertitel über das Menü Untertitel zu aktivieren.
Führen Sie die folgenden Schritte aus, um die generierte Mediadatei in Shaka Player abzuspielen:
Machen Sie den von Ihnen erstellten Cloud Storage-Bucket öffentlich.
So aktivieren Sie Cross-Origin Resource Sharing (CORS) für einen Cloud Storage-Bucket :
Erstellen Sie eine JSON-Datei, die Folgendes enthält:
[
{
"origin": ["https://shaka-player-demo.appspot.com/"],
"responseHeader": ["Content-Type", "Range"],
"method": ["GET", "HEAD"],
"maxAgeSeconds": 3600
}
]
Führen Sie den folgenden Befehl aus, nachdem Sie JSON_FILE_NAME durch den Namen der JSON-Datei ersetzt haben, die Sie im vorherigen Schritt erstellt haben:
gsutil cors set JSON_FILE_NAME .json gs://STORAGE_BUCKET_NAME
Wählen Sie eine der MP4- oder Manifestdateien aus, die vom Transcodierungsjob im Cloud Storage-Bucket generiert wurden.
Klicken Sie in der Spalte Öffentlicher Zugriff der Datei auf URL kopieren .
Rufen Sie Shaka Player , ein Online-Livestream-Player, auf.
Klicken Sie in der Navigationsleiste oben auf Benutzerdefinierte Inhalte .
Klicken Sie auf die Schaltfläche + .
Fügen Sie die öffentliche URL der Datei in das Feld URL manifestieren ein.
Geben Sie einen Namen in das Feld Name ein.
Klicken Sie auf Speichern .
Klicken Sie auf Wiedergabe .
Über das Dreipunkt-Menü rechts unten im Player kannst du die Untertitel aktivieren.
Hinweis :Untertitel werden nicht von allen Mediaplayern unterstützt. Weitere Informationen findest du in der Player-Dokumentation.
Beispiel
Sie können die folgenden Dateien für einen Testjob verwenden:
Die eingegebene Untertiteldatei darf keine leeren Zeilen zwischen den Textzeilen enthalten.