将 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输出
freeze_start
到stderr
,当前日期显示在shell并写入freeze_start.log
- 问题: 一些进程 ID 被写入
pid.log
。不是 ffmpeg
进程的进程 ID。
如何使用 &
检索 ffmpeg
的进程 ID,同时仍然能够在管道 stderr
上使用 while read
?
我可以把 &
放在哪里才能让它工作?
当我将 &
添加到 ...-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
我可以将 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输出
freeze_start
到stderr
,当前日期显示在shell并写入freeze_start.log
- 问题: 一些进程 ID 被写入
pid.log
。不是ffmpeg
进程的进程 ID。
如何使用 &
检索 ffmpeg
的进程 ID,同时仍然能够在管道 stderr
上使用 while read
?
我可以把 &
放在哪里才能让它工作?
当我将 &
添加到 ...-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