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

在AWS Lambda中使用Python与FFprobe获取视频尺寸失败求助

解决AWS Lambda中Python调用FFprobe获取视频尺寸无日志/代码不执行问题

核心排查方向

你的问题大概率出在Lambda环境缺少FFprobe二进制文件或者代码未捕获异常导致静默失败,以下是具体解决步骤:


1. 先确认Lambda环境是否有FFprobe

默认Lambda的Python运行时不带FFmpeg/FFprobe工具,直接调用会触发报错,但如果代码没加异常捕获,会直接终止执行,不会走到打印语句。

解决方法:

  • 准备适配Lambda架构(x86_64或arm64)的FFprobe二进制文件:Lambda基于Amazon Linux 2,不能用本地Windows/macOS的二进制,需要下载/编译对应系统版本的文件。
  • 两种部署方式:
    • 直接打包:把FFprobe和代码放在同一目录,压缩成zip上传到Lambda,代码里用相对路径(比如./ffprobe)调用。
    • 使用Layer:把FFprobe放到Layer的bin目录,创建Layer后关联到Lambda,调用路径用/opt/bin/ffprobe。

2. 给代码加异常捕获,暴露错误日志

原来的代码没处理异常,出错后直接静默终止,CloudWatch看不到报错信息。修改代码,捕获所有异常并打印:

import subprocess
import os
import json

def lambda_handler(event, context):
    # 先验证S3下载的文件是否存在
    source_file = '/tmp/source.mp4'
    if not os.path.exists(source_file):
        print("错误:/tmp目录下找不到source.mp4文件")
        return {"statusCode": 400, "body": "文件不存在"}
    
    # 指定FFprobe路径(根据部署方式调整)
    ffprobe_path = '/opt/bin/ffprobe'  # 用Layer的情况
    # ffprobe_path = './ffprobe'  # 直接打包的情况

    try:
        # 调用FFprobe获取视频宽高
        result = subprocess.run(
            [
                ffprobe_path,
                '-v', 'error',
                '-select_streams', 'v:0',
                '-show_entries', 'stream=width,height',
                '-of', 'json',
                source_file
            ],
            capture_output=True,
            text=True,
            check=True
        )

        # 解析输出
        video_data = json.loads(result.stdout)
        width = video_data['streams'][0]['width']
        height = video_data['streams'][0]['height']

        print(f'The dimensions of x are {width}')
        return {"statusCode": 200, "body": f"宽:{width},高:{height}"}
    
    # 捕获FFprobe执行错误
    except subprocess.CalledProcessError as e:
        print(f"FFprobe执行错误:{e.stderr}")
        return {"statusCode": 500, "body": f"FFprobe失败:{e.stderr}"}
    # 捕获其他所有异常
    except Exception as e:
        print(f"通用错误:{str(e)}")
        return {"statusCode": 500, "body": f"错误:{str(e)}"}

3. 额外优化点

  • 调高Lambda内存:FFprobe处理视频需要一定内存,默认128MB可能不够,建议调到256MB或更高。
  • 延长超时时间:如果视频文件较大,FFprobe处理耗时可能超过默认3秒,在Lambda配置里把超时时间调到10秒以上。
  • 验证文件权限:Lambda的/tmp目录权限是777,一般没问题,但可以在下载后打印os.stat(source_file)确认文件权限正常。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.23 07:43:24