Encoding 在Powershell中,如何选择字符串的不同部分并将其分别输出到变量中,并将其显示在行中?

Encoding 在Powershell中,如何选择字符串的不同部分并将其分别输出到变量中,并将其显示在行中?,encoding,ffmpeg,io-redirection,powershell-core,redirectstandardoutput,Encoding,Ffmpeg,Io Redirection,Powershell Core,Redirectstandardoutput,我试图为FFmpeg创建一个进度条,很像python的FFpb,我已经做了足够多的工作,可以将FFmpeg的输出捕获到variable中,并将所需的信息保存到variable中,但只能在它结束之后 此命令将FFmpeg输出的每一行作为对象保存到$RedirectOutput变量中: $RedirectOutput=ffmpeg.exe-y-v quiet-stats-hide_banner-hwaccel cuda-i'input'-c:v hevc\u invenc-preset slow-c

我试图为FFmpeg创建一个进度条,很像python的FFpb,我已经做了足够多的工作,可以将FFmpeg的输出捕获到variable中,并将所需的信息保存到variable中,但只能在它结束之后

此命令将FFmpeg输出的每一行作为对象保存到
$RedirectOutput
变量中:

$RedirectOutput=ffmpeg.exe-y-v quiet-stats-hide_banner-hwaccel cuda-i'input'-c:v hevc\u invenc-preset slow-crf 18-an-t 300'output'2>&1
$RedirectOutput
然后变为:

frame=  124 fps=0.0 q=14.0 size=     768kB time=00:00:04.03 bitrate=1559.9kbits/s speed=8.04x
frame=  480 fps=479 q=14.0 size=    3840kB time=00:00:15.90 bitrate=1978.5kbits/s speed=15.9x
frame=  865 fps=576 q=17.0 size=    7424kB time=00:00:28.73 bitrate=2116.6kbits/s speed=19.1x
frame= 1256 fps=627 q=17.0 size=   10496kB time=00:00:41.76 bitrate=2058.7kbits/s speed=20.9x
frame= 1698 fps=678 q=16.0 size=   14080kB time=00:00:56.50 bitrate=2041.5kbits/s speed=22.6x
frame= 2074 fps=691 q=16.0 size=   17152kB time=00:01:09.03 bitrate=2035.4kbits/s speed=  23x
frame= 2515 fps=718 q=16.0 size=   20992kB time=00:01:23.73 bitrate=2053.7kbits/s speed=23.9x
frame= 2972 fps=742 q=18.0 size=   25088kB time=00:01:38.96 bitrate=2076.7kbits/s speed=24.7x
frame= 3404 fps=755 q=18.0 size=   28928kB time=00:01:53.36 bitrate=2090.4kbits/s speed=25.2x
...
在这里,我将每个必要的信息保存到各自的变量中:

$videoFps     = $RedirectOutput -replace "(frame=)(\s+)?(\d+)(.*)", "$3"
$videoFps     = $RedirectOutput -replace "(.*)(fps=)(\d+)(.*)", "$3"
$videoSpeed   = $RedirectOutput -replace "(.*)(speed=)(\d+.*)x", "$3"
$videoBitrate = $RedirectOutput -replace "(.*)(bitrate=)(\d+)(.*)", "$3"
既然已经创建了阵列,我就需要定期地将它们以格式化的方式(我最终会弄清楚)写入控制台,因为FFmpeg转换正在运行(而不是在它完成时),并且是以单列形式,但我不知道如何继续

我是否将FFmpeg的输出保存到一个文件而不是一个变量,并尝试从中读取?如果是这样,我在每次书写后如何阅读?使用
while
循环

这不是一个性能问题吗?我不得不说,目前这不是我很关心的问题。只想让它工作。

…每次写完后我怎么读?使用循环:

输出(源自给定的
$RedirectOutput
数据,progressbar示例省略:):

…每次写完后我怎么读?使用循环:

输出(源自给定的
$RedirectOutput
数据,progressbar示例省略:):


当然我真不敢相信这件事竟发生在我头上!谢谢当然我真不敢相信这件事竟发生在我头上!谢谢
ffmpeg.exe -y -v quiet -stats -hide_banner -hwaccel cuda -i 'input' -c:v hevc_nvenc -preset slow -crf 18 -an -t 300 'output' 2>&1 |
ForEach-Object {
  $lineData = [psCustomObject]@{
    videoFrame   = $_ -replace "(frame=)(\s+)?(\d+)(.*)", '$3'
    videoFps     = $_ -replace "(.*)(fps=)(\d+)(.*)", '$3'
    videoSpeed   = $_ -replace "(.*)(speed=\s*?)(\d+.*)x", '$3'
    videoBitrate = $_ -replace "(.*)(bitrate=)(\d+)(.*)", '$3'
  }
  $lineData | Select-Object -Property video*
  Write-Progress -Activity "ffmpeg in progress: Bitrate=$($lineData.videoBitrate), Fps=$($lineData.videoFps)" -CurrentOperation "" -PercentComplete $lineData.videoSpeed -Status "Frame $($lineData.videoFrame)"
}
D:\PShell\SO\61971642.ps1
videoFrame videoFps videoSpeed videoBitrate
---------- -------- ---------- ------------
124        0        8.04       1559        
480        479      15.9       1978        
865        576      19.1       2116        
1256       627      20.9       2058        
1698       678      22.6       2041        
…