在PowerShell中使用ffmpeg和ffplay一起使用

时间:2018-05-21 20:47:31

标签: powershell ffmpeg pipeline

我已将当前的视频项目从命令提示符切换到PowerShell,以便我可以充分利用Tee-Object获取多输出代码。

目前,我有一个批量工作的代码版本,但我需要通过T恤添加一个功能。这是我第一次使用PowerShell,所以这可能是一个简单的修复...

目前我已经找到了如何在PowerShell中运行ffmpegffplay,并且我有一个批处理程序,它输出ffmpeg并将其传递给ffplay ,这很好用。我也可以通过PS中的ffplay来玩。在PS中,此代码有效:

ffplay -video_size 1280x720 -pixel_format uyvy422 -framerate 60 -i video="Decklink Video Capture"

作为批处理,此代码适用于我正在做的事情:

ffmpeg -video_size 1280x720 -pixel_format uyvy422 -framerate 60 -i video="Decklink Video Capture" -c:v libx265 -preset ultrafast -mpegts pipe: | ffplay pipe:

它需要我想要的视频并通过管道播放到屏幕。但是,当通过PowerShell播放时,视频甚至不会弹出。我没有得到任何警告或任何东西,它似乎运行良好,但我不能让图片显示。

最终目标是能够以全分辨率在主机显示器上播放视频,并向网络发布较低比特率(如果有帮助的话)。

1 个答案:

答案 0 :(得分:0)

你看到奇怪的行为的原因是,powershell中的管道与旧的cmd-interprenter / console中的工作方式不同。基本上它在被传递给下一个命令之前由powershell解析。 您可以在this github issue中阅读更多内容,了解正在进行的一些工作,以使两个本机进程能够在Powershell中传递原始字节流。

如果您无法在旧版cmd-shell中运行命令(这可能是最简单的方法),您可以使用模块Use-RawPipeline

Install-Module -Name Use-RawPipeline

然后你可以像这样构造一个命令行(我简化了参数列表只是为了使用一个文件并跳过decklink-source以简化):

Invoke-NativeCommand -FilePath .\ffmpeg -ArgumentList @("-i", "C:\temp\testfile.mp4","-f","h264", "pipe:") | `
Invoke-NativeCommand -FilePath .\ffplay.exe -ArgumentList @("pipe:") | `
Receive-RawPipeline

如果您需要向管道添加更多命令,只需在Invoke-NativeCommand -FilePath <command>之前插入另一个Receive-RawPipeline

注意:我不确定此解决方案的性能,但我已经确认它会将ffmpeg的输出传输到ffplay并显示编码流。