如何用管道输出avconv

Lui*_*ado 3 pipe 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 上测试

hyt*_*omo 6

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

例如:

avconv -i 111.avi 2>&1 | grep Duration
Run Code Online (Sandbox Code Playgroud)

正确输出:

  Duration: 00:01:05.02, start: 0.000000, bitrate: 2910 kb/s
Run Code Online (Sandbox Code Playgroud)

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

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

stderr 和 stdout 都存在也不错,因为您可以按照自己的方式过滤输出。例如,请考虑以下情况:

command > log.txt 2> error_log.txt
Run Code Online (Sandbox Code Playgroud)

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

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