【问题标题】:Powershell and FFMPEG - FFMPEG not executingPowershell 和 FFMPEG - FFMPEG 未执行
【发布时间】:2016-08-04 21:12:25
【问题描述】:

所以我写了一个powershell脚本,递归搜索所有超过一定大小的视频文件,然后调整它们的大小。

我觉得我在这里遗漏了一些明显的东西......因为我的脚本实际上并没有运行 FFMPEG,它只是在屏幕上显示运行它的命令。我相信我会面对解决方案。

$SearchPath = "N:\baseball"

$oldVideos = Get-ChildItem -Include @("*.mkv", "*.mov", "*.mpg", "*.wmv", "*.avi") -Path $SearchPath -Recurse | where-object {$_.length -gt 500MB};

Set-Location -Path 'C:\Program Files\ffmpeg\bin';

foreach ($OldVideo in $oldVideos) 
{
    $outputfolder = "O:\resized"
    $oldname = Get-Item $oldvideo | Select-Object -ExpandProperty BaseName
    $suffix = "_resized.mp4"
    $newname = "$($oldname)_$($suffix)"
    $ffmpeg = ".'C:\Program Files\ffmpeg\bin\ffmpeg.exe'"
    $arguments = " -i `"$($OldVideo)`" -vf scale=720:trunc(ow/a/2)*2 -c:v libx264 -f mp4 `"$outputfolder\$newname`" -y"
    $ffmpeg + $arguments}

这是我运行脚本时屏幕上的实际输出 .'C:\Program Files\ffmpeg\bin\ffmpeg.exe' -i "N:\baseball\hitting\067.MOV" -vf scale=720:trunc(ow/a/2)*2 -c:v libx264 -f mp4 "O:\resized\067__resized.mp4" -y

该命令应该执行(它在命令窗口中运行)。

【问题讨论】:

  • 你只需要构建一些字符串变量。你实际上没有在任何地方使用这些变量。
  • 最后我使用 $ffmpeg + $arguments
  • 您可以使用invoke-expression 来完成此操作
  • 当我在 powershell 中手动运行命令时,它会出错。 ow/a/2 :术语“ow/a/2”未被识别为 cmdlet、函数、脚本文件或可运行程序的名称。检查名称的拼写,或者如果包含路径,请验证路径是否正确并重试。在 line:1 char:121

标签: powershell video ffmpeg


【解决方案1】:

现在你只是组合两个字符串,所以它输出组合的字符串。它正在做你要求它做的事情。尝试将其更改为:

$SearchPath = "N:\baseball"

$oldVideos = Get-ChildItem -Include @("*.mkv", "*.mov", "*.mpg", "*.wmv", "*.avi") -Path $SearchPath -Recurse | where-object {$_.length -gt 500MB};

Set-Location -Path 'C:\Program Files\ffmpeg\bin';

foreach ($OldVideo in $oldVideos) 
{
    $outputfolder = "O:\resized"
    $oldname = Get-Item $oldvideo | Select-Object -ExpandProperty BaseName
    $suffix = "_resized.mp4"
    $newname = "$($oldname)_$($suffix)"
    $ffmpeg = "'C:\Program Files\ffmpeg\bin\ffmpeg.exe'"
    $arguments = " -i `"$($OldVideo)`" -vf scale=720:trunc(ow/a/2)*2 -c:v libx264 -f mp4 `"$outputfolder\$newname`" -y"
    & $ffmpeg $arguments}

【讨论】:

  • 好的,在正确的轨道上。现在的问题是 $OldVideo 输出不再被引用,因此如果文件名或目录名包含空格,脚本将中止。
  • 它仍然应该被引用,那部分根本不应该改变。
【解决方案2】:

我终于得到了这个工作......我查看了其他几个脚本以及它们是如何执行的......似乎我让这个过于复杂了。 编辑:我添加了日志记录和附加功能来删除原始文件并将其移动到原始位置。我可能应该添加一些错误处理来检查电影长度是否相同......首先要弄清楚。注意:日志记录并不完全正确……但脚本的核心部分(查找 500MB 以上的电影、调整大小、移回原始文件夹和删除作品)。我还需要向电影文件添加 2 个检查。 1 查看调整大小的电影是否实际上更小,以及电影持续时间是否相同。

 $env:Path += ";C:\Program Files\ffmpeg\bin\"

function Write-Log 
    { 
        param
        (
            [string]$strMessage
        )

            $LogDir = 'L:\conlogs\'
            $Logfile = "\Conversion-Log.txt"
            $Path = $logdir + $logfile
            [string]$strDate = get-date
            add-content -path $Path -value ($strDate + "`t:`t"+ $strMessage)
}

$SearchPath = "N:\baseball"

$oldVideos = Get-ChildItem -Include @("*.mkv", "*.mov", "*.mpg", "*.wmv", "*.avi","*.mp4") -Path $SearchPath -Recurse | where-object {$_.length -gt 500MB} | where-object {$_.Name -NotMatch "resized"};

foreach ($OldVideo in $oldVideos) 
{   $outputfolder = "O:\resized"
    $oldname = Get-Item $oldvideo | Select-Object -ExpandProperty BaseName
    $suffix = "resized.mp4"
    $newname = "$($oldname)_$($suffix)"
    ffmpeg.exe -i $oldvideo.FullName -vf "scale=720:trunc(ow/a/2)*2" -c:v libx264 -f mp4 -y "$outputfolder\$newname"

    $OriginalSize = (Get-Item $OldVideo).length 
    $ConvertedSize = (Get-Item $outputfolder\$Newname).length 

    If($ConvertedSize -le $OriginalSize)
    {
        Write-Log "$($NewVideo) has been successfully resized"
        Remove-Item $OldVideo

        If (Test-Path $OldVideo)
        {
            write-log "Unable to remove $($OldVideo)"
        }

        Else
        {
            write-log "Successfully removed $($OldVideo)"
        }
        Elseif
        {
            write-log "You dun goofed!"
        }

        $oldvidpath = [System.IO.Path]::GetDirectoryName($oldvideo)
        Move-Item "$outputfolder\$Newname" -Destination $oldvidpath

       If (Test-Path "$oldvidpath\$newname")
        {
            write-log "Unable to move $($newname)"
        }

        Else
        {
            write-log "Successfully moved $($OldVideo)"
        }

        Elseif
        {
            write-log "You dun goofed!"
        }
    }
}

【讨论】:

    猜你喜欢
    • 2020-10-11
    • 2016-07-12
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-09-08
    • 2011-09-28
    相关资源
    最近更新 更多