0

我将一些ffmpeg视频处理功能包装为openfaas处理程序。

我所有的功能(bash 脚本)在本地都可以正常工作。

部署的功能适用于小视频文件(< 40MB),但不适用于较大的视频(测试 100MB 文件)

我使用 nginx 作为代理。

NGINX 配置:

    ...
    location / {
      proxy_read_timeout 1800;
      proxy_connect_timeout 1800;
      proxy_send_timeout 1800;
      send_timeout 1800;

      client_max_body_size 2G;
      proxy_pass http://127.0.0.1:8080;
    }
    ...

功能视频预览/处理程序:

#!/usr/bin/env bash

# Create a temporary filename
r=`date +%s%N`
IN=/tmp/$r.in.mov
OUT=/tmp/$r.out.mp4

SCRIPT_DIR=$( cd -- "$( dirname -- "${BASH_SOURCE[0]}" )" &> /dev/null && pwd )

WM=${SCRIPT_DIR}/wmark-nologo-preview.png

# Save stdin to a temp file
cat - > ${IN}

# creates a mp4 version of the mov src,
# with slight cropping on the sides to avoid
# black bars, and max limits to 1280x720
# no padding applied. deinterlaces.

ffmpeg -y -threads 1 -thread_queue_size 32768 -loglevel error -ss 0 -i ${IN} -vcodec libx264 -b:v 2500k -ar 44100 -ab 160k -g 75 -s hd720 -vf "crop=38/40*in_w:38/40*in_h [cr],movie=${WM} [wmark]; [cr][wmark] overlay=main_w-overlay_w:0 ,yadif" -hide_banner ${OUT} 2> /dev/null

cat ${OUT}

# After printing to stdout, the client has received the data via streaming
# Now we delete the temporary file
rm ${IN}
rm ${OUT}

开放式faas yaml:

version: 1.0
provider:
  name: openfaas
  gateway: https://my.faas.domain
functions:
   video-preview:
     lang: bash-streaming
     handler: ./video-preview
     image: *****/video-preview
     build_args:
       ADDITIONAL_PKG: ffmpeg
     environment:
       write_timeout: 30m
       read_timeout: 30m
       exec_timeout: 30m

我成功地在本地测试了该功能:

cat /path/to/input/video.mov | ./video-preview/handler.sh > /path/to/output/video-preview.mp4

curl -kSLsf https://my.faas.domain/function/video-preview --data-binary "@/path/to/input/video.mov" > /path/to/output/video-preview.mp4

部署的函数适用于小视频,但较大的视频返回 502 Bad gateway失败。

功能正在部署到具有2vCPU2G 内存的 DigitalOcean 虚拟服务器。

我的猜测是该函数正在使用 100% 的 CPU 资源并重新启动 docker 容器,导致 502 错误。

我怎样才能防止这种情况?

4

0 回答 0