MPlayer 不播放来自同一来源的特定类型内容的 HTTP 视频流
MPlayer not playing HTTP video stream for a specific type of content from the same source
实施概述
在深入探讨这个问题之前,我需要从头开始建立上下文。
我目前正在使用以下内容实施云游戏解决方案:
- Nvidia Capture SDK
- Nvidia 视频编解码器 SDK
- FFmpeg
- MPlayer
Nvidia Capture SDK 用于生成填充层(通过 DXGI.dll),拦截和捕获 DirectX 帧,以便将它们传递给 Nvidia Video Codec SDK 以编码为 h264 视频格式.所有这些都在 DXGI.dll.
内完成
然后我将编码后的视频传递给 FFmpeg。 FFmpeg 充当 HTTP 服务器,广播视频流供 MPlayer 播放。
问题
我是 运行 一款名为“Epic Survival Game Series”的 Unreal Engine 4 游戏。 Nvidia Capture SDK 的 shim 层在游戏开始时启动,FFmpeg 启动 HTTP 服务器以开始流式传输。但是,当我启动 MPlayer 接收流时,MPlayer 停在以下消息处,此后什么也没有发生。
libavformat version 57.72.101 (internal)
Stream not seekable!
H264-ES file format detected
问题是,当我使用 ffplay 播放同一个视频时,它没有任何问题。这不是唯一的怪癖。当我启动另一个名为 "First Person Shooter Template" 的 Unreal Engine 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
None 个有效。
好久没来了,我问了同样的问题,在MPlayer mailing list上得到了答案。只是觉得我也应该在这里留下答案,以防有人遇到同样的问题。
回答:
MPlayer 对视频编解码器的自动检测存在问题,因此播放视频时需要在命令中明确声明-demuxer h264es
。使用更大的 -cache
值也有效。
实施概述
在深入探讨这个问题之前,我需要从头开始建立上下文。
我目前正在使用以下内容实施云游戏解决方案:
- Nvidia Capture SDK
- Nvidia 视频编解码器 SDK
- FFmpeg
- MPlayer
Nvidia Capture SDK 用于生成填充层(通过 DXGI.dll),拦截和捕获 DirectX 帧,以便将它们传递给 Nvidia Video Codec SDK 以编码为 h264 视频格式.所有这些都在 DXGI.dll.
内完成然后我将编码后的视频传递给 FFmpeg。 FFmpeg 充当 HTTP 服务器,广播视频流供 MPlayer 播放。
问题
我是 运行 一款名为“Epic Survival Game Series”的 Unreal Engine 4 游戏。 Nvidia Capture SDK 的 shim 层在游戏开始时启动,FFmpeg 启动 HTTP 服务器以开始流式传输。但是,当我启动 MPlayer 接收流时,MPlayer 停在以下消息处,此后什么也没有发生。
libavformat version 57.72.101 (internal)
Stream not seekable!
H264-ES file format detected
问题是,当我使用 ffplay 播放同一个视频时,它没有任何问题。这不是唯一的怪癖。当我启动另一个名为 "First Person Shooter Template" 的 Unreal Engine 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
None 个有效。
好久没来了,我问了同样的问题,在MPlayer mailing list上得到了答案。只是觉得我也应该在这里留下答案,以防有人遇到同样的问题。
回答:
MPlayer 对视频编解码器的自动检测存在问题,因此播放视频时需要在命令中明确声明-demuxer h264es
。使用更大的 -cache
值也有效。