Он заточен под мое приложение, плюс нужен boostrap последний версии, и еще обернуто в requirejs, но в принципе может что-то и пригодится. Плюс я его еще не довел до ума.
Зато позволяет делать multiselect произвольных дат, можно выбирать диапазоны дат и работает на мобильном.
Код pastebin.com/6NBG0T2N
Пример stage.frimio.com/#/event/new/date (в консоли есть время создания, «new/date end — start»; учтите, что там разница 100мс потому что кроме datepicker в это время еще один скрипт рендерится за 40 мс).
Думаю, все библиотеки плюс-минус имеют тормоза, причем достаточно ощутимые. Например, недавно отлаживал тормоза на странице, js отрабатывал за полсекунды. С помощью профайлера установил, что datepicker создается за 200мс (!). Как такое возможно выпускать? С использованием того же Angular удалось создать свой велосипед, который работает за 50мс, что уже приемлемо, учитывая, что пользователь субъективно ощущает задержки более 100мс.
Мое мнение: некоторые автора библиотек выпускают их для галочки не заботясь ни о памяти, ни о скорости. Но есть и «нормальные» библиотеки.
Представилось: сидишь у себя в мастерской, тишина, мерное помигивание светодиодов, и вдруг ни с того, ни с сего такой концерт. Надо будет как-то на 1-е апреля пошутить.
У нас отдельно используются сервера под фронтенд, отдельно под обработку видео. Причем добавить новый сервер под видео — 5 минут. Используется Amazon EC2, там с этим просто.
Запросы загрузки кроссдоменные (easyXDM).
Был выбор из двух: flv или mp4, в конечном итоге с этим будет работать flex-приложение. Честно скажу, не помню, почему именно flv, но кажется был какой-то глюк с mp4. Вообще ffmpeg тулза хорошая, но нюансов там хватает.
Не знал про ffplay, нужно будет посмотреть.
Видео конвертируется следующим скриптом:
SourceProcessor.prototype.convertSource = function(onFile)
{
var self = this;
if(! self.hasVideo()) // Если нет видео - ничего не делаем
return this;
var needConvert = false // По умолчанию не надо конвертировать
, params = ['-i', (self.fb.WE ? self.fb.filename : '-')] // Файл берем либо из stdin либо из файловой системы
, size;
// Do we need to resize?
if(size = self.countVideoSize(self.getVWidth(), self.getVHeight(), self.MAX_WIDTH, self.MAX_HEIGHT))
{ // getVWidth(), getVHeight() - текущий размер, MAX_WIDTH = 800, MAX_HEIGHT = 450
var width = size[0], height = size[1];
if(self.getVWidth() > width || self.getVHeight() > height) // Если размер больше того, что есть, то конвертируем
{
params.push('-s', (width + 'x' + height));
needConvert = true;
}
}
// Do we need to change format?
// allowedVideoCodecs =
// ['flv1'
// , 'vp6f'
// , 'flv4'
// , 'h264']
if(! self.allowedVideoCodecs.has(self.getVCodec()))
{
params.push('-vcodec', self.DEFAULT_VIDEO_CODEC);
needConvert = true;
}
// Set default container
params.push('-f', 'flv');
// Detect new video bitrate
// Здесь вычисляем битрейт - сюда можете обратить внимание, я взял приблизительно, чтобы не снизить качество видео
// getVFrameRate() - количество фреймов
var newWidth = params.has('-s') ? width : self.getVWidth()
, newHeight = params.has('-s') ? height : self.getVHeight()
, bitrate = Math.round( ( newWidth * newHeight * self.getVFrameRate() * 4 * 0.07 ) / 1000 );
params.push('-vb', (bitrate + 'k'));
// If there is audio convert to proper format
if(self.hasAudio())
{// Если есть аудио ставим нужный кодек/битрейт
params.push('-acodec', 'libfaac', '-ab', '256k');
}
// If there are subtitles - remove them
if(self.hasSubtitle())
{
params.push('-sn');
needConvert = true;
}
self.needConvert = needConvert;
// В итоге, если нужна конвертация будет примерно так:
// ffmpeg -i - -s 800x450 -vcodec libx264 -f flv -vb 2000k -acodec libfaac -ab 256k -sn pipe:1
onFile((new VideoFile(self.fb)).setParams(params).needConvert(needConvert).afterProcess(self.readFromFS).start());
return this;
};
На счет memcached согласен, но все же это можно обойти. Это решение было взято, как «первое попавшееся». Сейчас, думаю, можно будет прибавить mysql, чтобы подстраховать memcached. Если вдруг будет много пользователей.
Можно загружать видео на один сервер, а запускать обработку на другом и т.д. (перекодировка на одном, раскадровка на втором, экстракт аудио на третьем) Т.е. распределить загрузку.
Не ПО нужно замещать, а кого-то другого...
Зато позволяет делать multiselect произвольных дат, можно выбирать диапазоны дат и работает на мобильном.
Код pastebin.com/6NBG0T2N
Пример stage.frimio.com/#/event/new/date (в консоли есть время создания, «new/date end — start»; учтите, что там разница 100мс потому что кроме datepicker в это время еще один скрипт рендерится за 40 мс).
Мое мнение: некоторые автора библиотек выпускают их для галочки не заботясь ни о памяти, ни о скорости. Но есть и «нормальные» библиотеки.
, что позволяет вывести переменную $kolichectvo в PHP игнорируя ошибки.
Наверное у них был исходник интернет-магазина.
Запросы загрузки кроссдоменные (easyXDM).
Видео конвертируется следующим скриптом: