为什么使用 jwplayer 和 lighttpd 播放长视频比播放短视频需要更长的时间?

为什么使用 jwplayer 和 lighttpd 播放长视频比播放短视频需要更长的时间?

我有一个视频流网站,其 lighttpd 配置如下:

server.modules              = (
  "mod_compress",
  "mod_access",
  "mod_alias",
  "mod_rewrite",
  "mod_redirect",
  "mod_secdownload",
  "mod_h264_streaming",
  "mod_flv_streaming",
  "mod_accesslog",
  "mod_auth",
  "mod_status",
  "mod_expire",
  "mod_fastcgi"
)

server.document-root        = "/data/domain.com/"
index-file.names            = ( "index.html" )
server.tag                 = "xhttpd"
url.access-deny             = ( "~", ".inc" )
dir-listing.encoding = "utf-8"


mimetype.assign             = (
  ".gif"      =>      "image/gif",
  ".jpg"      =>      "image/jpeg",
  ".jpeg"     =>      "image/jpeg",
  ".png"      =>      "image/png",
  ".css"      =>      "text/css",
  ".html"     =>      "text/html; charset=UTF-8",
  ".htm"      =>      "text/html; charset=UTF-8",
  ".js"       =>      "text/javascript",
  ".mp4"      =>      "video/mp4",
  ".3gp"      =>      "video/3gpp",
  ".3gpp"     =>      "video/3gpp",
# make the default mime type application/octet-stream.
  ""              =>      "application/octet-stream",
)
mimetype.use-xattr        = "enable"

server.port                = 80
server.pid-file            = "/var/run/lighttpd.pid"
server.username            = "nginx"
server.groupname           = "nginx"

server.stat-cache-engine = "simple"   # either fam, simple or disabled

# see http://blog.lighttpd.net/articles/2005/11/11/optimizing-lighty-for-high-concurrent-large-file-downloads
server.network-backend = "writev"

# http://redmine.lighttpd.net/wiki/1/Server.event-handlerDetails
server.event-handler = "linux-sysepoll"


server.max-fds                  = 8192
server.max-connections          = 2048
server.max-write-idle           = 360
server.max-keep-alive-requests  = 4
server.max-keep-alive-idle      = 4
server.max-read-idle            = 30


# Files ending in .flv and .3gp are served by the module
h264-streaming.extensions = (".mp4" )

$HTTP["url"] =~ "mp4$" {
  connection.kbytes-per-second = 90
}

# Add Expires/Cache-Control header
$HTTP["url"] =~ "\.(mp4|3gp|flv)$" {
  expire.url = ( "" => "access 8 hours" )
}

播放器是 jwplayer,我的所有视频都是 mp4,使用 mp4box 在文件开头设置元数据。Lighttpd 已使用 h264 codeshop 代码进行修补。

不幸的是,虽然流媒体和搜索功能运行正常,但视频的开始时间存在很大差异。

对于短视频(2-5 分钟),它会立即开始播放。对于长视频(20 到 60 分钟),可能需要几分钟才能开始播放,这会让用户离开,因为他认为视频无法播放。

为什么会发生这种情况,最重要的是,如何避免这种情况?

答案1

strace查看 lighttpd 进程,查看发出此类请求时它在做什么;这样可以准确地告诉您它在做什么,然后您可以仔细查看源代码以了解原因(假设有某种注释)。一旦您知道它在做什么,您就可以继续了解如何修复它(如果可能的话)。

我的猜测(完全没有根据)是它正在进行某种顺序扫描;可能使用某种方法O(n^2)(或者甚至更糟),因为延迟相对于影片长度(可能还有大小)急剧增加。或者,我猜这可能是视频特有的,而所有长视频恰好触发了导致问题的延迟代码路径。

答案2

我认为您的 mp4 文件正在流式传输到客户端,但客户端找不到所需的某些信息,因此在开始播放之前会下载整个文件。尝试优化您的 mp4 文件

mp4file --optimize somefile.mp4

答案3

这是因为 MOOV 原子的大小,moov 原子是文件的一部分,它保存了整个文件的索引信息。因此,当您流式传输小文件时,moov 原子很小,因此视频不需要很长时间才能启动。但是当文件很大时,即使您解决了编码问题,例如将 moov 原子移到前面,也需要一些时间先获取 moov 原子,然后播放视频。

为了解决这个问题,你可以尝试切换到Http 动态流由 adobe 提供。视频文件在服务器端被分段,其视频块被传送并在播放器端被拼接以进行连续播放。它还支持在时间轴的任何点进行搜索。

相关内容