mp4 pseudostreaming with proxy_pass and slice

Eugene Mychlo myc на cname.me
Пт Мар 18 08:38:37 UTC 2016


> 18 марта 2016 г., в 10:53, Anatoliy Korostelevm, NGENIX <a.korostelev на ngenix.net> написал(а):
> 
> Все работает как и запланировано - если я шлю с клиента на nginx Range-запрос, nginx и клиент получат необходимую часть данных, выравненных по размеру slice. Однако, хотелось бы получать порцию необходимых данных. использую не только Range-запросы, но и явно указывая в URI момент начала (и возможно конца)  видео. Например, чтобы при запросе к nginx вида http://mynginx.server/test.mp4?start=40 хотелось бы что nginx преобразовывал start=40 в соответствующий Range-запрос к бэкенду и выкачивал только необходимые данные. Я добавил в конфигурацию своего location параметр mp4 для этого, однако, как выяснилось, mp4 не совместим с proxy_pass. Подскажите, кто-то реализовывал на nginx что-то подобное, и если реализовал то как? Или единственный путь, это писать данную возможность самому (на lua, ngscript, своим модулем, etc)?

1. mp4-модуль - это контент-хендлер. Он умеет работать только с локальными файлами.
Модуль реализует протокол progressive download.
Progressive download - это костыль, необходимый только флешу для быстрой перемотки, т.к. флеш не умеет делать range-запросы.
Можно во флеш-плеере передавать range в аргументах (на стороне сервера это понимать и отдавать нужный фрагмент),
а потом на стороне плеера собирать файл.
Однако это потребует доработок плеера. Не уверен, что вам нужно это.

2. slice-модуль - это фильтр. Он работает уже после контент-хендлера (значение $slice_range может формироваться раньше).
С mp4 модулем он работать не может. :)
Однако передать range в аргументах все же можно.
Для этого нужно сформировать заголовок Range где-нибудь на REWRITE_PHASE.
Это можно сделать lua (про ngscript не скажу)


--
Regards,
Eugene Mychlo MYC-RIPE EAMYC-RIPN



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