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
Значение также работает.