- OSS_LiveChannel介绍
- OSS_Live_Channel常见操作
- F&Q
- 1.推流状态、客户端IP、连接时间等信息为何获取不了?
- 2.通过http协议在观流地址上获取的*.m3u8后缀文件是什么,如何将其转换为可观看的音视频?
- 3.get_live_channel_history能否获取历史推流的启止时间和远端地址?
- 4.通过list_live_channel匹配获取到的频道信息是什么类型的?
- 5.生成点播列表post_vod_playlist函数中end_time参数所需要的格式是什么?
- 6.报错【’Code’: ‘MalformedXML’, ‘Message’: ‘The XML you provided was not well-formed or did not validate against our published schema.’】
- 7.报错【’Code’: ‘InvalidArgument’, ‘Message’: ‘No ts file found in specified time span.’】
- 附:OBS推流地址
- 参考连接
- join US
">
OSS_LiveChannel介绍
OSS_LiveChannel是一个适用直播推流的API接口工具,提供RTMP协议将音视频数据上传到OSS,转储为指定格式的音视频文件。创建LiveChannel后即可获取对应的推流、观流地址。
通过RTMP协议上传音视频数据目前有以下限制:
- 只能使用RTMP推流的方式,不支持拉流。
- 必须包含视频流,且视频流格式为H264。
- 音频流是可选的,并且只支持AAC格式,其他格式的音频流会被丢弃。
- 转储只支持HLS协议。
- 一个LiveChannel同时只能有一个客户端向其推流。
OSS_Live_Channel常见操作
环境准备
import osimport oss2access_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', '***')# 创建Bucket实例bucket = oss2.Bucket(oss2.Auth(access_key_id, access_key_secret), endpoint, bucket_name)# 创建并配置流频道# 频道的名称是test_rtmp_live。直播生成的m3u8文件叫做test.m3u8,该索引文件包含3片ts文件,每片ts文件的时长为5秒(这只是一个建议值,具体的时长取决于关键帧)。channel_name = "test_rtmp_live"playlist_name = "test.m3u8"create_result = bucket.create_live_channel(channel_name,oss2.models.LiveChannelInfo(status = 'enabled',description = '测试使用的直播频道',target = oss2.models.LiveChannelInfoTarget(playlist_name = playlist_name,frag_count = 3,frag_duration = 5)))
创建 LiveChannel 的更多详情,请参考PutLiveChannel。
RTMP推流地址及签名
import osimport oss2access_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', '***')# 创建Bucket实例bucket = oss2.Bucket(oss2.Auth(access_key_id, access_key_secret), endpoint, bucket_name)# 获取推流观流地址# 创建直播频道之后拿到推流用的play_url(rtmp推流的url,如果Bucket不是公共读写权限那么还需要带上签名,见下文示例)和观流用的publish_url(推流产生的m3u8文件的url)。publish_url = create_result.publish_urlplay_url = create_result.play_urlprint("推流地址:",publish_url)print("观流地址:",play_url)#'推流地址: rtmp://***-channel.oss-cn-***.aliyuncs.com/**/**-**'#'观流地址: http://***-channel.oss-cn-****.aliyuncs.com/song-**/**.m3u8'# 拿到推流地址和观流地址之后就可以向OSS推流和观流。如果Bucket的权限不是公共读写,那么还需要对推流做签名,如果Bucket是公共读写的,那么可以直接用publish_url推流。# 这里的expires是一个相对时间,指的是从现在开始这次推流过期的秒数。# params是一个dict类型的参数,表示用户自定义的参数。所有的参数都会参与签名。# 拿到这个签过名的signed_url就可以使用推流工具直接进行推流,一旦连接上OSS之后超过上面的expires流也不会断掉,OSS仅在每次推流连接的时候检查expires是否合法。signed_url = bucket.sign_rtmp_url(channel_name, playlist_name, expires=3600)print(signed_url)
RTMP推流地址及签名
列举&删除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', '***')
# 创建Bucket实例
bucket = oss2.Bucket(oss2.Auth(access_key_id, access_key_secret), endpoint, bucket_name)
prefix = ''
max_keys = 1000
#列举符合规则的LiveChannel
# """列举出Bucket下所有符合条件的live channel
# param: str prefix: list时channel_id的公共前缀
# param: str marker: list时指定的起始标记
# param: int max_keys: 本次list返回live channel的最大个数
# return: :class:`ListLiveChannelResult <oss2.models.ListLiveChannelResult>`
# """
for info in oss2.LiveChannelIterator(bucket, prefix, max_keys=max_keys):
print(info.name)
#删除LiveChannel
bucket.delete_live_channel(info.name)
ListLiveChannel接口用于列举指定的LiveChannel。
DeleteLiveChannel接口用于删除指定的LiveChannel。
设置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', '***')
# 创建Bucket实例
bucket = oss2.Bucket(oss2.Auth(access_key_id, access_key_secret), endpoint, bucket_name)
# 打开或关闭流频道
bucket.put_live_channel_status(channel_name, 'enabled')
bucket.put_live_channel_status(channel_name, 'disabled')
LiveChannel分为enabled和disabled两种状态。您可以使用PutLiveChannelStatus接口在两种状态之间进行切换。
获取LiveChannel状态信息Idle(空闲状态)
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', '***')
# 创建Bucket实例
bucket = oss2.Bucket(oss2.Auth(access_key_id, access_key_secret), endpoint, bucket_name)
#查看当前流的状态信息状态
get_statu = bucket.get_live_channel_stat(channel_name)
print("连接时间:",get_statu.connected_time)
print("推流客户端的IP:",get_statu.remote_addr )
print("推流状态:",get_statu.status )
GetLiveChannelStat接口用于获取指定LiveChannel的推流状态信息。
查看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', '***')
# 创建Bucket实例
bucket = oss2.Bucket(oss2.Auth(access_key_id, access_key_secret), endpoint, bucket_name)
get_result = bucket.get_live_channel(channel_name)
print("-------------------")
print("推流配置信息:")
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("-------------------")
GetLiveChannelInfo接口用于获取指定LiveChannel的配置信息。
查看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', '***')
# 创建Bucket实例
bucket = oss2.Bucket(oss2.Auth(access_key_id, access_key_secret), endpoint, bucket_name)
# 查看一个频道历史推流记录,可以调用get_live_channel_history目前最多可以看到10次推流的记录
history_result = bucket.get_live_channel_history(channel_name)
print("推流历史次数:",len(history_result.records))
GetLiveChannelHistory接口用于获取指定LiveChannel的推流记录。使用GetLiveChannelHistory接口最多会返回指定LiveChannel最近的10次推流记录。
生成&查看点播列表
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', '***')
# 创建Bucket实例
bucket = oss2.Bucket(oss2.Auth(access_key_id, access_key_secret), endpoint, bucket_name)
end_time = int(time.time()) - 60
start_time = end_time - 3600
# 生成点播列表
vod_playlist=bucket.post_vod_playlist(
¦ ¦ channel_name,
¦ ¦ playlist_name,
¦ ¦ start_time = start_time,
¦ ¦ end_time = end_time
¦ )
print(vod_playlist.status)
print(vod_playlist.headers)
200 {‘Server’: ‘AliyunOSS’, ‘Date’: ‘Sat, 20 Jul 2019 16:10:35 GMT’, ‘Content-Length’: ‘0’, ‘Connection’: ‘keep-alive’, ‘x-oss-request-id’: ‘‘, ‘ETag’: ‘““‘, ‘x-oss-server-time’: ‘11’}
# 如果想查看指定时间段内的播放列表,可以使用get_vod_playlist
result = bucket.get_vod_playlist(channel_name, start_time=start_time, end_time=end_time)
print("playlist:", result.playlist)
GetVodPlaylist接口用于查看指定LiveChannel在指定时间段内推流生成的播放列表。 PostVodPlaylist接口用于为指定的LiveChannel生成一个点播用的播放列表。OSS会查询指定时间范围内由该LiveChannel推流生成的ts文件,并将其拼装为一个m3u8播放列表。
F&Q
1.推流状态、客户端IP、连接时间等信息为何获取不了?
get_live_channel_stat获取推流状态信息需要对应的频道处于Live状态,即客户端连接上推流地址后正处于推流过程中,推流工具使用可参考百度经验
2.通过http协议在观流地址上获取的*.m3u8后缀文件是什么,如何将其转换为可观看的音视频?
用来指定生成的m3u8文件名称,其值覆盖LiveChannel中的配置。注意:生成的m3u8名称仍然会被添加”${channel_name}/“前缀。
https://help.aliyun.com/document_detail/44303.html?spm=a2c4g.11186623.6.804.3f9e7996IiKW0w
3.get_live_channel_history能否获取历史推流的启止时间和远端地址?
可以,https://help.aliyun.com/document_detail/44301.html?spm=a2c4g.11186623.6.811.6ee67ec41F9X7G
4.通过list_live_channel匹配获取到的频道信息是什么类型的?
字符串,https://help.aliyun.com/document_detail/44298.html?spm=a2c4g.11186623.6.806.67b71142Tkj245
5.生成点播列表post_vod_playlist函数中end_time参数所需要的格式是什么?
整数,https://help.aliyun.com/document_detail/44296.html?spm=a2c4g.11186623.6.812.b9d42df0jGY6gs
6.报错【’Code’: ‘MalformedXML’, ‘Message’: ‘The XML you provided was not well-formed or did not validate against our published schema.’】
注意下输入的xml格式
7.报错【’Code’: ‘InvalidArgument’, ‘Message’: ‘No ts file found in specified time span.’】
已上传推流文件后才能生成点播列表
附:OBS推流地址
文件->设置->推流->服务器(自定义)
地址填写RTMP推流地址及签名操作中获取的值

参考连接
join US

暴走小二官方群,欢迎来躁
