Использование ffmpeg и ffplay вместе в PowerShell - PullRequest
0 голосов
/ 21 мая 2018

Я переключил свой текущий видеопроект с командной строки на PowerShell, чтобы я мог в полной мере использовать Tee-Object для кода с несколькими выходами.

В настоящее время у меня есть версия моего кода, работающая впакет, но мне нужно добавить еще одну функцию через тройник.Я впервые использую PowerShell, так что это, вероятно, простое исправление ...

В настоящее время я выяснил, как запускать ffmpeg и ffplay в PowerShell, и у меня есть программа в пакетном режиме, котораяпринимает вывод ffmpeg и передает его на ffplay, и это прекрасно работает.Я также могу играть через ffplay в PS просто отлично.В 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 голосов
/ 27 мая 2018

Причина, по которой вы видите странное поведение, заключается в том, что конвейер в powershell не работает так же, как в старой cmd-interprenter / console.По сути, он анализируется PowerShell перед передачей следующей команде.Вы можете прочитать больше в этом выпуске github о некоторых текущих работах, позволяющих двум собственным процессам передавать необработанные байтовые потоки в Powershell.

Если вы не можете просто запустить свою команду вустаревшая оболочка cmd (вероятно, это будет самый простой способ), вы можете использовать модуль Use-RawPipeline .

Install-Module -Name Use-RawPipeline

Затем вы можете создать командную строку следующим образом (Iупростили список аргументов, чтобы просто использовать файл и пропустить для краткости источник-ссылка:

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 и отобразит закодированный поток.

...