bash:显示过滤后的& ffmpeg的动态输出

时间:2014-07-03 07:59:27

标签: bash ffmpeg output

question之后,答案部分解决了我的问题。 我想有一个ffmpeg的选定结果。 所以,使用这个命令:

ffmpeg -y -i "${M3U2}" -vcodec copy -acodec copy "${Directory}/${PROG}_${ID}.mkv" 2>&1 | egrep -e '^[[:blank:]]*(Duration|Output|frame)'

结果是:

Duration: 00:12:28.52, start: 0.100667, bitrate: 0 kb/s
Output #0, matroska, to '/home/path/file.mkv':

但结果我错过了这条动态线:

frame= 1834 fps=166 q=-1.0 Lsize=    7120kB time=00:01:13.36 bitrate= 795.0kbits/s

此行每秒都会更改。如何修改命令行以显示此行?我的程序应该读取此行并显示" time"就地更新。感谢

的解决方案:

ffmpeg -y -i "${M3U2}" -vcodec copy -acodec copy "${Directory}/${PROG}_${ID}.mkv" 2>&1 |
      { while read line
        do
          if $(echo "$line" | grep -q "Duration"); then
            echo "$line"
          fi
          if $(echo "$line" | grep -q "Output"); then
            echo "$line"
          fi
          if $(echo "$line" | grep -q "Stream #0:1 -> #0:1"); then
            break
          fi
        done;
        while read -d $'\x0D' line
       do
          if $(echo "$line" | grep -q "time="); then
            echo -en "\r$line"
          fi
       done; }

感谢ofrommel

1 个答案:

答案 0 :(得分:1)

您需要使用CR(回车符)作为分隔符来解析输出,因为这是ffmpeg用于在同一行上打印的内容。首先使用另一个循环与常规分隔符迭代第一行以获得"持续时间"和"输出":

ffmpeg -y -i inputfile -vcodec copy -acodec copy outputfile 2>&1 |
{ while read line
  do
     if $(echo "$line" | grep -q "Duration"); then
        echo "$line"
     fi
     if $(echo "$line" | grep -q "Output"); then
        echo "$line"
     fi
     if $(echo "$line" | grep -q "Stream mapping"); then
        break
     fi
  done;
  while read -d $'\x0D' line
  do
     if $(echo "$line" | grep -q "time="); then
        echo "$line" | awk '{ printf "%s\r", $8 }'
     fi
  done; }