Google Cloud Video Live Stream API client library that transcodes mezzanine live signals into direct-to-consumer streaming formats, including Dynamic Adaptive Streaming over HTTP (DASH/MPEG-DASH), and HTTP Live Streaming (HLS), for multiple device platforms.
npx @tessl/cli install tessl/pypi-google-cloud-video-live-stream@1.12.0Google Cloud Video Live Stream API client library that transcodes mezzanine live signals into direct-to-consumer streaming formats, including Dynamic Adaptive Streaming over HTTP (DASH/MPEG-DASH) and HTTP Live Streaming (HLS), for multiple device platforms. This library provides comprehensive Python interface for managing live streaming workflows, channel configurations, input/output management, and real-time transcoding operations.
pip install google-cloud-video-live-streamfrom google.cloud.video import live_stream_v1Individual client imports:
from google.cloud.video.live_stream_v1 import (
LivestreamServiceClient,
LivestreamServiceAsyncClient
)Type imports:
from google.cloud.video.live_stream_v1.types.resources import (
Channel, Input, Event, Asset, Pool
)
from google.cloud.video.live_stream_v1.types.service import (
CreateChannelRequest, ListChannelsResponse
)from google.cloud.video import live_stream_v1
from google.cloud.video.live_stream_v1.types.resources import (
Channel, Input, InputAttachment
)
from google.cloud.video.live_stream_v1.types.service import (
CreateInputRequest, CreateChannelRequest, StartChannelRequest
)
from google.cloud.video.live_stream_v1.types.outputs import (
ElementaryStream, VideoStream
)
# Create client with default credentials
client = live_stream_v1.LivestreamServiceClient()
# Create an input for receiving streams
input_resource = Input(
type_=Input.Type.RTMP_PUSH,
tier=Input.Tier.HD
)
input_request = CreateInputRequest(
parent="projects/my-project/locations/us-central1",
input_id="my-input",
input=input_resource
)
input_operation = client.create_input(request=input_request)
created_input = input_operation.result()
# Create a channel for live streaming
channel_resource = Channel(
input_attachments=[
InputAttachment(
key="input1",
input=created_input.name
)
],
output=ElementaryStream(
video_stream=VideoStream(
h264=VideoStream.H264CodecSettings(
bitrate_bps=1000000,
frame_rate=30,
height_pixels=720,
width_pixels=1280
)
)
)
)
channel_request = CreateChannelRequest(
parent="projects/my-project/locations/us-central1",
channel_id="my-channel",
channel=channel_resource
)
channel_operation = client.create_channel(request=channel_request)
created_channel = channel_operation.result()
# Start the channel
start_request = StartChannelRequest(name=created_channel.name)
start_operation = client.start_channel(request=start_request)
start_response = start_operation.result()The Live Stream API follows a resource-oriented design with these core components:
Complete channel lifecycle management including creation, configuration, starting/stopping, and deletion of live streaming channels with support for multiple output formats and quality levels.
def create_channel(request: CreateChannelRequest) -> operation.Operation: ...
def list_channels(request: ListChannelsRequest) -> pagers.ListChannelsPager: ...
def get_channel(request: GetChannelRequest) -> Channel: ...
def delete_channel(request: DeleteChannelRequest) -> operation.Operation: ...
def update_channel(request: UpdateChannelRequest) -> operation.Operation: ...
def start_channel(request: StartChannelRequest) -> operation.Operation: ...
def stop_channel(request: StopChannelRequest) -> operation.Operation: ...Management of streaming input endpoints that receive live video streams via protocols like RTMP and SRT, with configuration for preprocessing, security rules, and stream properties.
def create_input(request: CreateInputRequest) -> operation.Operation: ...
def list_inputs(request: ListInputsRequest) -> pagers.ListInputsPager: ...
def get_input(request: GetInputRequest) -> Input: ...
def delete_input(request: DeleteInputRequest) -> operation.Operation: ...
def update_input(request: UpdateInputRequest) -> operation.Operation: ...Creation and management of channel events for dynamic overlay insertion, ad breaks, and other time-based modifications to live streams during broadcast.
def create_event(request: CreateEventRequest) -> Event: ...
def list_events(request: ListEventsRequest) -> pagers.ListEventsPager: ...
def get_event(request: GetEventRequest) -> Event: ...
def delete_event(request: DeleteEventRequest) -> None: ...Management of media assets and Digital Video Recording (DVR) sessions for creating recordings, clips, and time-shifted viewing experiences from live streams.
def create_asset(request: CreateAssetRequest) -> operation.Operation: ...
def list_assets(request: ListAssetsRequest) -> pagers.ListAssetsPager: ...
def get_asset(request: GetAssetRequest) -> Asset: ...
def delete_asset(request: DeleteAssetRequest) -> operation.Operation: ...
def create_dvr_session(request: CreateDvrSessionRequest) -> DvrSession: ...
def list_dvr_sessions(request: ListDvrSessionsRequest) -> pagers.ListDvrSessionsPager: ...
def get_dvr_session(request: GetDvrSessionRequest) -> DvrSession: ...
def delete_dvr_session(request: DeleteDvrSessionRequest) -> None: ...
def update_dvr_session(request: UpdateDvrSessionRequest) -> DvrSession: ...Creation and management of video clips extracted from live streams or DVR sessions, allowing users to create highlights and shareable content segments.
def list_clips(request: ListClipsRequest) -> pagers.ListClipsPager: ...
def get_clip(request: GetClipRequest) -> Clip: ...
def create_clip(request: CreateClipRequest) -> operation.Operation: ...
def delete_clip(request: DeleteClipRequest) -> operation.Operation: ...Management of resource pools that organize and control access to streaming resources across projects and regions.
def get_pool(request: GetPoolRequest) -> Pool: ...
def update_pool(request: UpdatePoolRequest) -> operation.Operation: ...Utilities for constructing and parsing Google Cloud resource names used throughout the Live Stream API.
@staticmethod
def asset_path(project: str, location: str, asset: str) -> str: ...
@staticmethod
def channel_path(project: str, location: str, channel: str) -> str: ...
@staticmethod
def clip_path(project: str, location: str, channel: str, clip: str) -> str: ...
@staticmethod
def dvr_session_path(project: str, location: str, channel: str, dvr_session: str) -> str: ...
@staticmethod
def event_path(project: str, location: str, channel: str, event: str) -> str: ...
@staticmethod
def input_path(project: str, location: str, input: str) -> str: ...
@staticmethod
def pool_path(project: str, location: str, pool: str) -> str: ...
@staticmethod
def network_path(project: str, network: str) -> str: ...
@staticmethod
def secret_version_path(project: str, secret: str, version: str) -> str: ...
@staticmethod
def common_billing_account_path(billing_account: str) -> str: ...
@staticmethod
def common_folder_path(folder: str) -> str: ...
@staticmethod
def common_organization_path(organization: str) -> str: ...
@staticmethod
def common_project_path(project: str) -> str: ...
@staticmethod
def common_location_path(project: str, location: str) -> str: ...
@staticmethod
def parse_asset_path(path: str) -> Dict[str, str]: ...
@staticmethod
def parse_channel_path(path: str) -> Dict[str, str]: ...
@staticmethod
def parse_clip_path(path: str) -> Dict[str, str]: ...
@staticmethod
def parse_dvr_session_path(path: str) -> Dict[str, str]: ...
@staticmethod
def parse_event_path(path: str) -> Dict[str, str]: ...
@staticmethod
def parse_input_path(path: str) -> Dict[str, str]: ...
@staticmethod
def parse_pool_path(path: str) -> Dict[str, str]: ...
@staticmethod
def parse_network_path(path: str) -> Dict[str, str]: ...
@staticmethod
def parse_secret_version_path(path: str) -> Dict[str, str]: ...
@staticmethod
def parse_common_billing_account_path(path: str) -> Dict[str, str]: ...
@staticmethod
def parse_common_folder_path(path: str) -> Dict[str, str]: ...
@staticmethod
def parse_common_organization_path(path: str) -> Dict[str, str]: ...
@staticmethod
def parse_common_project_path(path: str) -> Dict[str, str]: ...
@staticmethod
def parse_common_location_path(path: str) -> Dict[str, str]: ...Standard Google Cloud operations management for long-running operations.
def list_operations(
self,
request: operations_pb2.ListOperationsRequest = None,
*,
retry: OptionalRetry = gapic_v1.method.DEFAULT,
timeout: Union[float, object] = gapic_v1.method.DEFAULT,
metadata: Sequence[Tuple[str, Union[str, bytes]]] = ()
) -> operations_pb2.ListOperationsResponse: ...
def get_operation(
self,
request: operations_pb2.GetOperationRequest = None,
*,
retry: OptionalRetry = gapic_v1.method.DEFAULT,
timeout: Union[float, object] = gapic_v1.method.DEFAULT,
metadata: Sequence[Tuple[str, Union[str, bytes]]] = ()
) -> operations_pb2.Operation: ...
def delete_operation(
self,
request: operations_pb2.DeleteOperationRequest = None,
*,
retry: OptionalRetry = gapic_v1.method.DEFAULT,
timeout: Union[float, object] = gapic_v1.method.DEFAULT,
metadata: Sequence[Tuple[str, Union[str, bytes]]] = ()
) -> None: ...
def cancel_operation(
self,
request: operations_pb2.CancelOperationRequest = None,
*,
retry: OptionalRetry = gapic_v1.method.DEFAULT,
timeout: Union[float, object] = gapic_v1.method.DEFAULT,
metadata: Sequence[Tuple[str, Union[str, bytes]]] = ()
) -> None: ...Standard Google Cloud locations management for service availability.
def get_location(
self,
request: locations_pb2.GetLocationRequest = None,
*,
retry: OptionalRetry = gapic_v1.method.DEFAULT,
timeout: Union[float, object] = gapic_v1.method.DEFAULT,
metadata: Sequence[Tuple[str, Union[str, bytes]]] = ()
) -> locations_pb2.Location: ...
def list_locations(
self,
request: locations_pb2.ListLocationsRequest = None,
*,
retry: OptionalRetry = gapic_v1.method.DEFAULT,
timeout: Union[float, object] = gapic_v1.method.DEFAULT,
metadata: Sequence[Tuple[str, Union[str, bytes]]] = ()
) -> locations_pb2.ListLocationsResponse: ...class LivestreamServiceClient:
"""Main synchronous client for Live Stream API operations."""
def __init__(self, *, credentials=None, transport=None, client_options=None) -> None: ...
class LivestreamServiceAsyncClient:
"""Asynchronous client for Live Stream API operations."""
def __init__(self, *, credentials=None, transport=None, client_options=None) -> None: ...@classmethod
def from_service_account_info(
cls,
info: dict,
*args,
**kwargs
) -> LivestreamServiceClient:
"""Creates a client using service account information from a dictionary."""
@classmethod
def from_service_account_file(
cls,
filename: str,
*args,
**kwargs
) -> LivestreamServiceClient:
"""Creates a client using service account information from a JSON file."""@property
def transport(self) -> LivestreamServiceTransport:
"""The transport used by the client instance."""
@property
def api_endpoint(self) -> str:
"""The API endpoint for the service."""
@property
def universe_domain(self) -> str:
"""The universe domain for the service."""class Channel:
"""Live streaming channel configuration and state."""
name: str
create_time: timestamp_pb2.Timestamp
update_time: timestamp_pb2.Timestamp
labels: MutableMapping[str, str]
input_attachments: MutableSequence[InputAttachment]
active_input: str
output: ElementaryStream
elementary_streams: MutableSequence[ElementaryStream]
mux_streams: MutableSequence[MuxStream]
manifests: MutableSequence[Manifest]
sprite_sheets: MutableSequence[SpriteSheet]
streaming_state: StreamingState
streaming_error: status_pb2.Status
log_config: LogConfig
timecode_config: TimecodeConfig
encryptions: MutableSequence[Encryption]
class Input:
"""Streaming input endpoint configuration."""
name: str
create_time: timestamp_pb2.Timestamp
update_time: timestamp_pb2.Timestamp
labels: MutableMapping[str, str]
type_: Type
tier: Tier
uri: str
preprocessing_config: PreprocessingConfig
security_rules: SecurityRule
input_stream_property: InputStreamProperty
class Event:
"""Channel event for dynamic content insertion."""
name: str
create_time: timestamp_pb2.Timestamp
update_time: timestamp_pb2.Timestamp
labels: MutableMapping[str, str]
input_switch: InputSwitchTask
ad_break: AdBreakTask
return_to_program: ReturnToProgramTask
slate: SlateTask
mute: MuteTask
unmute: UnmuteTask
execute_now: bool
execution_time: timestamp_pb2.Timestamp
state: State
error: status_pb2.Status
class Asset:
"""Media asset resource."""
name: str
create_time: timestamp_pb2.Timestamp
update_time: timestamp_pb2.Timestamp
labels: MutableMapping[str, str]
video: VideoAsset
crc32c: str
state: State
error: status_pb2.Status
class DvrSession:
"""Digital Video Recording session."""
name: str
create_time: timestamp_pb2.Timestamp
update_time: timestamp_pb2.Timestamp
labels: MutableMapping[str, str]
start_time: timestamp_pb2.Timestamp
end_time: timestamp_pb2.Timestamp
retention_config: RetentionConfig
dvr_end_time: timestamp_pb2.Timestamp
state: State
error: status_pb2.Status
class Pool:
"""Resource pool for organizing streaming resources."""
name: str
create_time: timestamp_pb2.Timestamp
update_time: timestamp_pb2.Timestamp
labels: MutableMapping[str, str]
network_config: NetworkConfig
class Clip:
"""Video clip extracted from streams."""
name: str
create_time: timestamp_pb2.Timestamp
update_time: timestamp_pb2.Timestamp
labels: MutableMapping[str, str]
start_time_offset: duration_pb2.Duration
end_time_offset: duration_pb2.Duration
clip_manifest_uri: str
state: State
error: status_pb2.Status# Channel requests
class CreateChannelRequest:
parent: str
channel_id: str
channel: Channel
request_id: str
class ListChannelsRequest:
parent: str
page_size: int
page_token: str
filter: str
order_by: str
class ListChannelsResponse:
channels: MutableSequence[Channel]
next_page_token: str
unreachable: MutableSequence[str]
class GetChannelRequest:
name: str
class DeleteChannelRequest:
name: str
request_id: str
class UpdateChannelRequest:
update_mask: field_mask_pb2.FieldMask
channel: Channel
request_id: str
class StartChannelRequest:
name: str
request_id: str
class StopChannelRequest:
name: str
request_id: strclass ElementaryStream:
"""Elementary stream configuration for video and audio streams."""
key: str
video_stream: VideoStream
audio_stream: AudioStream
text_stream: TextStream
class VideoStream:
"""Video stream configuration and encoding settings."""
h264: H264CodecSettings
h265: H265CodecSettings
class H264CodecSettings:
"""H.264 video codec configuration."""
bitrate_bps: int
frame_rate: float
height_pixels: int
width_pixels: int
aq_mode: str
b_frames: int
b_pyramid: bool
entropy_coder: str
gop_duration: duration_pb2.Duration
keyframe_interval: int
pixel_format: str
preset: str
profile: str
rate_control_mode: str
tune: str
class H265CodecSettings:
"""H.265 video codec configuration."""
bitrate_bps: int
frame_rate: float
height_pixels: int
width_pixels: int
class AudioStream:
"""Audio stream configuration and encoding settings."""
codec: str
bitrate_bps: int
channel_count: int
channel_layout: MutableSequence[str]
sample_rate_hertz: int
language_code: str
class TextStream:
"""Text stream configuration for subtitles and captions."""
codec: str
language_code: str
mapping: MutableSequence[TextMapping]
class TextMapping:
"""Text stream mapping configuration."""
atom_key: str
input_key: str
input_track: int
class MuxStream:
"""Multiplexed stream configuration combining elementary streams."""
key: str
container: str
elementary_streams: MutableSequence[str]
segment_settings: SegmentSettings
encryption_id: str
class Manifest:
"""Output manifest configuration for HLS and DASH."""
file_name: str
type_: ManifestType
mux_streams: MutableSequence[str]
max_segment_count: int
segment_keep_count: int
class ManifestType(proto.Enum):
"""Manifest type enumeration."""
MANIFEST_TYPE_UNSPECIFIED = 0
HLS = 1
DASH = 2
class SegmentSettings:
"""Segment configuration for streaming outputs."""
segment_duration: duration_pb2.Duration
individual_segments: bool
class SpriteSheet:
"""Sprite sheet configuration for video thumbnails."""
format_: str
file_prefix: str
sprite_width_pixels: int
sprite_height_pixels: int
column_count: int
row_count: int
start_time_offset: duration_pb2.Duration
end_time_offset: duration_pb2.Duration
total_count: int
interval: duration_pb2.Duration
quality: int
class TimecodeConfig:
"""Timecode configuration for live streams."""
source: TimecodeSource
utc_offset: duration_pb2.Duration
time_zone: TimeZone
class TimecodeSource(proto.Enum):
"""Timecode source enumeration."""
TIMECODE_SOURCE_UNSPECIFIED = 0
EMBEDDED = 1
MEDIA_TIMESTAMP = 2
class TimeZone:
"""Time zone configuration."""
id: str
class Encryption:
"""Encryption configuration for stream security."""
id: str
secret_manager_key_source: SecretManagerSource
drm_systems: DrmSystems
aes128: Aes128Encryption
sample_aes: SampleAesEncryption
mpeg_cenc: MpegCommonEncryption
class SecretManagerSource:
"""Secret Manager key source."""
secret: str
version: str
class LogConfig:
"""Logging configuration for channels."""
log_severity: LogSeverity
class LogSeverity(proto.Enum):
"""Log severity levels."""
LOG_SEVERITY_UNSPECIFIED = 0
OFF = 1
DEBUG = 100
INFO = 200
WARNING = 400
ERROR = 500
class StaticOverlay:
"""Static overlay configuration for channels."""
asset: str
resolution: NormalizedResolution
position: NormalizedCoordinate
opacity: float
class NormalizedCoordinate:
"""Normalized coordinate for positioning overlays."""
x: float
y: float
class NormalizedResolution:
"""Normalized resolution for overlay sizing."""
w: float
h: float
class TimeInterval:
"""Time interval specification."""
start_time: timestamp_pb2.Timestamp
end_time: timestamp_pb2.Timestamp
class NetworkConfig:
"""Network configuration for resource pools."""
peered_network: strclass OperationMetadata:
"""Metadata for long-running operations."""
create_time: timestamp_pb2.Timestamp
end_time: timestamp_pb2.Timestamp
target: str
verb: str
status_message: str
requested_cancellation: bool
api_version: str
class ChannelOperationResponse:
"""Response for channel operations."""
pass