Halaman ini menjelaskan cara membuat klip video on demand (VOD) dari live stream menggunakan Live Stream API. Klip VOD terdiri dari file manifes HLS dan file segmen yang telah disimpan dari live stream. Hanya manifes HLS yang didukung.
Perbedaan antara klip VOD dan sesi DVR
Klip VOD (juga dikenal sebagai klip saluran) mirip dengan sesi DVR dengan perbedaan utama berikut:
- Sesi DVR:
- API menyimpan manifes DVR di lokasi yang sama dengan segmen live stream sehingga tidak ada penyalinan tambahan ke Cloud Storage. Manifes DVR mirip dengan manifes live stream, tetapi lebih panjang. Saat periode retensi berakhir, manifes akan dihapus beserta file segmen.
- Anda dapat membuat sesi DVR untuk konten yang lalu, saat ini, dan mendatang. Misalnya, sesi DVR dapat mengikuti live stream, atau Anda dapat menjadwalkan sesi DVR untuk dimulai dan dihentikan pada waktu mendatang.
- Kasus penggunaan umum untuk sesi DVR adalah mendukung kemampuan DVR untuk acara live streaming. Misalnya, penonton dapat bergabung ke live stream satu jam setelah dimulai dan melihat konten dengan jeda satu jam (atau melewati sebagian konten).
- Klip channel:
- Live Stream API menyalin manifes klip dan file segmen terkait ke direktori yang ditentukan pengguna sehingga tidak dihapus saat periode retensi berakhir. Anda memiliki kontrol penuh atas klip.
- Hanya konten sebelumnya yang dapat dipotong. Klip live dan penjadwalan klip mendatang tidak didukung.
- Kasus penggunaan umum untuk klip adalah mengarsipkan live stream, sehingga live stream tersedia sebagai file VOD tanpa batas waktu.
Untuk informasi selengkapnya tentang sesi DVR, lihat Membuat sesi DVR.
Menyiapkan Google Cloud project dan autentikasi
Jika Anda belum membuat projectGoogle Cloud dan kredensial, lihat Sebelum memulai.Membuat endpoint input
Untuk membuat endpoint input, gunakan metode
projects.locations.inputs.create
.
Sebelum menggunakan salah satu data permintaan, lakukan penggantian berikut:
PROJECT_NUMBER
: nomor project Google Cloud Anda; ini terletak di kolom Project number di halaman IAM SettingsLOCATION
: lokasi tempat membuat endpoint input; gunakan salah satu region yang didukungMenampilkan lokasius-central1
us-east1
us-east4
us-west1
us-west2
northamerica-northeast1
southamerica-east1
asia-east1
asia-east2
asia-south1
asia-northeast1
asia-southeast1
australia-southeast1
europe-north1
europe-west1
europe-west2
europe-west3
europe-west4
INPUT_ID
: ID yang ditentukan pengguna untuk endpoint input baru yang akan dibuat (tempat Anda mengirim aliran input). Nilai ini harus terdiri dari 1-63 karakter, diawali dan diakhiri dengan[a-z0-9]
, dan dapat berisi tanda hubung (-) di antara karakter. Misalnya,my-input
.
Untuk mengirim permintaan Anda, perluas salah satu opsi berikut:
Anda akan melihat respons JSON seperti berikut:
{ "name": "projects/PROJECT_NUMBER/locations/LOCATION/operations/OPERATION_ID", "metadata": { "@type": "type.googleapis.com/google.cloud.video.livestream.v1.OperationMetadata", "createTime": CREATE_TIME, "target": "projects/PROJECT_NUMBER/locations/LOCATION/inputs/INPUT_ID", "verb": "create", "requestedCancellation": false, "apiVersion": "v1" }, "done": false }
Perintah ini membuat operasi yang berjalan lama (LRO) yang dapat Anda gunakan untuk melacak progres permintaan. Lihat Mengelola operasi yang berjalan lama untuk mengetahui informasi selengkapnya.
Mendapatkan detail endpoint input
Untuk mendapatkan detail endpoint input, gunakan
metode projects.locations.inputs.get
.
Sebelum menggunakan salah satu data permintaan, lakukan penggantian berikut:
PROJECT_NUMBER
: nomor project Google Cloud Anda; ini terletak di kolom Project number di halaman IAM SettingsLOCATION
: lokasi endpoint input Anda berada; gunakan salah satu region yang didukungMenampilkan lokasius-central1
us-east1
us-east4
us-west1
us-west2
northamerica-northeast1
southamerica-east1
asia-east1
asia-east2
asia-south1
asia-northeast1
asia-southeast1
australia-southeast1
europe-north1
europe-west1
europe-west2
europe-west3
europe-west4
INPUT_ID
: ID yang ditentukan pengguna untuk endpoint input
Untuk mengirim permintaan Anda, perluas salah satu opsi berikut:
Anda akan melihat respons JSON seperti berikut:
{ "name": "projects/PROJECT_NUMBER/locations/LOCATION/inputs/INPUT_ID", "createTime": CREATE_TIME, "updateTime": UPDATE_TIME, "type": "RTMP_PUSH", "uri": "INPUT_STREAM_URI", # For example, "rtmp://1.2.3.4/live/b8ebdd94-c8d9-4d88-a16e-b963c43a953b", "tier": "HD" }
Temukan kolom uri
dan salin INPUT_STREAM_URI yang ditampilkan untuk digunakan nanti di bagian Kirim aliran input.
Membuat saluran
Untuk membuat saluran, gunakan
metode
projects.locations.channels.create
. Contoh berikut membuat saluran yang menghasilkan live stream HLS. Live stream terdiri dari satu rendering definisi tinggi (1280x720).
Untuk mengaktifkan pembuatan klip VOD, tambahkan objek retentionConfig
ke konfigurasi channel.
"retentionConfig": {
"retentionWindowDuration": {
"seconds": 86400
}
},
Jika retensi diaktifkan untuk channel live stream, segmen dan manifes
live stream akan dipertahankan untuk membuat klip VOD. Objek
retentionWindowDuration
menentukan
durasi penyimpanan output live stream setelah diupload ke
Cloud Storage. Periode retensi dimulai pada saat segmen
dibuat di Cloud Storage.
Periode retensi dibatasi hingga 30 hari. Setelah periode retensi berlalu, file segmen live stream dan file manifes akan otomatis dihapus dari Cloud Storage. (Manifes klip VOD dan file segmen terkaitnya tidak otomatis dihapus.) Anda tidak dapat membuat klip VOD menggunakan segmen yang dihapus. Proses penghapusan bersifat asinkron dan mungkin memerlukan waktu hingga 24 jam untuk diselesaikan.
Tentukan kunci untuk manifes guna mengaktifkan pembuatan klip VOD. Anda merujuk ke kunci ini saat benar-benar membuat klip. Hanya manifes HLS yang didukung.
"manifests": [
{
...
"key": "manifest_hls"
}
Sebelum menggunakan salah satu data permintaan, lakukan penggantian berikut:
PROJECT_NUMBER
: nomor project Google Cloud Anda; ini terletak di kolom Project number di halaman IAM SettingsLOCATION
: lokasi untuk membuat channel; gunakan salah satu region yang didukungMenampilkan lokasius-central1
us-east1
us-east4
us-west1
us-west2
northamerica-northeast1
southamerica-east1
asia-east1
asia-east2
asia-south1
asia-northeast1
asia-southeast1
australia-southeast1
europe-north1
europe-west1
europe-west2
europe-west3
europe-west4
CHANNEL_ID
: ID yang ditentukan pengguna untuk channel yang akan dibuat; nilai ini harus terdiri dari 1-63 karakter, diawali dan diakhiri dengan[a-z0-9]
, dan dapat berisi tanda hubung (-) di antara karakterINPUT_ID
: ID yang ditentukan pengguna untuk endpoint inputBUCKET_NAME
: nama bucket Cloud Storage yang Anda buat untuk menyimpan file manifes dan segmen live stream
Untuk mengirim permintaan Anda, perluas salah satu opsi berikut:
Anda akan melihat respons JSON seperti berikut:
{ "name": "projects/PROJECT_NUMBER/locations/LOCATION/operations/OPERATION_ID", "metadata": { "@type": "type.googleapis.com/google.cloud.video.livestream.v1.OperationMetadata", "createTime": CREATE_TIME, "target": "projects/PROJECT_NUMBER/locations/LOCATION/channels/CHANNEL_ID", "verb": "create", "requestedCancellation": false, "apiVersion": "v1" }, "done": false }
Perintah ini membuat operasi yang berjalan lama (LRO) yang dapat Anda gunakan untuk melacak progres permintaan. Lihat Mengelola operasi yang berjalan lama untuk mengetahui informasi selengkapnya.
Memulai channel
Untuk memulai saluran, gunakan
metode projects.locations.channels.start
.
Sebelum menggunakan salah satu data permintaan, lakukan penggantian berikut:
PROJECT_NUMBER
: nomor project Google Cloud Anda; ini terletak di kolom Project number di halaman IAM SettingsLOCATION
: lokasi tempat channel Anda berada; gunakan salah satu region yang didukungMenampilkan lokasius-central1
us-east1
us-east4
us-west1
us-west2
northamerica-northeast1
southamerica-east1
asia-east1
asia-east2
asia-south1
asia-northeast1
asia-southeast1
australia-southeast1
europe-north1
europe-west1
europe-west2
europe-west3
europe-west4
CHANNEL_ID
: ID yang ditentukan pengguna untuk saluran
Untuk mengirim permintaan Anda, perluas salah satu opsi berikut:
Anda akan melihat respons JSON seperti berikut:
{ "name": "projects/PROJECT_NUMBER/locations/LOCATION/operations/OPERATION_ID", "metadata": { "@type": "type.googleapis.com/google.cloud.video.livestream.v1.OperationMetadata", "createTime": CREATE_TIME, "target": "projects/PROJECT_NUMBER/locations/LOCATION/channels/CHANNEL_ID", "verb": "start", "requestedCancellation": false, "apiVersion": "v1" }, "done": false }
Perintah ini membuat operasi yang berjalan lama (LRO) yang dapat Anda gunakan untuk melacak progres permintaan. Lihat Mengelola operasi yang berjalan lama untuk mengetahui informasi selengkapnya.
Mengirim aliran input
Buka jendela terminal baru. Jalankan perintah berikut, menggunakan INPUT_STREAM_URI dari bagian Get input endpoint details:
ffmpeg -re -f lavfi -i "testsrc=size=1280x720 [out0]; sine=frequency=500 [out1]" \
-acodec aac -vcodec h264 -f flv INPUT_STREAM_URI
Membuat klip VOD
Untuk membuat klip VOD, gunakan
metode projects.locations.channels.clips.create
.
Gunakan kolom outputUri
untuk menentukan lokasi penyimpanan
file klip dan manifes klip di Cloud Storage. Anda dapat menggunakan bucket yang sama dengan yang Anda buat untuk manifes live stream atau bucket yang berbeda. Anda juga dapat menambahkan nama direktori ke nama bucket (misalnya, my-bucket/vod-clip
).
Gunakan kolom manifestKey
dalam
array clipManifests
untuk menentukan manifes tempat menyimpan
klip. Dalam contoh konfigurasi saluran di halaman ini, kunci ini ditetapkan ke manifest_hls
.
Gunakan kolom outputType
untuk menentukan salah satu format output clip
yang didukung: MANIFEST
(default) atau MP4
. Dalam contoh konfigurasi saluran di
halaman ini, kolom ini ditetapkan ke MANIFEST
, yang menghasilkan manifes VOD
yang mirip dengan output saluran.
Anda dapat menggabungkan beberapa bagian waktu dari live stream menjadi satu klip
dengan menambahkan objek timeSlice
ke array slices
.
"outputUri": "gs://my-bucket",
"clipManifests":[
{
"manifestKey": "manifest_hls"
}
],
"slices":[
{
"timeSlice": {
"markinTime": "2022-07-08T23:03:20.000Z",
"markoutTime": "2022-07-08T23:04:20.000Z"
}
},
{
"timeSlice": {
"markinTime": "2022-07-08T23:05:20.000Z",
"markoutTime": "2022-07-08T23:06:20.000Z"
}
}
]
Perhatikan hal berikut:
- Setiap klip harus berisi minimal satu
timeSlice
dislices
. - Kolom
clipManifests.manifestKey
harus merujuk ke manifes HLS yang ditentukan di saluran induk klip. Jika permintaan pembuatan tugas clip berhasil, URI manifes klip yang dihasilkan akan ditampilkan di kolomclipManifests.outputUri
. URI ini berada dalam jalur yang ditentukan oleh kolomoutputUri
klip. - Array
clipManifests
hanya mendukung satu manifes per permintaan. Jika ingin membuat beberapa manifes untuk tugas klip yang sama, Anda harus membagi manifes menjadi beberapa permintaan tugas klip. - Slice klip harus homogen; setiap elemen harus berjenis
timeSlice
. - Kumpulan objek
timeSlice
tidak boleh tumpang-tindih dan dalam urutan kronologis.markinTime
harus lebih awal darimarkoutTime
di setiaptimeSlice
. - Jika
markinTime
terbaru dari klip lebih awal dari waktu mulai channel atau awal periode retensi, waktu tanda masuk akan ditetapkan ke waktu yang lebih lambat dari keduanya. - Jika
markoutTime
terbaru dari klip lebih lambat dari waktu berhenti channel,markoutTime
akan ditetapkan ke waktu berhenti channel. JikamarkoutTime
terbaru dari klip lebih lambat dari waktu jam dinding sistem saat ini, makamarkoutTime
akan ditetapkan ke waktu saat API benar-benar memulai tugas pemotongan. - Untuk klip dengan jenis output
MANIFEST
, durasi maksimumnya adalah 24 jam. Untuk klip dengan jenis outputMP4
, durasi maksimumnya adalah 6 jam.
Sebelum menggunakan salah satu data permintaan, lakukan penggantian berikut:
PROJECT_NUMBER
: nomor project Google Cloud Anda; ini terletak di kolom Project number di halaman IAM SettingsLOCATION
: lokasi tempat channel Anda berada; gunakan salah satu region yang didukungMenampilkan lokasius-central1
us-east1
us-east4
us-west1
us-west2
northamerica-northeast1
southamerica-east1
asia-east1
asia-east2
asia-south1
asia-northeast1
asia-southeast1
australia-southeast1
europe-north1
europe-west1
europe-west2
europe-west3
europe-west4
CHANNEL_ID
: ID yang ditentukan pengguna untuk saluranCLIP_ID
: ID yang ditentukan pengguna untuk klip VODMARK_IN_TIME
: waktu epoch Unix tanda masuk dalam manifes live stream asli; menggunakan stempel waktu dalam format "Zulu" UTC RFC3339 (misalnya,2014-10-02T15:01:23Z
)MARK_OUT_TIME
: waktu epoch Unix yang ditandai dalam manifes live stream asli; menggunakan stempel waktu dalam format "Zulu" UTC RFC3339 (misalnya,2014-10-02T15:01:23Z
)BUCKET_NAME
: nama bucket Cloud Storage yang Anda buat untuk menyimpan manifes klip VOD dan file segmen; Anda dapat menggunakan bucket yang sama dengan yang Anda buat untuk manifes live stream atau bucket yang berbeda; Anda juga dapat menambahkan nama direktori ke nama bucket (misalnya,my-bucket/vod-clip
)
Untuk mengirim permintaan Anda, perluas salah satu opsi berikut:
Anda akan melihat respons JSON seperti berikut:
{ "name": "projects/PROJECT_NUMBER/locations/LOCATION/operations/OPERATION_ID", "metadata": { "@type": "type.googleapis.com/google.cloud.video.livestream.v1.OperationMetadata", "createTime": CREATE_TIME, "target": "projects/PROJECT_NUMBER/locations/LOCATION/channels/CHANNEL_ID/clips/CLIP_ID", "verb": "create", "requestedCancellation": false, "apiVersion": "v1" }, "done": false }
Perintah ini membuat operasi yang berjalan lama (LRO) yang dapat Anda gunakan untuk melacak progres permintaan. Lihat Mengelola operasi yang berjalan lama untuk mengetahui informasi selengkapnya.
Mendapatkan klip VOD
Untuk mendapatkan klip VOD, gunakan metode
projects.locations.channels.clips.get
.
Sebelum menggunakan salah satu data permintaan, lakukan penggantian berikut:
PROJECT_NUMBER
: nomor project Google Cloud Anda; ini terletak di kolom Project number di halaman IAM SettingsLOCATION
: lokasi tempat channel Anda berada; gunakan salah satu region yang didukungMenampilkan lokasius-central1
us-east1
us-east4
us-west1
us-west2
northamerica-northeast1
southamerica-east1
asia-east1
asia-east2
asia-south1
asia-northeast1
asia-southeast1
australia-southeast1
europe-north1
europe-west1
europe-west2
europe-west3
europe-west4
CHANNEL_ID
: ID yang ditentukan pengguna untuk saluranCLIP_ID
: ID yang ditentukan pengguna untuk klip VOD
Untuk mengirim permintaan Anda, perluas salah satu opsi berikut:
Anda akan melihat respons JSON seperti berikut:
{ "name": "projects/PROJECT_NUMBER/locations/LOCATION/channels/CHANNEL_ID/clips/CLIP_ID", "createTime": CREATE_TIME, "startTime": START_TIME, "updateTime": UPDATE_TIME, "state": "SUCCEEDED", "outputUri": "gs://BUCKET_NAME", "slices": [ { "timeSlice": { "markinTime": "MARK_IN_TIME", "markoutTime": "MARK_OUT_TIME" } } ], "features": {}, "clipManifests": [ { "manifestKey": "manifest_hls", "outputUri": "gs://BUCKET_NAME/main.m3u8" } ] }
Manifes yang dihasilkan berada di URI yang ditentukan di
kolom clipManifests.outputUri
. Nama file
manifes sama dengan nilai kolom
manifests.fileName
saluran induk.
Respons harus berisi hal berikut:
{
...
"state": "SUCCEEDED"
...
}
Hanya 1.000 data tugas klip terbaru per saluran yang tersedia
menggunakan
metode
projects.locations.channels.clips.get
. Semua data tugas klip yang lebih lama dari batas akan dihapus. Anda harus mengelola file klip yang dihasilkan
yang ditentukan oleh
outputUri
;
Live Stream API tidak menghapus file ini dari Cloud Storage.
Memverifikasi konten bucket
Buka bucket Cloud Storage seperti yang ditentukan di kolom outputUri
klip. Pastikan folder tersebut berisi file dan direktori berikut:
- Manifes level teratas untuk klip dengan nama yang sama seperti
manifests.fileName
yang ditentukan dalam konfigurasi channel (misalnya,main.m3u8
); Anda dapat memutar manifes ini menggunakan pemutar media online - Direktori untuk setiap
muxStreams.key
yang ditentukan di saluran (misalnya,mux_video_ts
)- Playlist untuk klip (misalnya,
index-1.m3u8
) - Direktori yang diberi nama menggunakan format
YYYYMMDDTHHMMSSZ
(misalnya,20220708T203309Z/
); direktori ini menyimpan segmen klip VOD- Beberapa file
segment-number.ts
segmen yang membentuk klip VOD
- Beberapa file
- Playlist untuk klip (misalnya,
Memutar klip VOD
Untuk memutar file media yang dihasilkan di Shaka Player, selesaikan langkah-langkah berikut:
- Buat bucket Cloud Storage yang Anda buat dapat dibaca oleh publik.
- Untuk mengaktifkan cross-origin resource
sharing (CORS) di bucket Cloud Storage, lakukan tindakan berikut:
- Buat file JSON yang berisi hal berikut:
[ { "origin": ["https://shaka-player-demo.appspot.com/"], "responseHeader": ["Content-Type", "Range"], "method": ["GET", "HEAD"], "maxAgeSeconds": 3600 } ]
-
Jalankan perintah berikut setelah mengganti
JSON_FILE_NAME
dengan nama file JSON yang Anda buat di langkah sebelumnya:gcloud storage buckets update gs://BUCKET_NAME --cors-file=JSON_FILE_NAME.json
- Buat file JSON yang berisi hal berikut:
- Di bucket Cloud Storage, temukan file yang dihasilkan. Klik Copy URL di kolom Public access file.
- Buka Shaka Player, pemutar live stream online.
- Klik Konten Kustom di menu navigasi atas.
- Klik tombol +.
Tempelkan URL publik file ke kotak Manifest URL.
Ketik nama di kotak Name.
Klik Simpan.
Klik Putar.
Anda akan melihat pola pengujian diputar sebagai live stream.
Peristiwa jeda iklan dan slate
Jika Anda membuat peristiwa jeda iklan untuk live stream, klip VOD tidak akan berisi iklan. API membuat playlist dengan titik henti sementara iklan yang diganti dengan tag berikut:
#EXT-X-CUE-OUT: AD_BREAK_DURATION
#EXT-X-CUE-IN
Slate yang muncul di awal atau akhir klip VOD akan otomatis dihapus. Slate yang muncul dalam streaming, yang dikelilingi oleh konten live stream, akan dipertahankan dalam klip VOD yang dihasilkan.