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. Untertitel werden normalerweise in derselben Sprache wie der Audioinhalt erstellt und beinhalten Hintergrundgeräusche und Sprecherwechsel.
Untertitel werden normalerweise verwendet, um den Dialog eines Videos in eine andere Sprache zu übersetzen. Untertitel enthalten normalerweise keine Hintergrundgeräusche und keine Sprecherwechsel.
Auf dieser Seite wird der Begriff input caption file (Untertiteldatei eingeben) für eine Textdatei verwendet, die Untertitel enthält. Sie stellen diese Datei als Eingabe für einen Job zur Verfügung.
Einer Jobkonfiguration Untertitel hinzufügen
Informationen zu den unterstützten Dateiformaten für Eingabeuntertitel finden Sie unter Unterstützte Ein- und Ausgaben . Ihnen stehen eine Videodatei mit Beispiel und die Beispieleingabedateien für Eingabeuntertitel zur Verfügung, damit Sie Ihre Konfiguration testen können.
Verwenden Sie die Informationen in den folgenden Abschnitten, um einer Jobkonfiguration Untertitel hinzuzufügen. Auf dieser Seite wird davon ausgegangen, dass Sie mit einer 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 Container der Videodatei für die Ausgabe einbettet:
Fügen Sie am Anfang der Jobkonfiguration ein inputs
-Array hinzu.
Fügen Sie dem Array inputs
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 mit dem Pfad zur Eingabeuntertiteldatei hinzu.
Hinweis: Fügen Sie in der eingegebenen Untertiteldatei keine Leerzeilen zwischen die Textzeilen ein.
Fügen Sie der Jobkonfiguration ein editList
-Array hinzu. Mit diesem Array werden der Videoausgabezeitachse Eingaben hinzugefügt.
Fügen Sie dem editList
-Array 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 ein startTimeOffset
und ein endTimeOffset
festlegen, um das Eingabevideo zu schneiden.
Fügen Sie die Untertitel zu den Ausgabecontainern hinzu, indem Sie dem elementaryStreams
-Array ein textStream
-Objekt hinzufügen. Es wird nur ein eingebetteter Textstream unterstützt und allen Ausgabevideos hinzugefügt (da es nur eine Ausgabezeitachse gibt).
Verwenden Sie das Array mapping
im Konfigurationsobjekt textStream
, um auf den Objektschlüssel EditAtom
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
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 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 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
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
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 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
Bevor Sie dieses Beispiel ausprobieren, folgen Sie der Einrichtungsanleitung für Go in der Transcoder API-Kurzanleitung: Clientbibliotheken verwenden .
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
Bevor Sie dieses Beispiel ausprobieren, folgen Sie der Einrichtungsanleitung für Node.js in der Transcoder API-Kurzanleitung: Clientbibliotheken verwenden .
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
Bevor Sie dieses Beispiel ausprobieren, folgen Sie der Einrichtungsanleitung für Python in der Transcoder API-Kurzanleitung: Clientbibliotheken verwenden .
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, mit dem mehrsprachige Untertiteldateien erzeugt werden, die aus einem Manifest abgespielt werden:
Fügen Sie der Jobkonfiguration ein inputs
-Array hinzu.
Fügen Sie dem Array inputs
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 Eingabeuntertiteldatei definiert.
Fügen Sie der Konfiguration ein editList
-Array hinzu. Dieses Array wird verwendet, um die Eingaben der Videoausgabezeitachse hinzuzufügen.
Fügen Sie dem Array editList
ein EditAtom
-Objekt hinzu, das schlüsselbasiert auf die Objekte im inputs
-Array verweist. Sie können ein startTimeOffset
und ein endTimeOffset
festlegen, um das Eingabevideo zu schneiden.
Fügen Sie die Untertitel zu den Ausgabecontainern hinzu, indem Sie dem elementaryStreams
-Array ein textStream
-Objekt hinzufügen.
Geben Sie für die eigenständige Untertiteldatei den Container im Array muxStream
an. Die Objekte mit den Schlüsseln text-vtt-en
und text-vtt-es
finden Sie in der folgenden Konfiguration. Für eingebettete Untertitel wird nur der grundlegende Stream benötigt.
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. Untertitel werden in DASH-Manifesten oder MP4-Dateien nicht 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
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 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 spanischsprachige Untertitel. 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 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
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
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 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 spanischsprachige Untertitel. 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
Bevor Sie dieses Beispiel ausprobieren, folgen Sie der Einrichtungsanleitung für Go in der Transcoder API-Kurzanleitung: Clientbibliotheken verwenden .
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
Bevor Sie dieses Beispiel ausprobieren, folgen Sie der Einrichtungsanleitung für Node.js in der Transcoder API-Kurzanleitung: Clientbibliotheken verwenden .
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
Bevor Sie dieses Beispiel ausprobieren, folgen Sie der Einrichtungsanleitung für Python in der Transcoder API-Kurzanleitung: Clientbibliotheken verwenden .
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, spiele das Video in der Google Play Filme & Serien App ab. Achte darauf, den Untertiteltrack auszuwählen.
Wenn Sie die Untertitel unter macOS oder Linux ansehen möchten, können Sie das Video im Shaka Player abspielen. Aktiviere Untertitel im Menü Untertitel .
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 .
Klicke unten rechts im Player auf die Auslassungspunkte und aktiviere die Untertitel.
Hinweis :Nicht alle Mediaplayer unterstützen Untertitel. 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.