在深入研究这个问题之前,我需要从一开始就确定背景。
我目前正在使用以下方法实施云游戏解决方案:
Nvidia Capture SDK用于生成填充层(通过DXGI.dll),拦截和捕获DirectX帧,以便将它们传递到Nvidia Video Codec SDK,以便编码为h264视频格式。所有这些都是在DXGI.dll中完成的。
然后我将编码的视频传递给FFmpeg。 FFmpeg充当HTTP服务器,广播视频流以供MPlayer播放。
我正在运行名为“Epic Survival Game Series”的虚幻引擎4游戏。 Nvidia Capture SDK的垫片层在游戏启动时启动,FFmpeg启动HTTP服务器以开始流式传输。但是,当我启动MPlayer接收流时,MPlayer停在以下消息,之后没有任何反应。
libavformat version 57.72.101 (internal)
Stream not seekable!
H264-ES file format detected
问题是,当我使用ffplay播放相同的视频时,它没有任何问题。这不是唯一的怪癖。当我启动另一个名为“第一人称射击模板”的虚幻引擎4游戏时,MPlayer也可以播放该视频。此外,如果我通过跳过菜单修改生存游戏以直接加载到游戏关卡中,MPlayer也可以播放视频。
使用FFmpeg将视频写入文件而不是将其流式传输到视频也是有效的,无论是游戏还是加载到菜单或游戏级别。
这很奇怪,我不知道为什么会这样。有什么想法吗?
编辑:我忘了提到的一个奇怪的怪癖是,MPlayer确实设法在非常罕见的场合播放视频 - 可能每10到20次尝试一次。
有关如何实施某些部分的其他详细信息。
(1)对于Nvidia Capture SDK,我使用SDK中提供的DXIFRShim示例
(2)对于Nvidia Video Codec SDK,我使用SDK中提供的提供的NvEncoder示例
(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 :(得分:1)
已经有一段时间了,我问了同样的问题并得到MPlayer mailing list的答案。我想我也应该在这里留下答案,万一有人遇到同样的问题。
答案:
MPlayer自动检测视频编解码器存在问题,因此在播放视频时需要在命令中明确说明-demuxer h264es
。使用更大的-cache
值也可以。