![将 FFMPEG 作为后台作业运行](https://linux22.com/image/1630579/%E5%B0%86%20FFMPEG%20%E4%BD%9C%E4%B8%BA%E5%90%8E%E5%8F%B0%E4%BD%9C%E4%B8%9A%E8%BF%90%E8%A1%8C.png)
我有一个命令可以从视频中提取音频。如果我通过 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
现在我只需要找到如何以编程方式改变终端窗口的大小/位置!!