为什么grep | sed什么也不做?

为什么grep | sed什么也不做?

我一直在尝试铺设两层深度的管道。

我可以成功管道:

  1. ffmpeg | grep
  2. ffmpeg | sed

我不会吹管

  1. ffmpeg | grep | sed
  2. ffmpeg | sed | grep

我不明白,ffmpeg 是否限制链中只有一个管道?

此代码有 2 个管道且无错误,但没有输出:

ffmpeg -i "https://17563.live.streamtheworld.com/WETAFM.mp3?nocache=Ag6q8pw2" -af silencedetect=n=-10dB:d=0.5 -f null - 2>&1 | grep silence_duration | sed "s/.*silence_duration: \(.*\).*/\1/"

预期输出:

2.06442
0.719252
0.594036
0.562698
0.500295

此代码使用 1 个管道具有正确的输出:

ffmpeg -i "https://17563.live.streamtheworld.com/WETAFM.mp3?nocache=Ag6q8pw2" -af silencedetect=n=-10dB:d=0.5 -f null - 2>&1 | grep silence_duration

输出:

[silencedetect @ 0000018027f9bd00] silence_end: 2.06442 | silence_duration: 2.06442
[silencedetect @ 0000018027f9bd00] silence_end: 3.45971 | silence_duration: 0.719252
[silencedetect @ 0000018027f9bd00] silence_end: 7.04399 | silence_duration: 0.594036
[silencedetect @ 0000018027f9bd00] silence_end: 7.81501 | silence_duration: 0.562698
[silencedetect @ 0000018027f9bd00] silence_end: 9.05535 | silence_duration: 0.500295

此代码使用 1 个管道具有正确的输出:

ffmpeg -i "https://17563.live.streamtheworld.com/WETAFM.mp3?nocache=Ag6q8pw2" -af silencedetect=n=-10dB:d=0.5 -f null - 2>&1 | sed "s/.*silence_duration: \(.*\).*/\1/"

输出:

[silencedetect @ 000001a48277b980] silence_start: 0
2.06442
[silencedetect @ 000001a48277b980] silence_start: 2.74045
0.719252
[silencedetect @ 000001a48277b980] silence_start: 6.44995
0.594036
[silencedetect @ 000001a48277b980] silence_start: 7.25231
0.562698
[silencedetect @ 000001a48277b980] silence_start: 8.55506
0.500295

答案1

为什么grep | sed什么也不做?

是的,但你没有等待它。如果你按下,qffmpeg 将关闭流,silence_duration值将显示出来。

如果您希望它立即打印值,awk则可以使用一种方法。

如何隔离silence_duration值?

如果最终目标是隔离silence_duration值使用awk

ffmpeg -i "https://17563.live.streamtheworld.com/WETAFM.mp3?nocache=Ag6q8pw2" -af silencedetect=n=-10dB:d=0.5 -f null - 2>&1 |  awk -F ': ' '/silence_duration/ {print $3}'

结果:

2.06442
0.719252
0.594036
0.562698
0.663968
1.24109

不过,我更喜欢使用(a)元数据使用支持元数据键的过滤器进行过滤。它更复杂,但输出更清晰,更容易解析。您可以轻松地通过管道传输信息(file=-)或直接输出到文件(file=silence.log):

ffmpeg -loglevel error -i "https://17563.live.streamtheworld.com/WETAFM.mp3?nocache=Ag6q8pw2" -af silencedetect=n=-10dB:d=0.5,ametadata=mode=print:key=lavfi.silence_duration:file=- -f null - | awk -F = '/silence_duration/ {print $2}'

相关内容