[前言]
工作原理: 通过 Windows 系统自带的 PowerShell 终端让 FFmpeg 批量合并音视频。可将大量音频流和视频流分离的视频文件合并为有声音的视频文件,如哔哩哔哩的缓存文件等
使用方法: 新建一个文本文档 merge.txt
,将代码复制粘贴进去后保存,更改文件后缀名为 "ps1
",如:merge.ps1
,右键单击文件,选择 使用 PowerShell 运行
适用范围:
- 方案一适用于合并有一定命名规则的音视频文件,如将
a.mp4
和a(1).mp4
合并为a_merge.mp4
- 方案二适用于合并同名的音视频文件,如将
a.mp4
和a.m4a
合并为a_merge.mp4
版权声明: 本篇文章的代码并非原创,因此会注明出处,著作权归原作者所有,如有侵权请联系删除
方案一
原作者地址:Lee-7723
将 *.mp4
结尾的视频文件与 *(1).mp4
结尾的音频文件合并成 *_merge.mp4
结尾的视频文件 (*
是通配符,即文件名)
视频文件和音频文件的命名规则都可根据实际情况修改 例如:音频文件都是以 *.m4a
结尾,则将 $audio
(第6行)的 "(1).mp4
" 修改为 ".m4a
"
注意事项:
- 音视频的文件名和文件路径都尽量不要出现中文和空格,不然可能会报错
$video
和$audio
内的参数尽量同步修改,以确保匹配正确的文件
# 选择文件名里不带 "(1)" 的 .mp4 文件作为视频文件
$video = (ls -name -Exclude '*(1)*' -Include '*.mp4')
for ($i = 0; $i-lt $video.length; $i++) {
# 替换文件名里 ".mp4" 为 "(1).mp4" 以匹配音频文件
$audio = $video[$i].replace('.mp4','(1).mp4')
# 在合并后的视频文件名后添加 "_merge" 以便区分
$merge = $video[$i].replace('.mp4','_merge.mp4')
ffmpeg -hide_banner -i $video[$i] -i $audio -map 0 -map 1 -c copy $merge
}
pause # 执行结束后暂停
方案二
原作者地址:小小伟yo
将目录下所有同名的 *.mp4
和 *.m4a
合并为 *_merged.mp4
(*
是通配符,即文件名)
# 获取输入文件夹中的所有文件
$files = Get-ChildItem -Path ".\"
# 循环处理每个文件
foreach ($file in $files) {
# 检查文件是否是mp4
if ($file.Extension -eq ".mp4") {
# 构造对应的音频文件名
$audioFile = Join-Path -Path ".\" -ChildPath ($file.BaseName + ".m4a")
# 构造输出文件名
$outputFile = Join-Path -Path ".\" -ChildPath ($file.BaseName + "_merged.mp4")
# 检查输出文件是否已存在,如果存在则跳过
if (Test-Path $outputFile) {
Write-Host "Output file $outputFile already exists, skip merging"
continue
}
# 检查对应的音频文件是否存在,如果不存在则跳过
if (-not $audioFile -or -not (Test-Path $audioFile)) {
Write-Host "Audio file $audioFile does not exist or is empty, skip merging"
continue
}
# 调用ffmpeg合并视频和音频
ffmpeg -i $file.FullName -i $audioFile -c:v copy -c:a copy $outputFile
Write-Host "Merge completed: $($file.Name) + $($audioFile)"
}
}
Write-Host "Done"
# 执行结束后暂停
pause