בדף הזה מוסבר איך מוסיפים כתוביות סמויות וכתוביות לסרטון פלט.
כתוביות (או כתוביות סמויות) הן תצוגה חזותית של האודיו בסרטון. כתוביות הן בדרך כלל באותה שפה כמו האודיו, והן כוללות צלילי רקע ושינויים ברמקולים.
כתוביות משמשות בדרך כלל לתרגום הדיאלוג בסרטון לשפה אחרת. בדרך כלל הכתוביות לא כוללות צלילי רקע ושינויים ברמקולים.
בדף הזה אנחנו משתמשים במונח קובץ כתוביות קלט כדי להתייחס לקובץ טקסט שמכיל כתוביות סמויות או כתוביות. אתם מספקים את הקובץ הזה כקלט לעבודה.
הוספת כתוביות להגדרות האישיות של משימה
במאמר פורמטים נתמכים של קבצי קלט ופלט מפורטים הפורמטים הנתמכים של קובצי קלט של כתוביות. כדי לבדוק את ההגדרה, אנחנו מספקים קובץ וידאו לדוגמה וקובצי כתוביות לדוגמה.
בקטעים הבאים מוסבר איך להוסיף כתוביות להגדרת עבודה. בדף הזה אנחנו מניחים שאתם מכירים JobConfig בסיסי. מידע נוסף על יצירת משימות המרת קידוד זמין במאמר יצירה וניהול של משימות.
הוספת כתוביות
כדי ליצור משימה שמשבצת כתוביות בקונטיינר של קובץ הפלט של הסרטון:
מוסיפים מערך
inputsלתחילת הגדרות העבודה.מוסיפים אובייקט
Inputלמערךinputsשמגדיר את המפתח ואת ה-URI של סרטון הקלט המשויך.מוסיפים עוד אובייקט
Inputשכולל את הנתיב לקובץ הכתוביות של הקלט.מוסיפים מערך
editListלהגדרות האישיות של המשימה. המערך הזה משמש להוספת קלט לציר הזמן של סרטון הפלט.מוסיפים אובייקט
EditAtomלמערךeditList. האובייקטEditAtomהזה צריך להפנות למפתחות של סרטון הקלט והכתוביות שהוספתם במערךinputs. אפשר להגדירstartTimeOffsetו-endTimeOffsetכדי לחתוך את סרטון הקלט.מוסיפים את הכתוביות למאגרי הפלט על ידי הוספת אובייקט
textStreamלמערךelementaryStreams. מותר להטמיע רק סטרימינג אחד של טקסט, והוא מתווסף לכל סרטוני הפלט (כי יש רק ציר זמן אחד של פלט).משתמשים במערך
mappingבאובייקט ההגדרותtextStreamכדי להפנות למפתח האובייקטEditAtom.
ההגדרה לדוגמה הבאה מטמיעה כתוביות סמויות CEA-608 בסרטון.
אפשר להוסיף את ההגדרה הזו לתבנית של משימה או לכלול אותה בהגדרה של משימה אד-הוק:
REST
לפני שמשתמשים בנתוני הבקשה, צריך להחליף את הנתונים הבאים:
-
PROJECT_ID: מזהה הפרויקט ב- Google Cloud שמופיע בהגדרות IAM. -
LOCATION: המיקום שבו המשימה תפעל. להשתמש באחד מהאזורים הנתמכים.הצגת מיקומיםus-central1us-west1us-west2us-east1us-east4southamerica-east1northamerica-northeast1asia-east1asia-northeast1asia-northeast3asia-south1asia-southeast1australia-southeast1europe-west1europe-west2europe-west4me-west1me-central1me-central2
-
STORAGE_BUCKET_NAME: השם של הקטגוריה שיצרתם ב-Cloud Storage. -
STORAGE_INPUT_VIDEO: השם של סרטון בקטגוריית Cloud Storage שאתם מבצעים לו המרה, כמוmy-vid.mp4. בשדה הזה צריך להביא בחשבון את כל התיקיות שיצרתם בדלי (לדוגמה,input/my-vid.mp4). -
STORAGE_CAPTIONS_FILE: השם של קובץ הכתוביות בקטגוריה שלכם ב-Cloud Storage, כמוcaptions.srt. בשדה הזה צריך להביא בחשבון את כל התיקיות שיצרתם בדלי (לדוגמה,input/captions.srt). -
STORAGE_OUTPUT_FOLDER: השם של תיקיית הפלט בקטגוריה של Cloud Storage שבה רוצים לשמור את פלט הסרטון המקודד.
כדי לשלוח את הבקשה צריך להרחיב אחת מהאפשרויות הבאות:
אתם אמורים לקבל תגובת JSON שדומה לזו:
{
"name": "projects/PROJECT_NUMBER/locations/LOCATION/jobs/JOB_ID",
"config": {
...
},
"state": "PENDING",
"createTime": CREATE_TIME,
"ttlAfterCompletionDays": 30
}
gcloud
לפני השימוש בנתוני הפקודה הבאים, צריך להחליף את הנתונים הבאים:
-
LOCATION: המיקום שבו המשימה תפעל. להשתמש באחד מהאזורים הנתמכים.הצגת מיקומיםus-central1us-west1us-west2us-east1us-east4southamerica-east1northamerica-northeast1asia-east1asia-northeast1asia-northeast3asia-south1asia-southeast1australia-southeast1europe-west1europe-west2europe-west4me-west1me-central1me-central2
-
STORAGE_BUCKET_NAME: השם של הקטגוריה שיצרתם ב-Cloud Storage. -
STORAGE_INPUT_VIDEO: השם של סרטון בקטגוריית Cloud Storage שאתם מבצעים לו המרה, כמוmy-vid.mp4. בשדה הזה צריך להביא בחשבון את כל התיקיות שיצרתם בדלי (לדוגמה,input/my-vid.mp4). -
STORAGE_CAPTIONS_FILE: השם של קובץ הכתוביות בקטגוריה שלכם ב-Cloud Storage, כמוcaptions.srt. בשדה הזה צריך להביא בחשבון את כל התיקיות שיצרתם בדלי (לדוגמה,input/captions.srt). -
STORAGE_OUTPUT_FOLDER: השם של תיקיית הפלט בקטגוריה של Cloud Storage שבה רוצים לשמור את פלט הסרטון המקודד.
שומרים את התוכן הבא בקובץ בשם 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/" } } }
מריצים את הפקודה הבאה:
Linux, macOS או 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
אמורים לקבל תגובה שדומה לזו:
{
"name": "projects/PROJECT_NUMBER/locations/LOCATION/jobs/JOB_ID",
"config": {
...
},
"state": "PENDING",
"createTime": CREATE_TIME,
"ttlAfterCompletionDays": 30
}
Go
לפני שמנסים את הדוגמה הזו, צריך לפעול לפי Goהוראות ההגדרה שבמדריך לתחילת העבודה עם Transcoder API באמצעות ספריות לקוח. מידע נוסף מופיע במאמרי העזרה של Transcoder API Go API.
כדי לבצע אימות ב-Transcoder API, צריך להגדיר את Application Default Credentials. מידע נוסף זמין במאמר הגדרת אימות לסביבת פיתוח מקומית.
Java
לפני שמנסים את הדוגמה הזו, צריך לפעול לפי Javaהוראות ההגדרה שבמדריך לתחילת העבודה עם Transcoder API באמצעות ספריות לקוח. מידע נוסף מופיע במאמרי העזרה של Transcoder API Java API.
כדי לבצע אימות ב-Transcoder API, צריך להגדיר את Application Default Credentials. מידע נוסף זמין במאמר הגדרת אימות לסביבת פיתוח מקומית.
Node.js
לפני שמנסים את הדוגמה הזו, צריך לפעול לפי Node.jsהוראות ההגדרה שבמדריך לתחילת העבודה עם Transcoder API באמצעות ספריות לקוח. מידע נוסף מופיע במאמרי העזרה של Transcoder API Node.js API.
כדי לבצע אימות ב-Transcoder API, צריך להגדיר את Application Default Credentials. מידע נוסף זמין במאמר הגדרת אימות לסביבת פיתוח מקומית.
Python
לפני שמנסים את הדוגמה הזו, צריך לפעול לפי Pythonהוראות ההגדרה שבמדריך לתחילת העבודה עם Transcoder API באמצעות ספריות לקוח. מידע נוסף מופיע במאמרי העזרה של Transcoder API Python API.
כדי לבצע אימות ב-Transcoder API, צריך להגדיר את Application Default Credentials. מידע נוסף זמין במאמר הגדרת אימות לסביבת פיתוח מקומית.
הוספת כתוביות
כדי ליצור משימה שמפיקה קובצי כתוביות בכמה שפות שמופעלים ממניפסט, פועלים לפי השלבים הבאים:
מוסיפים מערך
inputsלהגדרות האישיות של המשימה.מוסיפים אובייקט
Inputלמערךinputsשמגדיר את המפתח ואת ה-URI של סרטון הקלט המשויך.מוסיפים עוד אובייקט
Inputשמגדיר את ה-URI של קובץ הכתוביות לקלט.מוסיפים מערך
editListלהגדרה. המערך הזה משמש להוספת הקלט לציר הזמן של סרטון הפלט.מוסיפים אובייקט
EditAtomלמערךeditListשמפנה לאובייקטים במערךinputsלפי מפתח. אפשר להגדירstartTimeOffsetו-endTimeOffsetכדי לחתוך את סרטון הקלט.מוסיפים את הכתוביות למאגרי הפלט על ידי הוספת אובייקט
textStreamלמערךelementaryStreams.לקובץ הכתוביות העצמאי, מציינים את המאגר במערך
muxStream. אפשר לראות את האובייקטים עם המפתחותtext-vtt-enו-text-vtt-esבהגדרה הבאה. כדי להוסיף כתוביות מוטמעות, צריך רק את הזרם הבסיסי.
התצורה הבאה יוצרת כמה קובצי WebVTT, אחד לכתוביות באנגלית ואחד לכתוביות בספרדית. כתוביות DASH בקובצי WebVTT נוצרות בפורמט המכולה fMP4.
אפשר להוסיף את ההגדרה הזו לתבנית של משימה או לכלול אותה בהגדרה של משימה אד-הוק:
REST
לפני שמשתמשים בנתוני הבקשה, צריך להחליף את הנתונים הבאים:
-
PROJECT_ID: מזהה הפרויקט ב- Google Cloud שמופיע בהגדרות IAM. -
LOCATION: המיקום שבו המשימה תפעל. להשתמש באחד מהאזורים הנתמכים.הצגת מיקומיםus-central1us-west1us-west2us-east1us-east4southamerica-east1northamerica-northeast1asia-east1asia-northeast1asia-northeast3asia-south1asia-southeast1australia-southeast1europe-west1europe-west2europe-west4me-west1me-central1me-central2
-
STORAGE_BUCKET_NAME: השם של הקטגוריה שיצרתם ב-Cloud Storage. -
STORAGE_INPUT_VIDEO: השם של סרטון בקטגוריית Cloud Storage שאתם מבצעים לו המרה, כמוmy-vid.mp4. בשדה הזה צריך להביא בחשבון את כל התיקיות שיצרתם בדלי (לדוגמה,input/my-vid.mp4). -
STORAGE_SUBTITLES_FILE1: השם של קובץ הכתוביות בקטגוריה שלכם ב-Cloud Storage, לדוגמהsubtitles-en.srtלכתוביות באנגלית. בשדה הזה צריך להביא בחשבון את כל התיקיות שיצרתם בדלי (לדוגמה,input/subtitles-en.srt). -
STORAGE_SUBTITLES_FILE2: השם של קובץ כתוביות אחר בקטגוריה שלכם ב-Cloud Storage, למשלsubtitles-es.srt, לכתוביות בספרדית. בשדה הזה צריך להביא בחשבון את כל התיקיות שיצרתם בדלי (לדוגמה,input/subtitles-es.srt). -
STORAGE_OUTPUT_FOLDER: השם של תיקיית הפלט בקטגוריה של Cloud Storage שבה רוצים לשמור את פלט הסרטון המקודד.
כדי לשלוח את הבקשה צריך להרחיב אחת מהאפשרויות הבאות:
אתם אמורים לקבל תגובת JSON שדומה לזו:
{
"name": "projects/PROJECT_NUMBER/locations/LOCATION/jobs/JOB_ID",
"config": {
...
},
"state": "PENDING",
"createTime": CREATE_TIME,
"ttlAfterCompletionDays": 30
}
gcloud
לפני השימוש בנתוני הפקודה הבאים, צריך להחליף את הנתונים הבאים:
-
LOCATION: המיקום שבו המשימה תפעל. להשתמש באחד מהאזורים הנתמכים.הצגת מיקומיםus-central1us-west1us-west2us-east1us-east4southamerica-east1northamerica-northeast1asia-east1asia-northeast1asia-northeast3asia-south1asia-southeast1australia-southeast1europe-west1europe-west2europe-west4me-west1me-central1me-central2
-
STORAGE_BUCKET_NAME: השם של הקטגוריה שיצרתם ב-Cloud Storage. -
STORAGE_INPUT_VIDEO: השם של סרטון בקטגוריית Cloud Storage שאתם מבצעים לו המרה, כמוmy-vid.mp4. בשדה הזה צריך להביא בחשבון את כל התיקיות שיצרתם בדלי (לדוגמה,input/my-vid.mp4). -
STORAGE_SUBTITLES_FILE1: השם של קובץ הכתוביות בקטגוריה שלכם ב-Cloud Storage, לדוגמהsubtitles-en.srtלכתוביות באנגלית. בשדה הזה צריך להביא בחשבון את כל התיקיות שיצרתם בדלי (לדוגמה,input/subtitles-en.srt). -
STORAGE_SUBTITLES_FILE2: השם של קובץ כתוביות אחר בקטגוריה שלכם ב-Cloud Storage, למשלsubtitles-es.srt, לכתוביות בספרדית. בשדה הזה צריך להביא בחשבון את כל התיקיות שיצרתם בדלי (לדוגמה,input/subtitles-es.srt). -
STORAGE_OUTPUT_FOLDER: השם של תיקיית הפלט בקטגוריה של Cloud Storage שבה רוצים לשמור את פלט הסרטון המקודד.
שומרים את התוכן הבא בקובץ בשם 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/" } } }
מריצים את הפקודה הבאה:
Linux, macOS או 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
אמורים לקבל תגובה שדומה לזו:
{
"name": "projects/PROJECT_NUMBER/locations/LOCATION/jobs/JOB_ID",
"config": {
...
},
"state": "PENDING",
"createTime": CREATE_TIME,
"ttlAfterCompletionDays": 30
}
Go
לפני שמנסים את הדוגמה הזו, צריך לפעול לפי Goהוראות ההגדרה שבמדריך לתחילת העבודה עם Transcoder API באמצעות ספריות לקוח. מידע נוסף מופיע במאמרי העזרה של Transcoder API Go API.
כדי לבצע אימות ב-Transcoder API, צריך להגדיר את Application Default Credentials. מידע נוסף זמין במאמר הגדרת אימות לסביבת פיתוח מקומית.
Java
לפני שמנסים את הדוגמה הזו, צריך לפעול לפי Javaהוראות ההגדרה שבמדריך לתחילת העבודה עם Transcoder API באמצעות ספריות לקוח. מידע נוסף מופיע במאמרי העזרה של Transcoder API Java API.
כדי לבצע אימות ב-Transcoder API, צריך להגדיר את Application Default Credentials. מידע נוסף זמין במאמר הגדרת אימות לסביבת פיתוח מקומית.
Node.js
לפני שמנסים את הדוגמה הזו, צריך לפעול לפי Node.jsהוראות ההגדרה שבמדריך לתחילת העבודה עם Transcoder API באמצעות ספריות לקוח. מידע נוסף מופיע במאמרי העזרה של Transcoder API Node.js API.
כדי לבצע אימות ב-Transcoder API, צריך להגדיר את Application Default Credentials. מידע נוסף זמין במאמר הגדרת אימות לסביבת פיתוח מקומית.
Python
לפני שמנסים את הדוגמה הזו, צריך לפעול לפי Pythonהוראות ההגדרה שבמדריך לתחילת העבודה עם Transcoder API באמצעות ספריות לקוח. מידע נוסף מופיע במאמרי העזרה של Transcoder API Python API.
כדי לבצע אימות ב-Transcoder API, צריך להגדיר את Application Default Credentials. מידע נוסף זמין במאמר הגדרת אימות לסביבת פיתוח מקומית.
הפעלת הסרטון
כדי לראות את הכתוביות ב-Windows, מפעילים את הסרטון באפליקציית 'סרטים ותוכניות טלוויזיה'. חשוב לבחור את רצועת הכתוביות.
כדי לראות את הכתוביות ב-MacOS או ב-Linux, אפשר להפעיל את הסרטון ב-Shaka Player. חשוב להפעיל את הכתוביות בתפריט כתוביות.
כדי להפעיל את קובץ המדיה שנוצר ב-Shaka Player, מבצעים את השלבים הבאים:
- הפיכת הקטגוריה של Cloud Storage שיצרתם לקריאה באופן ציבורי.
- כדי להפעיל שיתוף משאבים בין מקורות (CORS) בקטגוריה של Cloud Storage, מבצעים את הפעולות הבאות:
- יוצרים קובץ JSON שמכיל את הפרטים הבאים:
[ { "origin": ["https://shaka-player-demo.appspot.com/"], "responseHeader": ["Content-Type", "Range"], "method": ["GET", "HEAD"], "maxAgeSeconds": 3600 } ] -
מריצים את הפקודה הבאה אחרי שמחליפים את JSON_FILE_NAME בשם של קובץ ה-JSON שיצרתם בשלב הקודם:
gcloud storage buckets update gs://STORAGE_BUCKET_NAME --cors-file=JSON_FILE_NAME.json
- יוצרים קובץ JSON שמכיל את הפרטים הבאים:
- בוחרים אחד מקובצי ה-MP4 או קובצי המניפסט שנוצרו על ידי משימת הקידוד בפורמט אחר בקטגוריה של Cloud Storage. לוחצים על העתקת כתובת URL בעמודה גישה ציבורית של הקובץ.
- עוברים אל Shaka Player, נגן שידורים חיים באינטרנט.
- בסרגל הניווט העליון, לוחצים על תוכן בהתאמה אישית.
- לוחצים על הלחצן +.
מדביקים את כתובת ה-URL הציבורית של הקובץ בתיבה Manifest URL (כתובת ה-URL של קובץ המניפסט).
מקלידים שם בתיבה שם.
לוחצים על Save.
לוחצים על הפעלה.
לוחצים על לחצן האליפסה בפינה השמאלית התחתונה של הנגן ומפעילים את הכתוביות.
דוגמה
אפשר להשתמש בקבצים הבאים למשימת בדיקה:
- סרטון קלט לדוגמה
- קובץ כתוביות לדוגמה להזנה של כתוביות סמויות
- קובץ כתוביות לדוגמה באנגלית
- קובץ כתוביות לדוגמה בספרדית
קובץ הכתוביות שמוזן לא יכול להכיל שורות ריקות בין שורות הטקסט.