PowerShell脚本ffmpeg

时间:2013-08-20 05:14:01

标签: powershell ffmpeg

作为一名优秀的Windows系统管理员,我终于开始学习PowerShell了。话虽如此,我不知道我在做什么(惊讶,惊讶)。

我认为在家里远离我的生产环境,在家里玩PowerShell对我来说是一次很好的学习经历。最近,我开始使用FFMPEG将我的所有.mkv文件转换为.mp4,这样我就可以通过Plex更好地回放我的PlayStation 3,并认为这将是一次很好的学习体验。

我一直在运行的命令如下:

ffmpeg -i OldVideoName.mkv -vcodec copy -acodec ac3 OldVideoName.mp4

我想要的是一个PowerShell脚本,它将运行一次,扫描文件夹和.mkv文件的所有子文件夹(Get-ChildItem“。*。mkv”),通过上面的命令将它们转码为.mp4,并使用相同的命名方案将它们放在与.mkv相同的位置。

使用D:\ Videos作为目标目录运行脚本的示例:

D:\ Videos \ home_dvr \ movies \ video1.mkv - > d:\视频\ home_dvr \ video1.mp4 D:\ Videos \ home_dvr \ tv \ video2.mkv - > d:\画\ home_dvr \电视\ video2.mp4

你可以猜到,我无法理解我的生活。这是放弃之前的最新尝试。

    $oldvid = Get-ChildItem .\*.mkv -Recurse
    $newvid = $oldvid.Name.split(‘.’)[0]; ForEach-Object {
            .\ffmpeg.exe -i $oldvid -y -vcodec copy -acodec ac3 $newvid".mp4”
    }

任何帮助将不胜感激!

2 个答案:

答案 0 :(得分:9)

试试这个:

$oldvids = Get-ChildItem *.mkv -Recurse
foreach ($oldvid in $oldvids) {
    $newvid = [io.path]::ChangeExtension($oldvid.FullName, '.mp4')
    .\ffmpeg.exe -i $oldvid.FullName -y -vcodec copy -acodec ac3 $newvid
}

$ oldvid是一个.NET FileInfo对象,当需要将其转换为字符串时,它可以只是文件名而不是整个路径。这对于不在当前目录中的文件不起作用。因此,只需使用FullName属性即可获得完整路径。

答案 1 :(得分:3)

似乎使用当前版本的powershell,行为已经发生了一些变化。 Keith Hill建议的答案不再适用,它需要删除.FullName才能使用PS 5.1(Build 14393)。 所以目前的答案是:

$oldvids = Get-ChildItem -Filter "*.mkv" -Recurse
foreach ($oldvid in $oldvids) {
    $newvid = [io.path]::ChangeExtension($oldvid, '.mp4')
    .\ffmpeg.exe -i $oldvid-y -map 0 -c:v copy -c:a ac3 $newvid
}

-c:v -c:a现在优先于-vcodec-acodec。 如果您想保留所有曲目而不是一个音频和一个视频曲目,则需要-map 0标记。