Как стать автором
Обновить
8
0

Пользователь

Отправить сообщение
Я когда открывал фирму, хотел ее назвать IDDQD, но оказалось, что фирма с таким названием уже есть в моем городе.
Он заточен под мое приложение, плюс нужен 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мс.
Мое мнение: некоторые автора библиотек выпускают их для галочки не заботясь ни о памяти, ни о скорости. Но есть и «нормальные» библиотеки.
Может я ошибаюсь, но первый скриншот больше похож на JS+PHP+HTML. Там читается
<?=@$kolichectvo?>

, что позволяет вывести переменную $kolichectvo в PHP игнорируя ошибки.
Наверное у них был исходник интернет-магазина.
Представилось: сидишь у себя в мастерской, тишина, мерное помигивание светодиодов, и вдруг ни с того, ни с сего такой концерт. Надо будет как-то на 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;
};
ffmpeg version N-35482-gb404ab9, Copyright (c) 2000-2011 the FFmpeg developers
  built on Dec  7 2011 01:14:33 with gcc 4.4.5 20110214 (Red Hat 4.4.5-6)
  configuration: --enable-gpl --enable-nonfree --enable-postproc --enable-avfilter --enable-pthreads --enable-libxvid --enable-libx264 --enable-libmp3lame --enable-libfaac --disable-ffserver --disable-ffplay --enable-libtheora --enable-libvorbis --disable-ffplay --enable-shared
  libavutil    51. 30. 0 / 51. 30. 0
  libavcodec   53. 41. 0 / 53. 41. 0
  libavformat  53. 24. 0 / 53. 24. 0
  libavdevice  53.  4. 0 / 53.  4. 0
  libavfilter   2. 51. 0 /  2. 51. 0
  libswscale    2.  1. 0 /  2.  1. 0
  libpostproc  51.  2. 0 / 51.  2. 0

Внутри самого ffmpeg. Для обработки видео использовался только он.
Был бы рад выслушать идеи по улучшению.
На счет memcached согласен, но все же это можно обойти. Это решение было взято, как «первое попавшееся». Сейчас, думаю, можно будет прибавить mysql, чтобы подстраховать memcached. Если вдруг будет много пользователей.
Можно загружать видео на один сервер, а запускать обработку на другом и т.д. (перекодировка на одном, раскадровка на втором, экстракт аудио на третьем) Т.е. распределить загрузку.

Информация

В рейтинге
Не участвует
Откуда
Украина
Дата рождения
Зарегистрирован
Активность