【问题标题】:Large file upload to Video Indexer through python大文件通过python上传到视频索引器
【发布时间】:2023-03-13 06:53:02
【问题描述】:

我正在尝试通过 Video Indexer API 上传一个大视频(大约 1.5 GB)。但是,我的机器为此占用了大量 RAM。部署系统具有相当少量的 RAM。我想使用 API 以便在不占用太多内存的情况下分多个部分上传视频(大约 100MB 就足够了)。

我尝试使用 ffmpeg 将视频分割成块并逐块上传,但 Video Indexer 将它们识别为不同的视频,并为每个视频提供单独的见解。如果视频能在线汇总就更好了。

如何将分块视频上传到 MS Video Indexer?

【问题讨论】:

    标签: python http-post microsoft-cognitive video-indexer


    【解决方案1】:

    让我猜。之前,您按照官方教程Tutorial: Use the Video Indexer APIUpload Video API 参考(API 参考页末尾的Python 示例代码,如下图)上传您的大视频。

    由于下面的代码发送从内存读取的数据块{body},它的内存消耗很大,其值来自代码open("<your local file name>").read()

    conn.request("POST", "/{location}/Accounts/{accountId}/Videos?name={name}&accessToken={accessToken}&%s" % params, "{body}", headers)
    

    但是,如果您仔细阅读文档Upload and index your videosvideoUrl 小节和以下C# 代码,甚至API 参考中对videoUrl 的解释,您会看到视频文件作为multipart/form 正文传递内容不是唯一的方法。

    videoUrl

    要编入索引的视频/音频文件的 URL。 URL 必须指向媒体文件(不支持 HTML 页面)。该文件可以通过作为 URI 的一部分提供的访问令牌来保护,并且为该文件提供服务的端点必须使用 TLS 1.2 或更高版本进行保护。 URL 需要编码。

    如果未指定 videoUrl,视频索引器希望您将文件作为多部分/表单正文内容传递。

    带有videoUrl的C#代码截图

    API 参考中videoUrl 参数的截图

    您可以先通过Python streaming upload codeazcopyAzure Storage Explorer等其他工具将大型视频文件上传到Azure Blob Storage或其他满足videoUrl要求的在线服务,然后以Azure Blob Storage为例生成带有 sas 令牌的 blob url(Python 代码如下)将其作为 videoUrl 传递给 API 请求以进行上传。

    使用 sas 令牌生成 blob url 的 Python 代码

    from azure.storage.blob.baseblobservice import BaseBlobService
    from azure.storage.blob import BlockBlobService, BlobPermissions
    from datetime import datetime, timedelta
    
    account_name = '<your account name>'
    account_key = '<your account key>'
    container_name = '<your container name>'
    blob_name = '<your blob name>'
    service = BaseBlobService(account_name=account_name, account_key=account_key)
    
    token = service.generate_blob_shared_access_signature(container_name, blob_name, BlobPermissions.READ, datetime.utcnow() + timedelta(hours=1),)
    blobUrlWithSas = f"https://{account_name}.blob.core.windows.net/{container_name}/{blob_name}?{token}"
    

    希望对你有帮助。

    【讨论】:

    • 嗨,这绝对是一个选项,但我们不能通过分块传输编码发送视频吗?
    • @gPats 您不能通过分块传输编码将视频发送到视频索引 API,但您可以将其分块传输到 Azure Blob 存储。请参考 BlockBlob 的 REST API:Put BlockPut Block List 并使用它们的相关 Python API。
    猜你喜欢
    • 2018-04-21
    • 2020-07-29
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-03-04
    • 1970-01-01
    • 2012-08-22
    • 2020-04-27
    相关资源
    最近更新 更多