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

阿里云国内75折 回扣 微信号:monov8
阿里云国际,腾讯云国际,低至75折。AWS 93折 免费开户实名账号 代冲值 优惠多多 微信号:monov8 飞机:@monov6

使用场景

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

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

阿里云国内75折 回扣 微信号:monov8
阿里云国际,腾讯云国际,低至75折。AWS 93折 免费开户实名账号 代冲值 优惠多多 微信号:monov8 飞机:@monov6