作为一名优秀的Windows系统管理员,我终于开始学习PowerShell了.话虽如此,我不知道我在做什么(惊喜,惊喜).
我认为在家里玩PowerShell,远离我的生产环境对我来说是一个很好的学习经历.最近,我开始使用FFMPEG将我的所有.mkv文件转换为.mp4,这样我就可以通过Plex对我的PlayStation 3提供更好的播放支持,并认为这将是一次很好的学习体验.
我一直在运行的命令如下:
ffmpeg -i OldVideoName.mkv -vcodec copy -acodec ac3 OldVideoName.mp4
Run Code Online (Sandbox Code Playgroud)
我想要的是一个PowerShell脚本,它将运行一次,扫描文件夹和.mkv文件的所有子文件夹(Get-ChildItem".*.mkv"),通过上面的命令将它们转码为.mp4,然后放置它们与.mkv具有相同命名方案的位置相同.
使用D:\ Videos作为目标目录运行脚本的示例:
D:\ Videos\home_dvr\movies\video1.mkv - > D:\ Videos\home_dvr\video1.mp4 D:\ Videos\home_dvr\tv\video2.mkv - > D:\ Videos\home_dvr\tv\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”
}
Run Code Online (Sandbox Code Playgroud)
任何帮助,将不胜感激!
试试这个:
$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
}
Run Code Online (Sandbox Code Playgroud)
$ oldvid是一个.NET FileInfo对象,当需要将其转换为字符串时,它可以只是文件名而不是整个路径.这对于不在当前目录中的文件不起作用.所以只需使用该FullName属性即可获得完整路径.
小智 5
似乎在当前版本的 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
}
Run Code Online (Sandbox Code Playgroud)
另外-c:v -c:a现在优于-vcodec和-acodec。如果您想保留所有曲目,而不仅仅是一个音频和一个视频曲目,-map 0则需要该标志。
| 归档时间: |
|
| 查看次数: |
5859 次 |
| 最近记录: |