删除媒体文件

更新时间:
复制 MD 格式

当需要管理存储成本、清理过期或违规内容时,可以使用视频点播的删除功能。本文介绍不同类型的删除操作及其影响,并提供通过控制台和 API/SDK 安全、高效地删除媒体文件的具体指引。

工作原理

在执行删除操作前,请务必理解其工作机制与潜在风险,以避免不可逆的数据丢失。

警告

所有删除操作均为物理删除,文件和关联的媒资信息将被永久移除,无法恢复。若需备份请参考点播资源迁移。

删除类型

删除内容

播放影响

完整音视频

源文件、所有转码流、封面截图、雪碧图。

无法播放。

音视频流

指定清晰度的转码文件。

该清晰度无法播放,可能导致播放器报错。

源文件

原始上传文件

原画无法播放。

图片

图片文件。

作为封面的视频将无法显示封面。

说明
  • 删除点播媒体文件后,CDN节点的缓存不会被自动清除,可通过点播控制台的刷新功能,来清除CDN节点上的垃圾数据,详情请参见刷新预热。

  • 删除音视频源文件时,若文件采用不转码即分发方式上传(作为原画播放流),则默认不可删除;如需删除,需通过调用批量删除音视频源文件并指定Force参数。

场景一:通过控制台删除

手动删除少量文件

控制台提供了直观的界面,适用于删除少量文件。

  1. 登录视频点播控制台。

  2. 在左侧导航栏选择媒资库,单击音/视频、图片或短视频素材,进入管理页面。

  3. 在管理页面,单击目标文件操作列的删除。

通过媒资策略批量删除文件

当需要清理的音视频数量较多、删除效率过低时,可以创建媒资删除策略,由系统按照指定的上传时间、存储时长和媒资分类等条件自动批量删除。

重要
  • 媒资删除策略仅对视频点播系统存储生效,且仅支持存储类型为标准存储的音视频文件。删除策略不会对存储时长小于7天的音视频进行删除。

  • 北京时间每日0点至24点,将根据音视频的上传时间执行生效策略。每条策略每日的执行上限为5万条音视频任务,超过此上限的部分将在次日继续执行。

  • 媒资删除策略最多可配置五条。当一个音视频同时满足多个策略时,仅会执行优先级最高的策略。

  • 策略启用后将按条件自动删除音视频,删除后不可恢复。请在启用前确认策略的时间条件、分类条件和删除配置。

  1. 登录视频点播控制台。

  2. 在左侧导航栏继续选择配置管理 > 媒资管理配置 > 存储策略,进入到存储策略页面。

  3. 单击策略管理标签页下的创建策略,进入新建策略页面,配置策略相关参数。

    参数名称

    描述

    媒体时间条件

    • 指定时间上传:将对在指定起止时间内符合策略条件的音视频进行批量删除。

    • 指定存储时长:将对超过指定存储时长且符合策略条件的音视频进行批量删除。

    媒体分类条件

    媒资删除策略所覆盖的媒资分类,最多可选择三个分类。媒资分类的具体介绍,请参见媒资分类。

    说明

    当前版本仅支持一级分类的操作。注意:删除一级分类时,系统不会级连删除其子分类中的媒资。

    存储类型

    固定值,仅支持存储类型为标准存储的音视频文件。

    存储bucket

    固定值,仅支持视频点播系统存储。

    删除配置

    • 全部媒资:包含媒资源文件和转码后的文件。

    • 仅媒体流(转码后文件):仅包含媒资转码后的文件。

    • 仅源文件:仅包含上传的媒资源文件。

    开始时间

    删除策略的启动时间。

    优先级

    数字越大,优先级越高;若优先级相同,则按创建时间执行,创建时间越早的优先级越高。

场景二:通过API/SDK删除

通过API/SDK删除媒体文件提供了更高的灵活性和自动化能力,是生产环境中管理大量媒资的首选方案。

说明
  • 请确保已安装相应语言的SDK,并已初始化客户端。详情请参见服务端SDK。

  • 调用API进行删除媒体文件时,需注意QPS限制。超出QPS限制时,API将调用报错,详情请参见流控信息。

删除单个或多个完整视频

说明
  • 单次最多支持删除 20 个视频。

  • 可通过媒体删除完成事件接受任务完成通知。

此操作为最常用场景,通过删除完整视频接口实现,会删除视频的所有相关资源,包括源文件、转码流和截图。代码示例如下:

from aliyunsdkvod.request.v20170321 import DeleteVideoRequest
from aliyunsdkcore.client import AcsClient
import json

