我有一个视频流网站,其 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 提供。视频文件在服务器端被分段,其视频块被传送并在播放器端被拼接以进行连续播放。它还支持在时间轴的任何点进行搜索。