如何使用ffmpeg旋转整个视频目录?


3

我是FFmpeg的新手并试图解决这个问题。我发现这是批量处理旋转视频的答案,但我需要把它们放在一起。

有人可以在Windows上解释如何为此操作创建脚本吗?


4
哪个操作系统?
比特

使用for命令和ffmpeg命令。但是for命令的语法可能因操作系统而异。
Biswapriyo

嗨,谢谢你的回复。为了澄清,我试图在Windows上完成此任务。
2017年

Answers:


2

基本上,您只需要查看文件(将它们存储在变量中),然后将这些查找的文件提供给FFmpeg。

当然,Windows的Batch语言就足够了。但由于我对此没有熟练,这是一个PowerShell脚本:

# Searching for files with the Get-ChildItem cmdlet and saving their relevant properties in an array:
# NOTE: -File will only work with PowerShell-versions >= 3.
[array]$FilesToRotate = Get-ChildItem -Path "C:\PATH_TO_FILES" ((-Filter *.mp4)) ((-Recurse)) -File | ForEach-Object {
    # NOTE: This part is a bit tricky - I just added it so I'm able to save the parent-path of each file in an object.
    # NOTE: One could also omit the whole ForEach-Object and use the Split-Path cmdlet inside the output-file's specification in FFmpeg's code.
    [PSCustomObject]@{
        InFullName = $_.FullName
        # Will put the output-file in the same folder as the input-file and add "_ROTATION" as suffix in its name.
        OutFullName = "$(Split-Path -Parent -Path $($_.FullName))\$($_.BaseName)_ROTATE$($_.Extension)"
    }
}

# Processing the files with FFmpeg using PowerShell's Start-Process cmdlet:
for($i=0; $i -lt $FilesToRotate.Length; $i++){
    Start-Process -FilePath "C:\PATH_TO_FFMPEG\ffmpeg.exe" -Argumentlist " -i `"$($FilesToRotate[$i].InFullName)`" -c copy -metadata:s:v:0 rotate=<x> `"$($FilesToRotate[$i].OutFullName )`" " ((-Wait)) ((-NoNewWindow))
}

这个脚本将使用你提供代码运行FFmpeg (我没有检查它,但你可以轻松地替换它)并将生成的文件保存到名称后缀为“_ROTATE”的同一文件夹中 - 所以“MyMovie2017.mov”将成为“MyMovie2017_ROTATE.mov”。(如果要将它们渲染到一个全新的文件夹,请替换$($FilesToRotate[$i].ParentPath)为您喜欢的路径。)

注意:加倍括号中的内容(( ))是可选的:

  • -Filter只会找到(一个)特定类型的文件,例如* .mp4只会找到MP4-Files。如果您有多个文件类型,但许多文件不需要转换(如文本文件),您可以使用-Exclude您不想转换的所有格式,也可以-Include只转换那些应该转换的格式(-Include就像-Filter- 它速度较慢,但​​可以包含多种格式。)
  • -Recurse还将查看子文件夹。您也可以使用-DepthPowerShell v 5+。
  • -Wait 将一次打开一个ffmpeg实例 - 没有它,所有实例将并行打开。
  • -NoNewWindow将在PowerShell-Console中显示ffmpeg-instance的输出,如果没有它,ffmpeg的每个实例都将在新的控制台窗口中打开。只有用才有意义-Wait

在启动脚本之前,您必须删除所有加倍的括号(以及它们的内容,如果您不想要它)。

此外,这些事情需要调整:

  • C:\PATH_TO_FILES 显然,您的文件的路径。
  • C:\PATH_TO_FFMPEG\ffmpeg.exe 显然,你的ffmpeg.exe的路径。
  • rotate=<x>-你需要更换<x>有两种90180270。(正如代码的来源所解释的那样)

如果有什么需要更多解释,我很乐意提供帮助。


谢谢您的帮助!通过删除“-File”文本,我在经过一些试验和错误后得到了它。所以它看起来像这样:[array] $ FilesToRotate = Get-ChildItem -Path“C:\ PATH_TO_FILES”
ThirteenthMonth

你能告诉我“-File”应该做什么吗?我错了之后就把它删掉了,让它运转起来。
2017年

-File将阻止将Get-ChildItem文件夹包含到变量中。没有-File(和/或-Filter),$FilesToRotate甚至包括子文件夹,因此PowerShell会尝试将您的子文件夹作为FFmpeg的输入文件传递。请注意,我们正在谈论文件夹本身; 我们不是在谈论递归搜索。可以在此处找到Get.-ChildItem的文档。
flolilo

@ThirteenthMonth你能告诉我它会抛出什么错误吗?当我尝试它时-File,它完美无缺。另外,你能告诉我你正在使用的PS的版本吗?(只需键入$PSVersionTable控制台并按Enter键 - 这是第一个值。)非常感谢!
flolilo

1
啊 - 在PowerShell <版本3中, - -File参数不包括在内。如果你真的想使用它,我建议你升级你的PowerShell安装,虽然转换几个文件会有点过分。;-)无论如何,我将这些信息作为评论添加到脚本中。
flolilo
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.