如何在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
相关产品推荐
相关产品推荐

