You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何在FFmpeg命令中将输出直接写入Azure Blob存储

解决方案:将FFmpeg处理结果直接写入Azure Blob存储

要避免Azure Function本地存储空间不足的问题,核心思路是让FFmpeg直接将处理后的视频输出到标准输出(stdout),再通过Azure Blob存储SDK将这个字节流直接上传到Blob容器,全程不落地本地文件。

关键步骤与代码实现

1. 依赖准备

在Function的requirements.txt中添加Azure Blob存储SDK:

azure-storage-blob>=12.0.0

2. 修改FFmpeg命令与流处理逻辑

使用管道(pipe)替代本地文件作为FFmpeg的输入输出,结合Blob SDK实现流式上传:

import os
import subprocess
from azure.storage.blob import BlobServiceClient

def main(queue_item: str):
    # 从队列项中解析输入/输出Blob名称(根据你的队列消息格式调整)
    input_blob_name = "input.mp4"
    output_blob_name = "output_scaled.mp4"
    
    # 初始化Blob存储客户端
    conn_str = os.environ["AZURE_STORAGE_CONNECTION_STRING"]
    blob_service_client = BlobServiceClient.from_connection_string(conn_str)
    container_client = blob_service_client.get_container_client("your-container-name")  # 替换为你的容器名称
    
    # 获取输入Blob的流(无需下载到本地)
    input_blob_client = container_client.get_blob_client(input_blob_name)
    input_stream = input_blob_client.download_blob()
    
    # 构建FFmpeg命令:从stdin读输入,输出到stdout(流式MP4格式)
    ffmpeg_cmd = [
        "ffmpeg",
        "-i", "pipe:0",  # 从标准输入读取源视频
        "-filter_complex", "scale=1920:1080:force_original_aspect_ratio=decrease,pad=1920:1080:-1:-1,setsar=1,fps=25",
        "-c:v", "libx264",
        "-c:a", "aac",
        "-preset:v", "ultrafast",
        "-f", "mp4",
        "-movflags", "frag_keyframe+empty_moov",  # 生成可流式上传的MP4(必须参数)
        "-"  # 输出到标准输出
    ]
    
    # 启动FFmpeg进程,处理双向流
    process = subprocess.Popen(
        ffmpeg_cmd,
        stdin=subprocess.PIPE,
        stdout=subprocess.PIPE,
        stderr=subprocess.STDOUT
    )
    
    try:
        # 将输入Blob流写入FFmpeg的stdin
        input_stream.readinto(process.stdin)
        process.stdin.close()
        
        # 将FFmpeg的stdout流直接上传到Blob
        output_blob_client = container_client.get_blob_client(output_blob_name)
        output_blob_client.upload_blob(
            process.stdout,
            blob_type="BlockBlob",
            overwrite=True
        )
        
        # 检查FFmpeg执行状态
        return_code = process.wait()
        if return_code != 0:
            error_log = process.stdout.read().decode()
            raise Exception(f"FFmpeg处理失败,返回码:{return_code},日志:{error_log}")
    finally:
        # 确保流资源释放
        if process.stdin:
            process.stdin.close()
        if process.stdout:
            process.stdout.close()

3. 配置与权限

  • 在Function App的配置中添加环境变量AZURE_STORAGE_CONNECTION_STRING,值为你的Blob存储账户连接字符串。
  • 确保Function的托管标识(或连接字符串中的密钥)拥有目标Blob容器的写入权限。

核心要点说明

  • 管道输入输出:用pipe:0让FFmpeg从标准输入读取源视频,-让FFmpeg输出到标准输出,全程不生成本地文件。
  • 流式MP4参数:-movflags frag_keyframe+empty_moov是关键,它让FFmpeg生成可分段的MP4文件,支持边处理边上传,无需等待整个视频处理完成。
  • 资源释放:必须确保FFmpeg进程的输入输出流被正确关闭,避免资源泄漏。

内容的提问来源于stack exchange,提问作者Hunzla Ali

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.22 17:12:22