腾讯云-云点播:设置视频录制的回调函数,将腾讯录制的音频文件保存到本地中

使用场景:

我们在使用腾讯的云点播实现视频的录制功能时,需要将录制的视频保存到本地系统中时。

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')

你可能感兴趣的:(python,腾讯云)