Topik ini menjelaskan operasi LiveChannel umum menggunakan kit pengembangan perangkat lunak (SDK) Python, seperti membuat, menampilkan daftar, dan menghapus LiveChannels.
Prasyarat
Python 3.6
CatatanContoh dalam topik ini ditulis untuk Python 3.6 tetapi juga kompatibel dengan Python 2.6, 2.7, 3.3, 3.4, dan 3.5.
aliyun-oss-python-sdk 2.9.0
tool stream ingest OBS Studio
IDE
Membuat LiveChannel
Sebelum Anda dapat mengunggah data audio dan video menggunakan protokol RTMP, Anda harus memanggil operasi ini untuk membuat LiveChannel. Operasi PutLiveChannel mengembalikan URL ingest RTMP dan URL pemutaran yang sesuai.
Anda dapat menggunakan URL yang dikembalikan untuk ingest aliran dan pemutaran. Anda juga dapat menggunakan nama LiveChannel untuk melakukan operasi terkait, seperti menanyakan status ingest aliran, mengambil catatan ingest aliran, dan menonaktifkan ingest aliran.
Jika LiveChannel dengan nama yang sama sudah ada, LiveChannel baru akan menimpa yang sebelumnya. Pengaturan dan status LiveChannel baru diatur ulang ke nilai default-nya.
Kode berikut menunjukkan cara membuat LiveChannel.
import os
import oss2
access_key_id = os.getenv('OSS_TEST_ACCESS_KEY_ID', '**')
access_key_secret = os.getenv('OSS_TEST_ACCESS_KEY_SECRET', '***')
bucket_name = os.getenv('OSS_TEST_BUCKET', '********')
endpoint = os.getenv('OSS_TEST_ENDPOINT', '***')
# Buat instans Bucket.
bucket = oss2.Bucket(oss2.Auth(access_key_id, access_key_secret), endpoint, bucket_name)
# Buat dan konfigurasikan saluran langsung.
# Nama saluran adalah test_rtmp_live. File M3U8 yang dihasilkan untuk siaran langsung diberi nama test.m3u8. Manifes ini berisi tiga file TS, dan setiap file TS memiliki durasi 5 detik. Ini adalah nilai yang direkomendasikan. Durasi aktual bergantung pada keyframe.
channel_name = "test_rtmp_live"
playlist_name = "test.m3u8"
create_result = bucket.create_live_channel(
channel_name,
oss2.models.LiveChannelInfo(
status = 'enabled',
description = 'A test live channel',
target = oss2.models.LiveChannelInfoTarget(
playlist_name = playlist_name,
frag_count = 3,
frag_duration = 5)))Menampilkan daftar dan menghapus LiveChannels
Kode berikut menunjukkan cara menampilkan daftar dan menghapus LiveChannels:
Jika terdapat beberapa LiveChannels, operasi ini hanya menghapus LiveChannel terbaru yang sesuai dengan awalan. Untuk menghapus aliran tertentu, atur parameter prefix ke nama lengkap aliran tersebut. Operasi ini menampilkan semua LiveChannels yang sesuai dengan awalan, termasuk yang akan dihapus. Penghapusan yang berhasil tidak mengembalikan nilai apa pun. Jika tidak ada aliran yang sesuai dengan awalan, panggilan tersebut mengembalikan error.
import os
import oss2
access_key_id = os.getenv('OSS_TEST_ACCESS_KEY_ID', '**')
access_key_secret = os.getenv('OSS_TEST_ACCESS_KEY_SECRET', '***')
bucket_name = os.getenv('OSS_TEST_BUCKET', '********')
endpoint = os.getenv('OSS_TEST_ENDPOINT', '***')
# Buat instans Bucket.
bucket = oss2.Bucket(oss2.Auth(access_key_id, access_key_secret), endpoint, bucket_name)
# Tampilkan daftar LiveChannels yang sesuai dengan aturan.
# Tampilkan semua saluran langsung yang memenuhi syarat dalam bucket.
# param: prefix (Tipe: str) menentukan awalan nama saluran langsung yang akan ditampilkan. Jika tidak ditentukan, semua saluran langsung akan ditampilkan.
# return: class:`ListLiveChannelResult <oss2.models.ListLiveChannelResult>`
for info in oss2.LiveChannelIterator(bucket, prefix="test"):
print(info.name)
# Hapus LiveChannel.
bucket.delete_live_channel(info.name)Mengatur status LiveChannel
Kode berikut menunjukkan cara mengatur status LiveChannel. Jika tidak ada pesan error yang dikembalikan setelah kode dijalankan, status berhasil diatur.
import os
import oss2
access_key_id = os.getenv('OSS_TEST_ACCESS_KEY_ID', '**')
access_key_secret = os.getenv('OSS_TEST_ACCESS_KEY_SECRET', '***')
bucket_name = os.getenv('OSS_TEST_BUCKET', '********')
endpoint = os.getenv('OSS_TEST_ENDPOINT', '***')
# Buat instans Bucket.
bucket = oss2.Bucket(oss2.Auth(access_key_id, access_key_secret), endpoint, bucket_name)
# Aktifkan atau nonaktifkan saluran langsung.
bucket.put_live_channel_status(channel_name, 'enabled')
bucket.put_live_channel_status(channel_name, 'disabled')Mendapatkan URL ingest RTMP dan signature (hanya signature V1)
Kode berikut menunjukkan cara mengambil URL ingest RTMP dan signature:
import os
import oss2
access_key_id = os.getenv('OSS_TEST_ACCESS_KEY_ID', '**')
access_key_secret = os.getenv('OSS_TEST_ACCESS_KEY_SECRET', '***')
bucket_name = os.getenv('OSS_TEST_BUCKET', '********')
endpoint = os.getenv('OSS_TEST_ENDPOINT', '***')
# Buat instans Bucket.
bucket = oss2.Bucket(oss2.Auth(access_key_id, access_key_secret), endpoint, bucket_name)
# Dapatkan URL ingest dan pemutaran.
# Setelah Anda membuat saluran langsung, Anda mendapatkan publish_url untuk ingest aliran (URL ingest RTMP) dan play_url untuk pemutaran (URL file M3U8 yang dihasilkan dari aliran).
# Sebelum mendapatkan URL dan signature, Anda harus membuat LiveChannel dan mendapatkan create_result. Untuk informasi selengkapnya, lihat contoh pembuatan LiveChannel.
publish_url = create_result.publish_url
play_url = create_result.play_url
print("Ingest URL:", publish_url)
print("Playback URL:", play_url)
# Setelah mendapatkan URL ingest dan pemutaran, Anda dapat melakukan ingest aliran ke OSS dan memutar aliran dari OSS. Jika ACL bucket bukan public-read-write, Anda harus menandatangani URL ingest. Jika ACL bucket adalah public-read-write, Anda dapat langsung menggunakan publish_url untuk ingest aliran.
# Parameter expires menentukan waktu relatif dalam detik. Ini menunjukkan jumlah detik hingga URL ingest kedaluwarsa.
# Semua parameter disertakan dalam signature.
# Setelah mendapatkan URL yang ditandatangani, Anda dapat menggunakan tool ingest aliran untuk mulai streaming. Setelah koneksi dibuat dengan OSS, aliran tidak terputus meskipun URL kedaluwarsa. OSS hanya memeriksa validitas parameter expires saat koneksi ingest aliran baru dibuat.
signed_url = bucket.sign_rtmp_url(channel_name, playlist_name, expires=3600)
print(signed_url)Mendapatkan informasi status LiveChannel
Kode berikut menunjukkan cara mengambil status ingest aliran dari LiveChannel tertentu.
import os
import oss2
access_key_id = os.getenv('OSS_TEST_ACCESS_KEY_ID', '**')
access_key_secret = os.getenv('OSS_TEST_ACCESS_KEY_SECRET', '***')
bucket_name = os.getenv('OSS_TEST_BUCKET', '********')
endpoint = os.getenv('OSS_TEST_ENDPOINT', '***')
# Buat instans Bucket.
bucket = oss2.Bucket(oss2.Auth(access_key_id, access_key_secret), endpoint, bucket_name)
# Lihat informasi status aliran saat ini.
get_status = bucket.get_live_channel_stat(channel_name)
print("Waktu Koneksi:", get_status.connected_time)
print("IP Klien Ingest:", get_status.remote_addr)
print("Status Ingest:", get_status.status)Membuat dan melihat playlist
Operasi PostVodPlaylist menghasilkan playlist video sesuai permintaan (VOD) untuk LiveChannel tertentu. OSS menanyakan file TS yang dihasilkan oleh LiveChannel dalam rentang waktu tertentu dan menggabungkannya menjadi playlist M3U8.
Kode berikut menunjukkan cara membuat dan melihat playlist:
import os
import oss2
import time
access_key_id = os.getenv('OSS_TEST_ACCESS_KEY_ID', '**')
access_key_secret = os.getenv('OSS_TEST_ACCESS_KEY_SECRET', '***')
bucket_name = os.getenv('OSS_TEST_BUCKET', '********')
endpoint = os.getenv('OSS_TEST_ENDPOINT', '***')
# Buat instans Bucket
bucket = oss2.Bucket(oss2.Auth(access_key_id, access_key_secret), endpoint, bucket_name)
end_time = int(time.time())
start_time = end_time - 3600
generate_playlist = "my_vod_list.m3u8"
# Buat playlist VOD.
# Untuk membuat playlist VOD dari file TS siaran langsung, gunakan metode post_vod_playlist.
# Contoh ini mengatur waktu mulai ke 3600 detik sebelum waktu saat ini dan waktu akhir ke waktu saat ini. Ini menghasilkan playlist untuk aliran yang diingest dalam satu jam terakhir.
# Setelah operasi ini dipanggil dengan sukses, file playlist bernama "my_vod_list.m3u8" dihasilkan di OSS.
bucket.post_vod_playlist(
channel_name,
playlist_name,
start_time = start_time,
end_time = end_time)
# Untuk melihat konten playlist untuk periode waktu tertentu, gunakan get_vod_playlist.
result = bucket.get_vod_playlist(channel_name, start_time=start_time, end_time=end_time)
print("playlist:", result.playlist)Mendapatkan informasi konfigurasi LiveChannel
Kode berikut menunjukkan cara mengambil konfigurasi LiveChannel tertentu.
import os
import oss2
access_key_id = os.getenv('OSS_TEST_ACCESS_KEY_ID', '**')
access_key_secret = os.getenv('OSS_TEST_ACCESS_KEY_SECRET', '***')
bucket_name = os.getenv('OSS_TEST_BUCKET', '********')
endpoint = os.getenv('OSS_TEST_ENDPOINT', '***')
# Buat instans Bucket.
bucket = oss2.Bucket(oss2.Auth(access_key_id, access_key_secret), endpoint, bucket_name)
# Dapatkan informasi konfigurasi LiveChannel.
get_result = bucket.get_live_channel(channel_name)
print("-------------------")
print("Konfigurasi Ingest Aliran")
print(get_result.description)
print(get_result.status)
print(get_result.target.type)
print(get_result.target.frag_count)
print(get_result.target.frag_duration)
print(get_result.target.playlist_name)
print("-------------------")Mendapatkan catatan ingest aliran LiveChannel
Operasi GetLiveChannelHistory mengembalikan hingga 10 catatan ingest aliran terbaru untuk LiveChannel tertentu. Kode berikut menunjukkan cara mengambil catatan ingest aliran LiveChannel:
import os
import oss2
access_key_id = os.getenv('OSS_TEST_ACCESS_KEY_ID', '**')
access_key_secret = os.getenv('OSS_TEST_ACCESS_KEY_SECRET', '***')
bucket_name = os.getenv('OSS_TEST_BUCKET', '********')
endpoint = os.getenv('OSS_TEST_ENDPOINT', '***')
# Buat instans Bucket.
bucket = oss2.Bucket(oss2.Auth(access_key_id, access_key_secret), endpoint, bucket_name)
# Lihat catatan historis ingest aliran saluran.
history_result = bucket.get_live_channel_history(channel_name)
print("Jumlah catatan ingest historis:",len(history_result.records))Referensi
Untuk informasi selengkapnya, lihat operasi LiveChannel, live_channel.py, dan api.py.
FAQ
Mengapa saya tidak dapat mengambil informasi seperti status ingest aliran, alamat IP klien, dan waktu koneksi?
Untuk mengambil informasi status ingest aliran menggunakan get_live_channel_stat, saluran yang sesuai (channel_name) harus berada dalam status Live. Artinya, klien terhubung ke URL ingest dan sedang aktif melakukan ingest aliran.
Bisakah saya menggunakan .get_live_channel_history untuk mengambil waktu mulai dan akhir serta alamat remote dari ingest aliran historis?
Ya, bisa. Untuk informasi selengkapnya, lihat GetLiveChannelHistory.
Apa tipe data informasi saluran yang diperoleh melalui list_live_channel?
String. Untuk informasi selengkapnya, lihat ListLiveChannel.
Apa format yang diperlukan untuk parameter end_time dalam fungsi post_vod_playlist?
Integer. Untuk informasi selengkapnya, lihat PostVodPlaylist.
Saya menerima error "'Code': 'InvalidArgument', 'Message': 'No ts file found in specified time span.'".
Anda hanya dapat membuat playlist VOD setelah file aliran diunggah.