如何用管道输出 avconv

如何用管道输出 avconv

我正在尝试将 avconv 的输出通过管道传输到 grep,但不知何故管道无法正常工作。以下方法不起作用:

avconv -i MOVIE.mkv | grep SOMETHING- 它应该只显示 avconv 中包含某些内容的行。

avconv -i MOVIE.mkv pipe: | grep SOMETHING- 它应该只显示 avconv 中包含某些内容的行。

avconv -i MOVIE.mkv pipe:1 | grep SOMETHING- 它应该只显示 avconv 中包含某些内容的行。

我如何将 avconv 的信息输出到管道?

为什么它不起作用?

管道传输类似这样的工作,但-i信息参数却不行:avconv -codecs | grep "264"

在 12.04 和 12.10 上测试

答案1

我是 Format Junkie 的开发人员之一,所以我知道 avconv 的工作原理,我向你保证它会将所有重要数据发送到 stderr。因此,你需要从 stderr 进行 grep。实际上,你将所有 stderr 重定向到 stdout,然后进行 grep:

例如:

avconv -i 111.avi 2>&1 | grep Duration

正确输出:

  Duration: 00:01:05.02, start: 0.000000, bitrate: 2910 kb/s

grep 仅在 avconv 的某些输出中起作用的原因是,此特定输出被提供给 stdout,而不是 stderr,因此它被成功传输到 grep。

通常使用 stderr 来输出错误消息,使用 stdout 来输出正常信息消息。

stderr 和 stdout 同时存在并不坏,因为您可以按照自己想要的方式过滤输出。例如,考虑以下内容:

command > log.txt 2> error_log.txt

这会将所有正常输出(stdout)输出到 log.txt,并将所有错误(stderr)输出到 error_log.txt

但我不知道为什么 avconv 专门使用 stderr 来显示其消息。

相关内容