def delete_video_safely(video_ids: str, access_key: str, secret_key: str, region='cn-shanghai'):
    """
    安全删除一个或多个视频。
    
    Args:
        video_ids: 视频ID,多个ID用逗号分隔。
        access_key: AccessKey ID。
        secret_key: AccessKey Secret。
        region: 地域。
    
    Returns:
        dict: 包含成功与否及错误信息的字典。
    """
    try:
        # 1. 初始化客户端
        client = AcsClient(access_key, secret_key, region)
        
        # 2. 创建删除请求
        request = DeleteVideoRequest.DeleteVideoRequest()
        request.set_VideoIds(video_ids)
        
        # 3. 执行删除
        response = client.do_action_with_exception(request)
        result = json.loads(response)
        
        print(f"视频 {video_ids} 删除请求提交成功。RequestID: {result.get('RequestId')}")
        return {"success": True, "data": result}
        
    except Exception as e:
        error_msg = str(e)
        print(f"删除失败: {error_msg}")
        
        # 常见错误处理
        if "InvalidVideo.NotFound" in error_msg:
            return {"success": False, "error": "视频不存在或已被删除。"}
        elif "Forbidden.IllegalStatus" in error_msg:
            return {"success": False, "error": "视频状态不允许删除,可能正在转码中。"}
        elif "Throttling" in error_msg:
            return {"success": False, "error": "请求过于频繁,请稍后重试。"}
        else:
            return {"success": False, "error": f"未知错误: {error_msg}"}

# 使用示例
# result = delete_video_safely(
#     video_ids="your-video-id-1,your-video-id-2",
#     access_key="your-access-key", 
#     secret_key="your-secret-key"
# )

删除指定清晰度的视频流

通过删除媒体流接口实现,当仅需移除某个清晰度,但保留其他清晰度时,可使用此功能。代码示例如下:

from aliyunsdkvod.request.v20170321 import DeleteStreamRequest
# ... (复用上面的 AcsClient 初始化)

def delete_specific_stream(video_id: str, job_ids: str, access_key: str, secret_key: str):
    """
    删除指定清晰度的转码流。
    
    Args:
        video_id: 视频ID。
        job_ids: 转码任务ID列表,多个用逗号分隔。
    """
    try:
        client = AcsClient(access_key, secret_key, 'cn-shanghai')
        request = DeleteStreamRequest.DeleteStreamRequest()
        request.set_VideoId(video_id)
        request.set_JobIds(job_ids)
        
        response = client.do_action_with_exception(request)
        print(f"视频 {video_id} 的指定清晰度流删除成功。")
        return json.loads(response)
        
    except Exception as e:
        print(f"删除流失败: {e}")
        raise

# 示例:假设已通过 GetPlayInfo 获得 '4K' 清晰度的 JobId 为 'job-id-for-4k'
# delete_specific_stream(
#     video_id="your-video-id",
#     job_ids="job-id-for-4k",
#     access_key="your-access-key",
#     secret_key="your-secret-key"
# )

强制删除源文件

通过批量删除音视频源文件接口实现。根据上传模式不同,删除行为有差异:

  • 开启转码:源文件(原画)与转码流分开存储,删除源文件保留已生成的转码流,转码流仍可正常播放。

  • 不转码即分发:原画即源文件本身,删除源文件等同于删除原画,将导致播放流消失且无法恢复。

代码示例如下:

重要
  • 转码模式:删除源文件后原画无法播放,但转码流不受影响,且删除后无法对该视频再次发起转码。

  • 不转码模式:删除源文件后原画(即源文件)被永久删除,所有播放流消失,无法恢复。请确认不再需要源文件后使用。

from aliyunsdkvod.request.v20170321 import DeleteMezzaninesRequest
# ... (复用上面的 AcsClient 初始化)

def force_delete_source_file(video_ids: str, access_key: str, secret_key: str):
    """
    强制删除源文件。
    
    Args:
        video_ids: 视频ID列表,多个用逗号分隔。
    """
    try:
        client = AcsClient(access_key, secret_key, 'cn-shanghai')
        request = DeleteMezzaninesRequest.DeleteMezzaninesRequest()
        request.set_VideoIds(video_ids)
        request.set_Force(True)  # 强制删除标识
        
        response = client.do_action_with_exception(request)
        print("源文件强制删除成功。")
        print("请立即刷新CDN缓存,避免原画播放出现404错误。")
        return json.loads(response)
        
    except Exception as e:
        print(f"强制删除失败: {e}")
        raise

# force_delete_source_file(
#     video_ids="your-video-id",
#     access_key="your-access-key",
#     secret_key="your-secret-key"
# )

强制删除源文件仅删除视频源文件(Mezzanine 文件),调用成功后接口返回成功,但视频占位符仍保留在媒资库音/视频列表中,接口返回成功不代表视频已从列表中移除。如需完全删除视频条目(从媒资库列表中移除),请调用DeleteVideo接口,该接口会删除完整视频,包括源文件、转码后的流文件、封面截图等。

删除图片文件

用于删除上传的图片或视频截图,通过删除图片或视频截图接口实现。