如何在Windows PowerShell中通过管道将图像传入FFmpeg?
问题根本原因
PowerShell默认将所有管道内容视为文本处理,会自动执行编码转换、换行符替换操作,完全破坏了图片、视频这类二进制文件的原始字节结构。你之前测试的Get-Content test.bmp > simple.bmp输出文件损坏,就是因为PowerShell默认把读取的二进制内容当成UTF-16文本输出,还自动将文件内的0x0A(LF换行)替换为0x0D 0x0A(CRLF换行),和ffmpeg本身没有关系。
可行解决方案
方案1:PowerShell 7.4及以上版本(最优解)
PowerShell 7.4开始原生支持向外部程序传输二进制管道流,直接添加参数即可正常使用:
Get-Content -AsByteStream test_*.bmp | .\ffmpeg -framerate 1 -i - -c:v libx264 -r 25 -pix_fmt yuv420p -y video.mp4
-AsByteStream参数指定Get-Content直接读取文件的原始二进制字节,不做任何文本编码解析- 7.4+版本的管道会直接将二进制字节流传给ffmpeg,不会插入额外的转换逻辑
方案2:兼容PowerShell 5.1(系统自带旧版本)
如果无法升级PowerShell版本,可以绕开默认管道,通过临时文件传递二进制内容:
# 一次性读取所有bmp文件的原始字节 $allBmpBytes = Get-Content -Path test_*.bmp -Encoding Byte -Raw # 写入临时文件规避管道文本转换 Set-Content -Path bmp_input.tmp -Value $allBmpBytes -Encoding Byte # 用ffmpeg读取临时文件生成视频 .\ffmpeg -framerate 1 -i bmp_input.tmp -c:v libx264 -r 25 -pix_fmt yuv420p -y video.mp4 # 清理临时文件 Remove-Item bmp_input.tmp
如果没有强制使用管道的特殊需求,直接用ffmpeg自带的通配符读取功能更省事,完全规避PowerShell的处理逻辑:
.\ffmpeg -framerate 1 -pattern_type glob -i "test_*.bmp" -c:v libx264 -r 25 -pix_fmt yuv420p -y video.mp4
内容的提问来源于stack exchange,提问作者user2957427
相关产品推荐
相关产品推荐

