Обзор реализации

Прежде чем я углублюсь в вопрос, мне нужно с самого начала установить контекст.

В настоящее время я реализую решение для облачных игр, использующее следующее:

  • SDK для Nvidia Capture
  • SDK видеокодеков Nvidia
  • FFmpeg
  • MPlayer

SDK Nvidia Capture используется для создания слоя прокладки (через DXGI.dll), перехвата и захвата кадров DirectX, чтобы их можно было передать в SDK видеокодека Nvidia для кодирования в видеоформат h264. Все это делается в DXGI.dll.

Затем я передаю закодированное видео в FFmpeg. FFmpeg действует как HTTP-сервер, транслирующий видеопоток для воспроизведения MPlayer.

Проблема

Я запускаю игру на Unreal Engine 4 под названием "Epic Survival Game Series". Слой прокладки Nvidia Capture SDK запускается при запуске игры, а FFmpeg запускает HTTP-сервер для начала потоковой передачи. Однако, когда я запускаю MPlayer для приема потока, MPlayer останавливается на следующем сообщении, и после этого ничего не происходит.

libavformat version 57.72.101 (internal) Stream not seekable! H264-ES file format detected

Дело в том, что когда я воспроизводю одно и то же видео с помощью ffplay, оно работает без каких-либо проблем. Это не единственная причуда. Когда я запускаю другую игру для Unreal Engine 4 под названием «Шаблон шутера от первого лица», MPlayer также может воспроизводить это видео. Кроме того, если я изменю игру на выживание для загрузки непосредственно на уровень игры, пропустив меню, MPlayer также сможет воспроизводить видео.

Использование FFmpeg для записи видео в файл вместо его потоковой передачи в видео также работает, независимо от игры, независимо от того, загружен ли я в меню или уровень игры.

Это очень странно, и я понятия не имею, почему это так. Любые идеи?

Изменить: одна странная особенность, о которой я забыл упомянуть, заключается в том, что MPlayer действительно удается воспроизвести видео в очень редких случаях - может быть, каждые 10-20 попыток или около того.

Детали реализации

Дополнительные сведения о том, как реализованы определенные части.

(1) Для Nvidia Capture SDK я использую предоставленный пример DXIFRShim, который предоставляется в SDK.

(2) для Nvidia Video Codec SDK я использую предоставленный пример NvEncoder, который предоставляется в SDK.

(3) Я использую следующую команду FFmpeg: ffmpeg -i - -listen 1 -threads 1 -vcodec copy -preset ultrafast -an -tune zerolatency -f h264 http://address:port Закодированные кадры из Nvidia Video Codec SDK передаются в FFmpeg.

(4) Я использую следующую команду MPlayer: mplayer -quiet -vo gl -nosound -benchmark http://address:port

Вещи, которые я пробовал

Я подозреваю, что причина в MPlayer, поэтому я только поигрался с параметрами MPlayer. mplayer http://address:port

mplayer -fps 30 -vo gl -nosound -benchmark http://address:port

mplayer -fps 30 -screenw 720 -screenh 1280 -vo gl -nosound -benchmark http://address:port

mplayer -fps 30 -vo directx -nosound -benchmark http://address:port

mplayer -fps 30 -vo null -nosound -benchmark http://address:port

Ничто из этого не сработало.

0
Joel 19 Июн 2017 в 11:35

1 ответ

Лучший ответ

Прошло некоторое время, и я задал тот же вопрос и получил ответ на список рассылки MPlayer. Просто подумал, что я должен оставить ответ здесь, на случай, если кто-то столкнется с той же проблемой.

Отвечать: Существует проблема с автоматическим определением видеокодека MPlayer, поэтому -demuxer h264es необходимо явно указать в команде при воспроизведении видео. Также можно использовать большее значение -cache.

1
Joel 2 Авг 2017 в 09:02