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

boto3上传10GB视频至S3仅传元数据,无报错问题求助

排查K8s中FFmpeg转码后S3上传不完整的问题

问题场景

在Kubernetes集群的HTTP微服务中运行以下代码:通过FFmpeg子进程处理视频,将输出管道直接传输给boto3的upload_fileobj接口。处理20MB小视频时能完整上传至S3且无报错,但处理10GB大视频时,任务无异常结束却仅上传约640B的元数据。本地16GB内存机器运行该代码无问题。

session = boto3.session.Session(
      aws_access_key_id=aws_access_key_id,
      aws_secret_access_key=aws_secret_access_key,
      region_name="eu-west-2")
client = session.client('s3')

input_url = client.generate_presigned_url(
  'get_object',
  Params={
    'Bucket': aws_s3_bucket,
    'Key': inputFile
  }
)
with (
  ffmpeg
  .input(input_url)
  .filter("v360", inputProjection, outputProjection, in_stereo=inputStereo, out_stereo=outputStereo)
  .output('pipe:', format=outputFormat)
  .run_async(pipe_stdout=True)
).stdout as dataStream:
   client.upload_fileobj(dataStream, aws_s3_bucket, outputFile)

排查方法

  • 检查Pod资源限制:大视频转码时FFmpeg会占用大量CPU和内存,若Pod的resources.limits设置过小,可能触发OOM被K8s杀死,导致FFmpeg进程提前退出,管道传输中断。用kubectl describe pod <你的Pod名>查看Events里是否有OOMKilled记录,或kubectl top pods监控资源峰值,确认是否需要调高内存/CPU限制。
  • 捕获FFmpeg错误输出:当前代码只读取了FFmpeg的stdout,忽略了stderr。大视频处理时FFmpeg可能因网络拉取失败、滤镜参数错误等异常退出,但无错误日志。修改代码捕获stderr:
    process = (
      ffmpeg
      .input(input_url)
      .filter("v360", inputProjection, outputProjection, in_stereo=inputStereo, out_stereo=outputStereo)
      .output('pipe:', format=outputFormat)
      .run_async(pipe_stdout=True, pipe_stderr=True)
    )
    with process.stdout as dataStream:
        client.upload_fileobj(dataStream, aws_s3_bucket, outputFile)
    # 读取并打印错误信息
    stderr = process.stderr.read()
    if stderr:
        print(f"FFmpeg错误: {stderr.decode()}")
    
    查看是否有转码过程中的报错信息。
  • 强制FFmpeg刷新输出缓冲:FFmpeg的stdout默认有缓冲,若进程意外退出,缓冲区数据可能未写入管道。给FFmpeg添加-flush_packets 1参数强制实时刷新:
    .output('pipe:', format=outputFormat, flush_packets=1)
    
  • 检查boto3上传配置:确认upload_fileobj的分块上传逻辑是否正常。大文件建议显式配置分块阈值,避免因流中断导致仅上传部分数据:
    from boto3.s3.transfer import TransferConfig
    
    config = TransferConfig(multipart_threshold=10*1024*1024)  # 10MB以上启用分块
    client.upload_fileobj(dataStream, aws_s3_bucket, outputFile, Config=config)
    
    同时可以在上传后校验S3文件大小,若不符合预期则抛出异常。
  • 排查网络稳定性:FFmpeg通过预签名URL拉取S3大文件时,若K8s集群到S3的网络存在丢包或中断,会导致FFmpeg进程终止。可以在Pod内用curl测试拉取完整的10GB文件,确认网络是否稳定;若使用VPC endpoint访问S3,检查endpoint的日志和状态。
  • 检查HTTP请求超时:如果视频处理逻辑是在HTTP请求上下文内执行,Ingress或微服务本身的超时设置可能小于大视频处理时间,导致请求被强制断开,FFmpeg子进程随之终止。检查Ingress的nginx.ingress.kubernetes.io/proxy-read-timeout等超时参数,或服务内部的请求超时配置。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.29 09:46:26