Membuat klip VOD dari live stream

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 Settings
  • LOCATION: lokasi tempat membuat endpoint input; gunakan salah satu region yang didukung
    Menampilkan lokasi
    • us-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 Settings
  • LOCATION: lokasi endpoint input Anda berada; gunakan salah satu region yang didukung
    Menampilkan lokasi
    • us-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 Settings
  • LOCATION: lokasi untuk membuat channel; gunakan salah satu region yang didukung
    Menampilkan lokasi
    • us-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 karakter
  • INPUT_ID: ID yang ditentukan pengguna untuk endpoint input
  • BUCKET_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 Settings
  • LOCATION: lokasi tempat channel Anda berada; gunakan salah satu region yang didukung
    Menampilkan lokasi
    • us-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:

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 Settings
  • LOCATION: lokasi tempat channel Anda berada; gunakan salah satu region yang didukung
    Menampilkan lokasi
    • us-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
  • CLIP_ID: ID yang ditentukan pengguna untuk klip VOD
  • MARK_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 Settings
  • LOCATION: lokasi tempat channel Anda berada; gunakan salah satu region yang didukung
    Menampilkan lokasi
    • us-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
  • CLIP_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

Memutar klip VOD

Untuk memutar file media yang dihasilkan di Shaka Player, selesaikan langkah-langkah berikut:

  1. Buat bucket Cloud Storage yang Anda buat dapat dibaca oleh publik.
  2. Untuk mengaktifkan cross-origin resource sharing (CORS) di bucket Cloud Storage, lakukan tindakan berikut:
    1. Buat file JSON yang berisi hal berikut:
      [
        {
          "origin": ["https://shaka-player-demo.appspot.com/"],
          "responseHeader": ["Content-Type", "Range"],
          "method": ["GET", "HEAD"],
          "maxAgeSeconds": 3600
        }
      ]
    2. 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
  3. Di bucket Cloud Storage, temukan file yang dihasilkan. Klik Copy URL di kolom Public access file.
  4. Buka Shaka Player, pemutar live stream online.
  5. Klik Konten Kustom di menu navigasi atas.
  6. Klik tombol +.
  7. Tempelkan URL publik file ke kotak Manifest URL.

  8. Ketik nama di kotak Name.

  9. Klik Simpan.

  10. Klik Putar.

Anda akan melihat pola pengujian diputar sebagai live stream.

Video pola pengujian

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.