将 FFMPEG 作为后台作业运行

将 FFMPEG 作为后台作业运行

我有一个命令可以从视频中提取音频。如果我通过 CLI 或 Powershell 窗口将其作为一行输入,则运行正常。但是,我尝试将其作为后台任务运行(以便初始任务在 FFMPEG 工作时运行进度条)

有人建议使用 Start-Job / ScriptBlock,并使用“do -> Until”循环,检查 $job.State “Completed”,这会执行一些操作……但半秒后立即返回“Completed”(而真正的过程大约需要 15 秒)

我在网上看到一个可能的原因是 FFMPEG 通过 STDIN 获取命令输入(这就是为什么从命令行输入是可以的),并使用 -nostdin 禁用它。

但由于我对 Powershell 或 FFMPEG 了解甚少,我不知道如何将所有这些代码片段结合在一起。有什么建议吗?(注:我正要看看我是否可以将作业传送到 STDIN,这可能会起作用)

function Extract(){
    $ProgressBar = New-Object System.Windows.Forms.ProgressBar
    $ProgressBar.Location = New-Object System.Drawing.Point(10, 35)
    $ProgressBar.Size = New-Object System.Drawing.Size(460, 40)
    $ProgressBar.Style = "Marquee"
    $ProgressBar.MarqueeAnimationSpeed = 20

    $main_form.Controls.Add($ProgressBar);

    $V2ALabel.Font = $procFont
    $V2ALabel.ForeColor = 'red'
    $V2ALabel.Text = "Processing ..."

    write-host 'starting the job'
    

#    $job = Start-Job -ScriptBlock $jobScript
#D:\home\cristofa\video_subs\captions\ffmpeg\ffmpeg.exe -i "K:\VE\Daisy VE.mp4" -c:a libmp3lame -q:a 4 "K:\VE\audio1.mp3"
#$ffpath="$ScriptDir\ffmpeg\ffmpeg.exe"
#$ArguementList='-i "{0}" -c:a libmp3lame -q:a 4 "{1}" -nostats -loglevel warning' -f $file, $saveOut
$ffpath="$ScriptDir\ffmpeg\ffmpeg.exe -nostdin -i {0} -c:a libmp3lame -q:a 4 {1} > output.log 2>&1 < /dev/null" -f $file, $saveOut
#$ArguementList="-i {0} -c:a libmp3lame -q:a 4 {1}" -f $file, $saveOut;
#write-host $ScriptDir
#write-host $ArguementList

#    $job=Start-Job -ScriptBlock{-filePath $ffpath -ArguementList $ArguementList}
# $job=Start-Job -ScriptBlock{-filepath $ffpath -arguementList $ArguementList}
$job=Start-Job -ScriptBlock{$ffpath}
 write-host $job.State;
    do {
     [System.Windows.Forms.Application]::DoEvents() 
     } 
#     until ($job.State -eq "Completed")
#       while($job.State -eq "Running")
  while($job.State -ne "Completed")

    if ($job.State -eq "Completed"){
       Remove-Job -Job $job -Force
    write-host 'about to end'
    $Script:ButtonAction='V2AClose'
    $V2ALabel.ForeColor = 'blue'
    $V2ALabel.Text = "Process Complete"
    $main_form.Controls.Remove($ProgressBar)
    $Button.Text = "FINISHED"
    $Button.BackColor = 'red'
    $Button.ForeColor = 'white'
    }
}

function ShowStart(){
$Label.Visible
$Options.Visible
$ComboBox.Visible
$OptLabel.Visible
$Script:ButtonAction='Load'
$Button.Text         = "Load Software"
$Button.BackColor    ='red'
$Button.ForeColor    ='white'
}

“#注释掉”的行是我尝试过的各种选项

** 2020 年 8 月 14 日更新 **

虽然不是我想要的,但它现在可以运行,并且在运行时显示有限的信息。(我现在认为在 Windows 上,它需要打开一个终端窗口才能运行。作为后台任务,没有控制台窗口,因此什么都无法运行)

$ArguementList='-i "{0}" -c:a libmp3lame -q:a 4 "{1}" -loglevel quiet -stats' -f $file, $saveOut
Start-Process -filePath "$ScriptDir\ffmpeg\ffmpeg.exe" $ArguementList

现在我只需要找到如何以编程方式改变终端窗口的大小/位置!!

相关内容