将 ffmpeg (stderr) 输出重定向到 WHILE READ 并检索进程 ID

redirect ffmpeg (stderr) output to WHILE READ & retrieve Process ID

我可以将 ffmpeg 的 stderr 重定向到 while read:

ffmpeg -stream_loop -1 -re -i colors.mp4 -vf freezedetect=n=-20dB:d=2 \
-f null - 2>&1 | while read line; \
do if [[ $line =~ "freeze_start" ]] ;\
then echo [`date`] >> freeze_start.log ;\
echo [`date`] ;\
fi ; done;\
echo $! > pid.log

结果:

如何使用 & 检索 ffmpeg 的进程 ID,同时仍然能够在管道 stderr 上使用 while read

我可以把 & 放在哪里才能让它工作?

当我将 & 添加到 ...-f null -& 2>&1 | while... 时,结果是:

您可以轻松创建输入 colors.mp4:

ffmpeg -f lavfi -i color=c=red -frames:v 1 color001.jpg && \
ffmpeg -f lavfi -i color=c=green -frames:v 1 color002.jpg && \
ffmpeg -f lavfi -i color=c=blue -frames:v 1 color003.jpg && \
ffmpeg -framerate 1/5 -i color%03d.jpg -c:v libx264 -r 30 -pix_fmt yuv420p colors.mp4

您可以在整个管道的末尾放置一个 & 并使用 jobs -p 检索管道中第一个命令的 PID(这里不使用 $! 因为它会给你管道中最后一个命令的 PID):

#!/bin/bash

ffmpeg -stream_loop -1 -re -i colors.mp4 -vf freezedetect=n=-20dB:d=2 -f null - 2>&1 |
while IFS='' read -r line
do
    [[ $line =~ "freeze_start" ]] && echo "[$(date)]"
done |
tee -a freeze_start.log &

# showing what is what:
ps -f $(jobs -p) $!

# this one is ffmpeg's PID
jobs -p > pid.log

# wait for completion
wait