Назад | Перейти на главную страницу

Почему мои длинные видео дольше воспроизводятся, чем короткие с использованием 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 codehop.

К сожалению, хотя потоковая передача и поиск работают отлично, время начала просмотра видео очень сильно отличается.

Для коротких видеороликов (2-5 минут) он начинает воспроизводиться сразу. Для длинных видео (от 20 до 60 минут) до начала воспроизведения может пройти несколько минут, что заставит пользователя уйти, поскольку он считает, что видео не работает.

Почему это происходит, и, прежде всего, как этого избежать?

Я думаю, что ваши файлы mp4 передаются клиенту, но клиент не может найти необходимую информацию, поэтому он загружает весь файл, прежде чем он начнет играть. Попробуйте оптимизировать ваши файлы mp4

mp4file --optimize somefile.mp4

strace процессу lighttpd, чтобы увидеть, что он делает, когда делается такой запрос; это расскажет вам, что именно он делает, а затем вы можете просмотреть источник, чтобы понять, почему (в любом случае, если есть какие-то комментарии). Как только вы узнаете, что он делает, вы можете перейти к тому, как это исправить (если это вообще возможно).

Мое (совершенно необоснованное) предположение - это какое-то последовательное сканирование; вероятно, используя что-то O(n^2) (а может и хуже) из-за довольно резкого увеличения задержки относительно длины фильма (и, предположительно, размера). С другой стороны, я предполагаю, что это может быть что-то специфичное для видео, и все ваши длинные просто случайно запускают любой вызывающий задержку кодовый путь, вызывающий проблему.

Из-за размера атома MOOV атом moov является частью файла, который содержит информацию индекса для всего файла. Поэтому, когда вы транслируете небольшой файл, атом moov мал, поэтому запуск видео не занимает много времени. Но когда размер файла велик, даже если у вас есть исправленные проблемы с кодированием, такие как перемещение атома moov впереди, требуется некоторое время, чтобы сначала получить атом moov, а затем воспроизвести видео.

Чтобы преодолеть это, вы можете попробовать переключиться на Http динамическая потоковая передача автор: Adobe. Видеофайл сегментируется на стороне сервера, его фрагменты видео доставляются и сшиваются на стороне плеера для непрерывного воспроизведения. Он также поддерживает поиск в любой момент на временной шкале.