Модуль ngx_http_mp4_module не переставляет moov-атом

Алексей Щуров aa.schurov at gmail.com
Tue Sep 30 14:37:00 UTC 2014


После замены стороннего модуля nginx_mod_h264_streaming на стандартный
with-http_mp4_module обнаружилась проблема с раздачей mp4 видео файлов для
псевдостриминга - сторонний модуль делал перестановку moov-атома в начало
файла, стандартный отдает файл в неизменном виде (проверяем с помощью
qtfaststart -l file.mp4).
В документации сказано что стандартный модуль должен это делать с оговоркой
что это создает дополнительную нагрузку:
> До начала воспроизведения плееру необходимо прочитать метаданные. Для
этого он отсылает специальный запрос с аргументом start=0. Многие
кодирующие программы добавляют метаданные в конец файла. Это неоптимально
для псевдо-стриминга, поскольку плееру потребуется загрузить файл целиком
прежде чем начать воспроизведение. Если метаданные находятся в начале
файла, nginx’у достаточно начать отправлять в ответ содержимое файла. Если
же метаданные находятся в конце файла, потребуется прочитать весь файл и
подготовить новый поток, в котором метаданные предшествуют медийным данным.
Это требует дополнительного процессорного времени, памяти и дискового
ввода/вывода, поэтому лучше заранее подготовить исходный файл для
псевдо-стриминга, нежели делать это для каждого запроса.
В нашем хранилище видео лежит с moov-атомом в конце файла и мы понимаем что
предварительная подготовка решит проблему, но при нашем объеме видео
подготовка и проверка займет очень много времени.
Хотелось бы понимать почему модуль ngx_http_mp4_module не выполняет функцию
заявленную в документации и исходя из этого принимать решение о дальнейших
действиях.
Проблема наблюдается на двух версиях (хотя набор модулей практически
одинаковый):

nginx 1.7.3
built by gcc 4.4.7 20120313 (Red Hat 4.4.7-4) (GCC)
TLS SNI support enabled
configure arguments: --add-module=./../echo-nginx-module-0.47
--add-module=./../encrypted-session-nginx-module-master
--add-module=./../ngx_devel_kit/ --add-module=./../nginx-upload-module-2.2
--add-module=./../lua-nginx-module
--add-module=./../redis2-nginx-module-0.11
--add-module=./../set-misc-nginx-module-0.24 --add-module=./../nginx-ctpp
--add-module=./../ngx_http_substitutions_filter_module --prefix=/etc/nginx/
--sbin-path=/usr/sbin/nginx --conf-path=/etc/nginx/nginx.conf
--error-log-path=/var/log/nginx/error.log
--http-log-path=/var/log/nginx/access.log --pid-path=/var/run/nginx.pid
--lock-path=/var/run/nginx.lock
--http-client-body-temp-path=/var/cache/nginx/client_temp
--http-proxy-temp-path=/var/cache/nginx/proxy_temp
--http-fastcgi-temp-path=/var/cache/nginx/fastcgi_temp
--http-uwsgi-temp-path=/var/cache/nginx/uwsgi_temp
--http-scgi-temp-path=/var/cache/nginx/scgi_temp --user=nginx --group=nginx
--with-http_ssl_module --with-http_realip_module
--with-http_addition_module --with-http_sub_module --with-http_mp4_module
--with-http_flv_module --with-http_gunzip_module
--with-http_gzip_static_module --with-http_secure_link_module
--with-http_stub_status_module --with-http_geoip_module
--with-http_image_filter_module --with-http_xslt_module --with-md5=YES
--with-file-aio --with-cc-opt='-O2 -g -pipe -Wall -Wp,-D_FORTIFY_SOURCE=2
-fexceptions -fstack-protector --param=ssp-buffer-size=4 -m64
-mtune=generic'

