OSS_LiveChannel介绍

OSS_LiveChannel是一个适用直播推流的API接口工具,提供RTMP协议将音视频数据上传到OSS,转储为指定格式的音视频文件。创建LiveChannel后即可获取对应的推流、观流地址。

通过RTMP协议上传音视频数据目前有以下限制:

  • 只能使用RTMP推流的方式,不支持拉流。
  • 必须包含视频流,且视频流格式为H264。
  • 音频流是可选的,并且只支持AAC格式,其他格式的音频流会被丢弃。
  • 转储只支持HLS协议。
  • 一个LiveChannel同时只能有一个客户端向其推流。

OSS_Live_Channel常见操作

环境准备

  • python3.6+
  • aliyun-oss-python-sdk
  • OBS Studio
  • IDE

    创建LiveChannel

  1. import os
  2. import oss2
  3. access_key_id = os.getenv('OSS_TEST_ACCESS_KEY_ID', '**')
  4. access_key_secret = os.getenv('OSS_TEST_ACCESS_KEY_SECRET', '***')
  5. bucket_name = os.getenv('OSS_TEST_BUCKET', '********')
  6. endpoint = os.getenv('OSS_TEST_ENDPOINT', '***')
  7. # 创建Bucket实例
  8. bucket = oss2.Bucket(oss2.Auth(access_key_id, access_key_secret), endpoint, bucket_name)
  9. # 创建并配置流频道
  10. # 频道的名称是test_rtmp_live。直播生成的m3u8文件叫做test.m3u8,该索引文件包含3片ts文件,每片ts文件的时长为5秒(这只是一个建议值,具体的时长取决于关键帧)。
  11. channel_name = "test_rtmp_live"
  12. playlist_name = "test.m3u8"
  13. create_result = bucket.create_live_channel(
  14. channel_name,
  15. oss2.models.LiveChannelInfo(
  16. status = 'enabled',
  17. description = '测试使用的直播频道',
  18. target = oss2.models.LiveChannelInfoTarget(
  19. playlist_name = playlist_name,
  20. frag_count = 3,
  21. frag_duration = 5)))

创建 LiveChannel 的更多详情,请参考PutLiveChannel

RTMP推流地址及签名

  1. import os
  2. import oss2
  3. access_key_id = os.getenv('OSS_TEST_ACCESS_KEY_ID', '**')
  4. access_key_secret = os.getenv('OSS_TEST_ACCESS_KEY_SECRET', '***')
  5. bucket_name = os.getenv('OSS_TEST_BUCKET', '********')
  6. endpoint = os.getenv('OSS_TEST_ENDPOINT', '***')
  7. # 创建Bucket实例
  8. bucket = oss2.Bucket(oss2.Auth(access_key_id, access_key_secret), endpoint, bucket_name)
  9. # 获取推流观流地址
  10. # 创建直播频道之后拿到推流用的play_url(rtmp推流的url,如果Bucket不是公共读写权限那么还需要带上签名,见下文示例)和观流用的publish_url(推流产生的m3u8文件的url)。
  11. publish_url = create_result.publish_url
  12. play_url = create_result.play_url
  13. print("推流地址:",publish_url)
  14. print("观流地址:",play_url)
  15. #'推流地址: rtmp://***-channel.oss-cn-***.aliyuncs.com/**/**-**'
  16. #'观流地址: http://***-channel.oss-cn-****.aliyuncs.com/song-**/**.m3u8'
  17. # 拿到推流地址和观流地址之后就可以向OSS推流和观流。如果Bucket的权限不是公共读写,那么还需要对推流做签名,如果Bucket是公共读写的,那么可以直接用publish_url推流。
  18. # 这里的expires是一个相对时间,指的是从现在开始这次推流过期的秒数。
  19. # params是一个dict类型的参数,表示用户自定义的参数。所有的参数都会参与签名。
  20. # 拿到这个签过名的signed_url就可以使用推流工具直接进行推流,一旦连接上OSS之后超过上面的expires流也不会断掉,OSS仅在每次推流连接的时候检查expires是否合法。
  21. signed_url = bucket.sign_rtmp_url(channel_name, playlist_name, expires=3600)
  22. 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推流地址及签名操作中获取的值

Annotation 2019-11-28 195020.png

参考连接

join US

未标题-1.png

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