gpt4 book ai didi

powershell - 如何使用powershell和other-transcode/ffmpeg批量处理一系列视频文件

转载 作者:行者123 更新时间:2023-12-04 23:18:00 27 4
gpt4 key购买 nike

TL;DR
我在以下 PowerShell 脚本中做错了什么?它没有按预期工作。

我正在用照相机记录我在大学里的一些讲座。尽管我必须将单个讲座分成三到四个部分,但这效果很好,因为相机一次只能录制 29 分钟的视频。我知道这是与一些许可问题相关的常见问题,大多数相机根本没有正确的许可来录制更长的视频。但它让我面临的问题是,在对文件进行一些后期处理之后,我必须一起编辑这些文件。
使用相机,我最多可以制作四个大小约为 3.5 GB 的视频文件,这对于任何用途来说都太大了,因为我们的 IT 部门可以理解地不想托管这么多数据,因为我制作了大约 22 GB 的视频每周 Material 。
前段时间,我在 GitHub 上遇到了一个非常有用的工具,叫做“other-video-transcoding”,它是由 Don Melton 用 ruby​​ 编写的,它允许我将文件压缩到合理的文件大小而不会造成任何视觉损失。此外,我裁剪视频以删除每个帧中既不是板也不是我的教授站立的地方的部分,以进一步减小文件大小并通过删除大多数学生来保护隐私。
由于可以通过命令行访问这些工具,因此配置起来相对容易,并且渲染漂亮的 gui 不需要额外的计算能力,因此我可以在不到 10 分钟的时间内编辑一个 29 分钟的剪辑。
现在我想通过编写一个 PowerShell 脚本来优化我的工作流程,该脚本只接受要裁剪的参数和要处理的文件,然后自己完成其余的工作,这样我就可以启动脚本,然后在我的笔记本电脑渲染时做其他事情新文件。
到目前为止,我有以下内容:

$video_path = Get-ChildItem ..\ -Directory | findstr "SoSe"

Get-ChildItem $video_path -name | findstr ".MP4" | Out-File temp.txt -Append
Get-Content temp.txt | ForEach-Object {"file " + $_} >> .\files.txt

Get-ChildItem $video_path |
Foreach-Object {
other-transcode --hevc --mp4 --target 3000 --crop 1920:780:0:0 $_.FullName
}

#other-transcode --hevc --mp4 --crop 1920:720:60:0 ..\SoSe22_Theo1_videos_v14_RAW\
ffmpeg -f concat -i files.txt -c copy merged.mp4
Remove-Item .\temp.txt
但它并不完全符合我的预期。
这是我的文件系统:
sciebo/
└── SoSe22_Theo1_videos/
├── SoSe22_Theo1_videos_v16/
│ ├── SoSe22_Theo1_videos_v16_KOMPR/
│ │ ├── C0001.mp4
│ │ ├── C0002.mp4
│ │ ├── C0003.mp4
│ │ ├── C0004.mp4
│ │ ├── temp.txt
│ │ ├── files.txt
│ │ └── merged.mp4
│ └── SoSe22_Theo1_videos_v16_RAW/
│ ├── C0001.mp4
│ ├── C0002.mp4
│ ├── C0003.mp4
│ └── C0004.mp4
└── SoSe22_Theo1_videos_v17/
├── SoSe22_Theo1_videos_v17_KOMPR
└── SoSe22_Theo1_videos_v17_RAW/
├── C0006.mp4
├── C0007.mp4
├── C0008.mp4
└── C0009.mp4
第 16 课已经处理,第 17 课没有。我总是在以 RAW 结尾的文件夹中保存原始视频数据以及以 KOMPR 结尾的文件中的编辑/压缩输出文件.注意 KOMPR 中的视频文件文件夹是 other-transcode 的输出文件工具。
真正的工作发生在它说的那一行
other-transcode --hevc --mp4 --target 3000 --crop 1920:780:0:0 $_.FullName
并在行中
ffmpeg -f concat -i files.txt -c copy merged.mp4
我将输出文件连接成最终版本,我可以上传到我们的在线学习平台。
我的脚本有什么问题?最后我想通过 --crop参数只是我的脚本,但这不是主要问题。

关于转码脚本的一些信息,因此您不必查看文档:
作为最后一个参数,该工具获取要处理的视频文件的位置,无论是相对文件路径还是绝对文件路径。输出放置在调用脚本的文件夹中,所以如果我 cd 进入 KOMPR 之一目录,然后调用
other-transcode --mp4 ../SoSe22_Theo1_videos_v16_RAW/C0001.mp4
一个新文件 C0001.mp4KOMPR 中创建目录,转码后的视频和旧音频将写入该新视频文件。

最佳答案

我会首先使用 Get-ChildItem 获取“SoSe*_RAW”文件夹并循环遍历这些文件夹。
在每次迭代中,检查它旁边是否有一个“SoSe*_KOMPR”文件夹,以及它是否已经有一个“merged.mp4 文件”。
如果是这种情况,则跳过处理文件夹并继续下一个。
尝试

$allVideos = Get-ChildItem -Path 'X:\sciebo' -Filter 'SoSe*_RAW' -Directory -Recurse | ForEach-Object {
$mergedPath = $_.FullName -replace '_[a-z]+$', '_KOMPR'
$mergedFile = Join-Path -Path $mergedPath -ChildPath 'merged.mp4'
if (Test-Path -Path $mergedFile -PathType Leaf) {
# already processed
continue # skip this and proceed with the next folder
}
# convert each file in the folder
$mp4Files = Get-ChildItem -Path $_.FullName -Filter '*.mp4' -File | Sort-Object {[int]$_.BaseName.Substring(1)}
if (@($mp4Files).Count) {
# make sure there is a 'SoSe*_KOMPR' folder
if (!(Test-Path -Path $mergedPath -PathType Container)) {
$null = New-Item -Path $mergedPath -ItemType Directory
}
# convert the videos into the 'SoSe*_KOMPR'
$transcoded = [System.Collections.Generic.List[string]]::new()
foreach ($video in $mp4Files) {
# copy the file to the 'SoSe*_KOMPR' first and transcode there
$copy = $video | Copy-Item -Destination $mergedPath -PassThru
other-transcode --hevc --mp4 --target 3000 --crop 1920:780:0:0 $copy.FullName
# add a string for the files.txt
$transcoded.Add(('file {0}' -f $copy.FullName))
}
# create a files.txt file with all converted filenames in it
$fileList = Join-Path -Path $mergedPath -ChildPath 'files.txt'
$transcoded | Set-Content -Path $fileList
# then combine all the videos into merged.mp4
ffmpeg -f concat -i $fileList -c copy $mergedFile
}
}

关于powershell - 如何使用powershell和other-transcode/ffmpeg批量处理一系列视频文件,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/72518291/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com