了解使用 ffmpeg 将 rtmp 输入发送到 node.js 脚本的脚本

Understanding a script which uses ffmpeg to send rtmp input to node.js script

我试图理解 this shell 脚本,它使用 ffmpeg 获取 rtmp 输入流并将其发送到 node.js 脚本。但我无法理解语法。这是怎么回事?

脚本:

while :
do
  echo "Loop start"

  feed_time=$(ffprobe -v error -show_entries format=start_time -of default=noprint_wrappers=1:nokey=1 $RTMP_INPUT)
  printf "feed_time value: ${feed_time}"

  if [ ! -z "${feed_time}" ]
  then
  ffmpeg -i $RTMP_INPUT -tune zerolatency -muxdelay 0 -af "afftdn=nf=-20, highpass=f=200, lowpass=f=3000" -vn -sn -dn -f wav -ar 16000 -ac 1 - 2>/dev/null | node src/transcribe.js $feed_time

  else
  echo "FFprobe returned null as a feed time."
  
  fi

  echo "Loop finish"
  sleep 3
done
  • feed_time 变量表示 ffprobe 命令的标准输出。此值需要传递给 node 脚本。
  • - 字符在 bash 中没有特殊含义,即由 ffmpeg 命令本身解释(参见 here). According to ffmpeg docs:

A - character before the stream identifier creates a "negative" mapping. It disables matching streams from already created mappings.

  • 2>/dev/null 是一种重定向,它将 ffmpeg 命令的标准错误输出发送到 /dev/null 设备,从而有效地丢弃错误输出(参见 here)。这样做是因为您只想将标准输出(不是错误输出)传递给 node 脚本。
  • | 是一个管道。它将 ffmpeg 命令的标准输出发送到 node 脚本的标准输入。
  • sleep 只是延迟脚本的执行。