使用场景:
我们在使用腾讯的云点播实现视频的录制功能时,需要将录制的视频保存到本地系统中时。
1、下载腾讯录制的视频文件
#下载使用腾讯实现录制的视频文件
def download_tencent_dvr(video_url,file_path):
'''
:param video_url: 要下载的音频文件
:param file_path: 文件夹/xxx.mp4
:return:
/static/tencent_dvr/病历号/xxx.mp4 #下载成功
False #代表下载失败
'''
#音频文件保存的位置:这个看自己
save_path = os.path.join(STATIC_PATH, 'tencent_dvr', file_path)
save_path = save_path.replace('\\','/')
#查看保存音频文件的目录是否存在,不存在就增加该目录
dir_path = os.path.dirname(save_path)
if not os.path.exists(dir_path):
os.makedirs(dir_path)
#文件名相同时,修改名字
co=0
while True:
co+=1
if os.path.exists(save_path):
dir,filename = file_path.rsplit('/')
name,suffix = filename.split('.')
name = name[:21]+f'-{co}'
file_path = dir+'/'+f'{name}.{suffix}'
save_path = os.path.join(STATIC_PATH, 'tencent_dvr', file_path)
else:
break
#将其中的\ 转成/
save_path = save_path.replace('\\', '/')
#响应给视图的路径: /static/tencent_dvr/病例号/xxx.mp4
ret_path = save_path.split('static/')[-1]
ret_path ='/static/'+ret_path
print('腾讯录制的视频保存到本地:',ret_path)
#获取到数据
try:
#拿到响应数据
response = requests.get(video_url, stream=True)
if response.status_code == 200:
#将文件保存到本地
with open(save_path, 'wb') as file:
for chunk in response.iter_content(chunk_size=1024):
file.write(chunk)
print("视频下载完成!")
return ret_path.replace('\\','/')
else:
print('视频文件获取不到')
return False
except Exception as e:
print(str(e))
return False
2、删除腾讯点播录制的视频
import json
from tencentcloud.common import credential
from tencentcloud.common.profile.client_profile import ClientProfile
from tencentcloud.common.profile.http_profile import HttpProfile
from tencentcloud.common.exception.tencent_cloud_sdk_exception import TencentCloudSDKException
from tencentcloud.vod.v20180717 import vod_client, models
def delete_tencent_dvr_file(file_id):
'file_id: 要删除的录制的文件id'
#腾讯云密钥
SecretId ='xxxxx'
SecretKey ='xxxxx'
try:
# 实例化一个认证对象,入参需要传入腾讯云账户 SecretId 和 SecretKey,此处还需注意密钥对的保密
# 代码泄露可能会导致 SecretId 和 SecretKey 泄露,并威胁账号下所有资源的安全性。以下代码示例仅供参考,建议采用更安全的方式来使用密钥,请参见:https://cloud.tencent.com/document/product/1278/85305
# 密钥可前往官网控制台 https://console.cloud.tencent.com/cam/capi 进行获取
cred = credential.Credential(SecretId, SecretKey)
# 实例化一个http选项,可选的,没有特殊需求可以跳过
httpProfile = HttpProfile()
httpProfile.endpoint = "vod.tencentcloudapi.com"
# 实例化一个client选项,可选的,没有特殊需求可以跳过
clientProfile = ClientProfile()
clientProfile.httpProfile = httpProfile
# 实例化要请求产品的client对象,clientProfile是可选的
client = vod_client.VodClient(cred, "", clientProfile)
# 实例化一个请求对象,每个接口都会对应一个request对象
req = models.DeleteMediaRequest()
params = {
'FileId':f'{file_id}'
}
req.from_json_string(json.dumps(params))
# 返回的resp是一个DeleteMediaResponse的实例,与请求对象对应
resp = client.DeleteMedia(req)
# 输出json格式的字符串回包
print(resp.to_json_string())#成功响应结果:{"RequestId":"xxxxx"}
print('删除成功成功')
except TencentCloudSDKException as err:
print(err)
if __name__ == '__main__':
delete_tencent_file(32708350099551451xx)
3、设置回调函数
回调时,腾讯响应的数据格式
{
'EventGroupId': 3,
'EventType': 311,
'CallbackTs': 1687680818516,
'EventInfo': {
'RoomId': '2306250032', #房间号
'EventTs': 1687680813,
'UserId': 'auto_record_1400817148_2306250032_mix',
'TaskId': 'D1lp8uRRsuuG3V68MIVNru8tSnRy9B0fUJlm2LFuJaB-++Iw+fNiovmWXn6voPWooAtBnMMA',
'Payload': {
'Status': 0,
'TencentVod': { #
'UserId': '',
'TrackType': 'audio_video',
'MediaId': 'mix',
'FileId': '3270835009955145182', #文件id,删除保存在云端上视频需要用到
'VideoUrl': 'https://1256408003.vod-qcloud.com/83a1b83fvodcq1256408003/0ee04b223270835009955145182/f0.mp4', #播放视频的地址
'CacheFile': '1400817148_2306250032.mp4', #视频的名字
'StartTimeStamp': 1687680791860,#开始时间戳
'EndTimeStamp': 1687680811943#结束时间戳
}
}
}
}
#注意:只有存在TencentVod 对应的数据,才说明视频录制完成了,才需要进行下载保存的操作
回调接口代码:
class TencentRollbackView(views.MethodView):
# decorators = (login_required,)
def post(self):
#拿到录制完成的回调函数响应的数据
dict_data = request.json
#保存腾讯录制的各种消息
even_info = dict_data.get('EventInfo')
room_id = even_info.get('RoomId')
#1、判断是否有对应的音频文件,拿到录制的视频的信息
try:
#拿到视频的基本信息
video_info = even_info.get('Payload').get('TencentVod')
if not dvr_info:
'此时的回调不是有录制完成的回调,就不操作这个回调函数了'
return Response('ok', content_type='text/plain')
except Exception as _:
#回调函数没有携带上对应的录制的视频的信息时,则不操作
return Response('ok', content_type='text/plain')
#2、将视频下载到本地服务器保存起来
VideoUrl = vedio_info.get('VideoUrl')
filename = vedio_info.get('CacheFile')
ret_path = download_tencent_dvr(VideoUrl,filename)
print(ret_path,'是保存到本地的路径,后续存到数据库就可以了')
#3、删除保存在腾讯云上的录制视频(保存是需要收费的)
file_id = video_info.get('FileId')
delete_tencent_video(file_id)
return Response('ok',content_type='text/plain')