nginx 1.6.0
built by gcc 4.4.7 20120313 (Red Hat 4.4.7-4) (GCC)
TLS SNI support enabled
configure arguments: --add-module=./../echo-nginx-module-0.47
--add-module=./../encrypted-session-nginx-module-master
--add-module=./../ngx_devel_kit/ --add-module=./../nginx-upload-module-2.2
--add-module=./../lua-nginx-module
--add-module=./../redis2-nginx-module-0.11
--add-module=./../nginx_upstream_hash-0.3.2
--add-module=./../set-misc-nginx-module-0.24 --add-module=./../nginx-ctpp
--prefix=/etc/nginx/ --sbin-path=/usr/sbin/nginx
--conf-path=/etc/nginx/nginx.conf --error-log-path=/var/log/nginx/error.log
--http-log-path=/var/log/nginx/access.log --pid-path=/var/run/nginx.pid
--lock-path=/var/run/nginx.lock
--http-client-body-temp-path=/var/cache/nginx/client_temp
--http-proxy-temp-path=/var/cache/nginx/proxy_temp
--http-fastcgi-temp-path=/var/cache/nginx/fastcgi_temp
--http-uwsgi-temp-path=/var/cache/nginx/uwsgi_temp
--http-scgi-temp-path=/var/cache/nginx/scgi_temp --user=nginx --group=nginx
--with-rtsig_module --with-select_module --with-poll_module --with-md5=YES
--with-http_addition_module --with-http_ssl_module
--with-http_realip_module --with-http_geoip_module
--with-http_addition_module --with-http_sub_module --with-http_mp4_module
--with-http_flv_module --with-http_image_filter_module
--with-http_gzip_static_module --with-http_secure_link_module
--with-http_stub_status_module --with-file-aio --with-http_xslt_module
--with-cc-opt='-O2 -g -pipe -Wall -Wp,-D_FORTIFY_SOURCE=2 -fexceptions
-fstack-protector --param=ssp-buffer-size=4 -m64 -mtune=generic'


Это предыдующая версия со сторонним модулем в которой перестановка
moov-атома работала:
nginx/1.4.7
built by gcc 4.4.7 20120313 (Red Hat 4.4.7-4) (GCC)
TLS SNI support enabled
configure arguments: --add-module=./../mod_strip
--add-module=./../echo-nginx-module-0.47
--add-module=./../nginx_syslog_patch
--add-module=./../encrypted-session-nginx-module-master
--add-module=./../nginx_mod_h264_streaming-2.2.7
--add-module=./../nginx_upstream_hash-0.3.2
--add-module=./../ngx_devel_kit/ --add-module=./../ngx_http_mp4frag/
--add-module=./../nginx-upload-module-2.2
--add-module=./../lua-nginx-module
--add-module=./../redis2-nginx-module-0.10
--add-module=./../set-misc-nginx-module-0.22rc8
--add-module=./../nginx-ctpp --add-module=./../xss-nginx
--prefix=/etc/nginx/ --sbin-path=/usr/sbin/nginx
--conf-path=/etc/nginx/nginx.conf --error-log-path=/var/log/nginx/error.log
--http-log-path=/var/log/nginx/access.log --pid-path=/var/run/nginx.pid
--lock-path=/var/run/nginx.lock
--http-client-body-temp-path=/var/cache/nginx/client_temp
--http-proxy-temp-path=/var/cache/nginx/proxy_temp
--http-fastcgi-temp-path=/var/cache/nginx/fastcgi_temp
--http-uwsgi-temp-path=/var/cache/nginx/uwsgi_temp
--http-scgi-temp-path=/var/cache/nginx/scgi_temp --user=nginx --group=nginx
--with-rtsig_module --with-select_module --with-poll_module --with-md5=YES
--with-http_addition_module --with-http_ssl_module
--with-http_realip_module --with-http_geoip_module
--with-http_addition_module --with-http_sub_module --with-http_dav_module
--with-http_flv_module --with-http_image_filter_module
--with-http_gzip_static_module --with-http_random_index_module
--with-http_secure_link_module --with-http_stub_status_module --with-mail
--with-mail_ssl_module --with-file-aio --with-ipv6 --with-http_xslt_module
--with-cc-opt='-O2 -g -pipe -Wall -Wp,-D_FORTIFY_SOURCE=2 -fexceptions
-fstack-protector --param=ssp-buffer-size=4 -m64 -mtune=generic'

В соответствующем location включены только limit_rate и mp4 опции.

-- 

Regards,
 Alexey Schurov
-------------- next part --------------
An HTML attachment was scrubbed...
URL: <http://mailman.nginx.org/pipermail/nginx-ru/attachments/20140930/6049d48d/attachment.html>


Подробная информация о списке рассылки nginx-ru