我可以重定向 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
结果:freeze_start
至stderr
, 当前日期显示在 shell 中并写入 freeze_start.log
pid.log
.不是 ffmpeg
的进程 ID过程。 如何检索
ffmpeg
的进程 ID 为 &
同时仍然可以使用 while read
在管道上 stderr
? 我在哪里可以放置
&
为了使这项工作?当我添加
&
至...-f null -& 2>&1 | while...
结果是:ffmpeg
的正确进程 ID进程写入pid.log
.freeze_start.log
未创建。我猜 &
干扰 IO 重定向。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
您可以轻松创建输入
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
关于bash - 将 ffmpeg (stderr) 输出重定向到 WHILE READ & 检索进程 ID,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/70918755/