Auf dieser Seite wird erläutert, wie Sie einem ausgegebenen Video Untertitel hinzufügen.
Untertitel (oder einfach Untertitel ) sind die visuelle Darstellung der Audiospur eines Videos. Geschlossen
Untertitel sind in der Regel in derselben Sprache wie die Audioinhalte und enthalten den Hintergrund.
Töne und Lautsprecher ändern.
Untertitel werden in der Regel verwendet, um Dialoge in Videos
in einer anderen Sprache. Untertitel enthalten normalerweise keine Hintergrundgeräusche und
Sprecherwechsel.
Auf dieser Seite bezieht sich der Begriff Eingabeuntertiteldatei auf eine Textdatei, die
oder Untertitel. Sie stellen diese Datei als Eingabe für einen Job bereit.
Einer Jobkonfiguration Untertitel hinzufügen
Weitere Informationen finden Sie im
unterstützte Ein- und Ausgaben
. Eine Beispielvideodatei und
Beispieldateien für Eingabeuntertitel werden dir zum Testen deiner Konfiguration zur Verfügung gestellt.
Verwenden Sie die Informationen in den folgenden Abschnitten, um einem Job Untertitel hinzuzufügen
Konfiguration. Auf dieser Seite wird davon ausgegangen, dass Sie mit grundlegenden
JobConfig übergeben werden. Weitere Informationen
zum Erstellen von Transcodierungsjobs finden Sie unter
Jobs erstellen und verwalten
Untertitel hinzufügen
Um einen Job zu erstellen, der Untertitel in den Container der Videodatei für die Ausgabe einbettet, führen Sie die
Folgendes:
Hinzufügen eines
inputs
-Array
vor der Jobkonfiguration hinzugefügt.
Input
-Objekt hinzufügen
zum Array inputs
hinzu, das den Schlüssel und den URI für die zugehörige Eingabe definiert.
Video.
Weiteren Input
hinzufügen
Objekt, das den Pfad zur Eingabe-Untertiteldatei enthält.
Hinweis: Fügen Sie in der eingegebenen Untertiteldatei keine Leerzeilen zwischen die Textzeilen ein.
Hinzufügen eines
editList
zur Jobkonfiguration hinzu. Mit diesem Array werden der
Zeitleiste für die Videoausgabe.
EditAtom
hinzufügen
-Objekt zum Array editList
hinzu. Dieses
Objekt EditAtom
auf die Tasten für das Eingabevideo und die Untertitel verweisen, die Sie in der
inputs
-Array. Sie können startTimeOffset
und endTimeOffset
für
das Eingabevideo zuschneiden.
Fügen Sie die Untertitel zu den Ausgabecontainern hinzu, indem Sie einen
textStream
das Objekt
elementaryStreams
Array. Es wird nur ein eingebetteter Textstream unterstützt und allen Streams hinzugefügt.
Ausgabevideos (da es nur eine Ausgabezeitachse gibt)
Verwenden Sie die Methode
mapping
im Feld
textStream
Konfigurationsobjekts auf das
EditAtom
Objekt
.
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
Ersetzen Sie diese Werte in den folgenden Anfragedaten:
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
in einer der unterstützten Regionen
Standorte anzeigen
us-central1
us-west1
us-west2
us-east1
us-east4
southamerica-east1
northamerica-northeast1
asia-east1
asia-northeast1
asia-northeast3
asia-south1
asia-southeast1
australia-southeast1
europe-west1
europe-west2
europe-west4
STORAGE_BUCKET_NAME
: 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 eines Untertitels
Datei 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
im 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 bei der gcloud
-Befehlszeile angemeldet haben. Dazu haben Sie gcloud init
oder gcloud auth login
ausgeführt oder die Cloud Shell genutzt, die Sie automatisch bei der gcloud
-Befehlszeile 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 bei der gcloud
-Befehlszeile angemeldet haben. Dazu führen Sie gcloud init
oder gcloud auth login
aus.
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
Ersetzen Sie folgende Werte, bevor sie einen der Befehlsdaten verwenden:
LOCATION
: Der Standort, an dem der Job ausgeführt werden soll. Verwenden Sie
in einer der unterstützten Regionen
Standorte anzeigen
us-central1
us-west1
us-west2
us-east1
us-east4
southamerica-east1
northamerica-northeast1
asia-east1
asia-northeast1
asia-northeast3
asia-south1
asia-southeast1
australia-southeast1
europe-west1
europe-west2
europe-west4
STORAGE_BUCKET_NAME
: 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 eines Untertitels
Datei 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
im 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 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
Bevor Sie dieses Beispiel ausprobieren, folgen Sie der Einrichtungsanleitung für Go in der
Transcoder API-Schnellstart mit
Clientbibliotheken .
Weitere Informationen finden Sie in der
Transcoder API Go API
Referenzdokumentation .
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
Bevor Sie dieses Beispiel ausprobieren, folgen Sie der Einrichtungsanleitung für Node.js in der
Transcoder API-Schnellstart mit
Clientbibliotheken .
Weitere Informationen finden Sie in der
Transcoder API Node.js API
Referenzdokumentation .
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
Bevor Sie dieses Beispiel ausprobieren, folgen Sie der Einrichtungsanleitung für Python in der
Transcoder API-Schnellstart mit
Clientbibliotheken .
Weitere Informationen finden Sie in der
Transcoder API Python API
Referenzdokumentation .
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 aus einem Manifest abgespielt werden:
Gehen Sie so vor:
Hinzufügen eines
inputs
-Array
in die Jobkonfiguration ein.
Input
-Objekt hinzufügen
zum Array inputs
hinzu, das den Schlüssel und den URI für die zugehörige Eingabe definiert.
Video.
Weiteren Input
hinzufügen
-Objekt, das den URI für die Eingabeuntertiteldatei definiert.
Hinzufügen eines
editList
mit der Konfiguration verknüpfen. Mit diesem Array werden die Eingaben
Zeitleiste für die Videoausgabe.
EditAtom
hinzufügen
-Objekt zum Array editList
, das auf die Objekte im inputs
verweist.
nach Schlüssel sortiert. Sie können startTimeOffset
und endTimeOffset
für
das Eingabevideo zuschneiden.
Fügen Sie die Untertitel zu den Ausgabecontainern hinzu, indem Sie einen
textStream
das Objekt
elementaryStreams
Array.
Gib für die eigenständige Untertiteldatei den Container in der
muxStream
-Array;
sehen Sie im Folgenden die Objekte mit den Schlüsseln text-vtt-en
und text-vtt-es
.
Konfiguration. Für eingebettete Untertitel benötigst du nur die
Elementarstream.
Mit der folgenden Konfiguration werden mehrere WebVTT-Dateien generiert, eine für Englisch
und einen für spanische Untertitel.
Hinweis :Untertitel werden nur in HLS-Manifesten unterstützt. Untertitel werden nicht unterstützt
in DASH-Manifesten oder MP4-Dateien.
Sie können diese Konfiguration einer Jobvorlage hinzufügen oder sie in eine Ad-hoc-Jobkonfiguration einbinden:
REST
Ersetzen Sie diese Werte in den folgenden Anfragedaten:
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
in einer der unterstützten Regionen
Standorte anzeigen
us-central1
us-west1
us-west2
us-east1
us-east4
southamerica-east1
northamerica-northeast1
asia-east1
asia-northeast1
asia-northeast3
asia-south1
asia-southeast1
australia-southeast1
europe-west1
europe-west2
europe-west4
STORAGE_BUCKET_NAME
: 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 des
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 von
eine weitere 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
im 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 bei der gcloud
-Befehlszeile angemeldet haben. Dazu haben Sie gcloud init
oder gcloud auth login
ausgeführt oder die Cloud Shell genutzt, die Sie automatisch bei der gcloud
-Befehlszeile 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 bei der gcloud
-Befehlszeile angemeldet haben. Dazu führen Sie gcloud init
oder gcloud auth login
aus.
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
Ersetzen Sie folgende Werte, bevor sie einen der Befehlsdaten verwenden:
LOCATION
: Der Standort, an dem der Job ausgeführt werden soll. Verwenden Sie
in einer der unterstützten Regionen
Standorte anzeigen
us-central1
us-west1
us-west2
us-east1
us-east4
southamerica-east1
northamerica-northeast1
asia-east1
asia-northeast1
asia-northeast3
asia-south1
asia-southeast1
australia-southeast1
europe-west1
europe-west2
europe-west4
STORAGE_BUCKET_NAME
: 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 des
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 von
eine weitere 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
im 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 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
Bevor Sie dieses Beispiel ausprobieren, folgen Sie der Einrichtungsanleitung für Go in der
Transcoder API-Schnellstart mit
Clientbibliotheken .
Weitere Informationen finden Sie in der
Transcoder API Go API
Referenzdokumentation .
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
Bevor Sie dieses Beispiel ausprobieren, folgen Sie der Einrichtungsanleitung für Node.js in der
Transcoder API-Schnellstart mit
Clientbibliotheken .
Weitere Informationen finden Sie in der
Transcoder API Node.js API
Referenzdokumentation .
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
Bevor Sie dieses Beispiel ausprobieren, folgen Sie der Einrichtungsanleitung für Python in der
Transcoder API-Schnellstart mit
Clientbibliotheken .
Weitere Informationen finden Sie in der
Transcoder API Python API
Referenzdokumentation .
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 TV-App. Marke
wähle den Untertiteltrack aus.
Um die Untertitel unter macOS oder Linux anzuzeigen, kannst du das Video in einer der folgenden Sprachen abspielen:
Shaka-Player . Achten Sie darauf,
Untertitel im Menü Untertitel 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, 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 .
Klicke unten rechts im Player auf die Auslassungspunkte und aktiviere
Bildunterschriften.
Hinweis: Untertitel werden nicht von allen Mediaplayern unterstützt. Sehen Sie in der Dokumentation des Players nach.
Beispiel
Sie können die folgenden Dateien für einen Testjob verwenden:
Die Eingabeuntertiteldatei darf keine Leerzeilen zwischen den Textzeilen enthalten.