MPlayer не воспроизводит видеопоток HTTP для определенного типа контента из того же источника

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

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

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

  • Nvidia Capture SDK
  • Видеокодек Nvidia SDK
  • FFmpeg
  • MPlayer

Nvidia Capture SDK используется для создания слоя подкладки (с помощью DXGI.dll), перехвата и захвата кадров DirectX, чтобы их можно было передать в SDK Nvidia Video Codec для кодирования в видеоформат 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 также может воспроизводить это видео. Кроме того, если я изменю Survival Game для загрузки непосредственно на игровой уровень, пропустив меню, MPlayer также сможет воспроизводить видео.

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

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

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

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

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

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

(2) для SDK Nvidia Video Codec я использую предоставленный пример 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

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

1 ответ

Решение

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

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

Другие вопросы по тегам