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

ukqbszuj  于 2022-12-04  发布在  Shell
关注(0)|答案(2)|浏览(132)

我已经将我当前的视频项目从命令提示符切换到PowerShell,这样我就可以充分利用Tee-Object的多输出代码。
目前,我有一个版本的代码在批处理中工作,但我需要通过一个tee再添加一个特性。这是我第一次使用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播放时,视频甚至没有弹出。我没有收到任何警告或任何东西,它似乎运行得很好,但我没有得到显示的图片。
最终目标是能够在主机显示器上以全分辨率播放视频,并向网络发布较低的比特率(如果有帮助的话)。

hpxqektj

hpxqektj1#

您看到奇怪行为的原因是PowerShell中的管道与旧的cmd-interpreter/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

如果需要向管道中添加更多命令,只需在Receive-RawPipeline之前插入另一个Invoke-NativeCommand -FilePath <command>
注:我不确定这个解决方案的性能,但我已经确认它会将ffmpeg的输出管道到ffplay并显示编码后的流。

z31licg0

z31licg02#

从ffmpeg传输到x265的示例:

$env:ffmpeg = 'D:\ffmpeg.exe'
$env:x265   = 'D:\x265.exe'
$env:avs    = 'D:\test.avs'
$env:output = 'D:\test.hevc'

$env:ffmpeg_args = '-f yuv4mpegpipe -strict -1 -loglevel fatal -hide_banner'

$env:x265_args = '--crf 18 --output-depth 10 --y4m'

cmd /s /c --% ""%ffmpeg%" -i "%avs%" %ffmpeg_args% - | "%x265%" %x265_args% --output "%output%" -"

简而言之:

cmd /s /c --% "<cmd style command>"

相关问题