签名请看: https://blog.csdn.net/tang05709/article/details/88366228
module Aliyun
class AliyunVideoAchieve < AliyunSign
def initialize
@access_key_id = Rails.configuration.application['ALIYUN_OSS_ACCESS_KEY_ID']
@access_key_secret = Rails.configuration.application['ALIYUN_OSS_ACCESS_KEY_SECRET']
@send_url = 'http://vod.cn-shanghai.aliyuncs.com'.freeze
end
'''
获取视频上传地址和凭证,并创建视频信息
title: 视频标题
file_name: 视频源文件名必须带扩展名
options: FileSize: 视频文件大小; Description: 视频描述,长度不超过1024个字节, CoverURL:自定义视频封面URL地址
options: CateId:视频分类ID;Tags:视频标签,多个用逗号分隔;TemplateGroupId:转码模板组ID; UserData:自定义设置,为JSON字符串,支持消息回调等设置
options: StorageLocation:存储地址。当不为空时,会使用该指定的存储地址上传视频文件
return RequestId:请求ID; VideoId:视频ID;UploadAddress:上传地址;UploadAuth:上传凭证
'''
def create_upload_video(title, file_name, options = {})
#http://vod.cn-shanghai.aliyuncs.com/?Action=CreateUploadVideo&Title=exampleTitle&FileName=example.avi&FileSize=10485760&Format=JSON&<公共参数>
#Action 系统规定参数。取值:CreateUploadVideo
#Title视频标题,长度不超过128个字节 utf8
#FileName视频源文件名必须带扩展名,且扩展名不区分大小写。MP4,3GP,MPEG,AVI,FLV,m3u8
#FileSize 视频文件大小
# 返回 RequestId:请求ID, VideoId:视频ID, UploadAddress:上传地址, UploadAuth:上传凭证
param = {
Action: 'CreateUploadVideo',
Title: title,
FileName: file_name,
AccessKeyId: @access_key_id
}
key = @access_key_secret + '&'
options = create_sign_url("POST", param, key, 'video')
result = Faraday.post(@send_url, options)
res = JSON.parse(result.body)
if res["UploadAddress"].blank?
[]
else
res
end
end
'''
刷新视频上传凭证
video_id 视频ID
'''
def refresh_upload_video(video_id)
# http://vod.cn-shanghai.aliyuncs.com/?Action=RefreshUploadVideo&VideoId=93ab850b4f6f44eab54b6e91d24d81d4&Format=JSON&<公共参数>
# Action 系统规定参数。取值: RefreshUploadVideo
# VideoId 视频ID
# 返回 RequestId:请求ID, UploadAddress:上传地址, UploadAuth:上传凭证
param = {
Action: 'RefreshUploadVideo',
VideoId: video_id,
AccessKeyId: @access_key_id
}
key = @access_key_secret + '&'
options = create_sign_url("POST", param, key, 'video')
result = Faraday.post(@send_url, options)
res = JSON.parse(result.body)
if res["UploadAddress"].blank?
[]
else
res
end
end
'''
获取视频信息
video_id 视频ID
'''
def get_video_info(video_id)
#http://vod.cn-shanghai.aliyuncs.com/?Action=GetVideoInfo&VideoId=93ab850b4f6f44eab54b6e91d24d81d4&Format=JSON&<公共参数>
# Action 系统规定参数。取值:GetVideoInfo
# VideoId 视频ID
# 返回 RequestId, Video
# Video: VideoId, Title, Description, Duration, CoverURL, Status, CreationTime, Snapshots, CateId, CateName, Tags
# Snapshots: Snapshot
param = {
Action: 'GetVideoInfo',
VideoId: video_id,
AccessKeyId: @access_key_id
}
key = @access_key_secret + '&'
options = create_sign_url("POST", param, key, 'video')
result = Faraday.post(@send_url, options)
res = JSON.parse(result.body)
if res["Video"].blank?
[]
else
res
end
end
'''
生成一个密钥
'''
def get_play_datakey
# https://kms.cn-hangzhou.aliyuncs.com/?Action=GenerateDataKey
# KeyId 主密钥(CMK)的全局唯一标识符
# 返回 KeyId, Plaintext, CiphertextBlob
send_url = 'https://kms.cn-hangzhou.aliyuncs.com'
param = {
Action: 'GenerateDataKey',
KeyId: "最好填写密钥别名",
AccessKeyId: @access_key_id
}
key = @access_key_secret + '&'
options = create_sign_url("POST", param, key, 'auth')
result = Faraday.post(send_url, options)
res = JSON.parse(result.body)
puts res
if res["CiphertextBlob"].blank?
[]
else
$redis.set('Plaintext', res["Plaintext"])
$redis.set('CiphertextBlob', res["CiphertextBlob"])
res["CiphertextBlob"]
end
end
'''
获取播放凭证
video_id 视频ID
timeout 凭证过期时间, 取视频时长
'''
def get_play_auth(video_id, timeout = nil)
# Action 系统规定参数。取值: GetVideoPlayAuth
# VideoId 视频ID
# AuthInfoTimeout 播放凭证过期时间。取值范围:100~3000。默认值:100秒
# PlayConfig CipherText 密文秘钥,用来获取明文秘钥
# PlayConfig DecryptKeyUri 根据密文秘钥获取解密秘钥地址
# PlayConfig KeyServiceType 密钥服务类型,默认值:KMS
# 返回 RequestId, VideoMeta, PlayAuth
# VideoMeta VideoId, Title, Duration, CoverURL, Status
ciphertext = $redis.get("CiphertextBlob")
if ciphertext.blank?
ciphertext = get_play_datakey
end
play_config = {
CipherText: ciphertext,
KeyServiceType: 'KMS'
}
play_config_str = play_config.to_json
param = {
Action: 'GetVideoPlayAuth',
VideoId: video_id,
PlayConfig: play_config_str,
AccessKeyId: @access_key_id
}
if timeout.present?
param[:AuthInfoTimeout] = timeout
end
key = @access_key_secret + '&'
options = create_sign_url("POST", param, key, 'video')
result = Faraday.post(@send_url, options)
res = JSON.parse(result.body)
if res["PlayAuth"].blank?
[]
else
data = {
PlayAuth: res["PlayAuth"],
CoverURL: res["VideoMeta"]["CoverURL"],
VideoId: res["VideoMeta"]["VideoId"]
}
end
end
'''
删除视频
video_ids 视频ID列表。多个用逗号分隔
'''
def delete_video(video_ids)
# Action 系统规定参数。取值:DeleteVideo
# VideoIds 视频ID列表。多个用逗号分隔,最多支持20个
param = {
Action: 'DeleteVideo',
VideoIds: set_videos(video_ids),
AccessKeyId: @access_key_id
}
key = @access_key_secret + '&'
options = create_sign_url("POST", param, key, 'video')
result = Faraday.post(@send_url, options)
end
'''
phone_numbers, 逗号隔开
'''
def set_videos(video_ids)
if video_ids.is_a(Array)
videos = video_ids.join(',')
else
videos = video_ids
end
videos
end
end
end
如果需要加密,需要在aliyun开启密钥服务,然后把密钥id写入代码,当如aliyun提供了密钥别名,所以最好用别名
前端
<div class="prism-player" id="J_prismPlayer"></div>
<script>
var player = new Aliplayer({
id: "J_prismPlayer",
width:"1000px",
height:"640px",
format: 'm3u8',
useFlashPrism: true,
vid:"<%= @play_auth[:VideoId] %>",
playauth:"<%= @play_auth[:PlayAuth] %>",
cover:"<%= @play_auth[:CoverURL] %>" });
</script>
当然,也需要引入js,因为就一个页面用,就直接在前端引用了
<link rel="stylesheet" href="//g.alicdn.com/de/prismplayer/2.6.0/skins/default/aliplayer-min.css" />
<script type="text/javascript" src="//g.alicdn.com/de/prismplayer/2.6.0/aliplayer-min.js"></script>