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

Комментарии 32

Надеюсь уже 12 добавлений в избранное, показатель того что мы ждем продолжения и деталей.
Тема интересная.
из продолжений интересует подробности конвертации и более подродно рассказать о настройках ffmpeg
>Надеюсь уже 12 добавлений в избранное
12 добавлений не показатель, 112 добавлений — вот показатель!
У меня единственный вопрос:…

Который отпал после вот этого пассажа:

Здесь есть один важный момент: session_id в самой форме нужно ставить вначало, потому что POST-запрос передает параметры в порядке их следования в HTML. То есть, если мы сделаем не так, в таком случае к node.js сначала прийдет сам файл, а потом session_id, что не есть хорошо.


> возможности безграничны

> нужно было как-то передать данные сессии на сервер node.js. Для этих целей использовался memcached.

Найдите противоречие
Можно загружать видео на один сервер, а запускать обработку на другом и т.д. (перекодировка на одном, раскадровка на втором, экстракт аудио на третьем) Т.е. распределить загрузку.
Вы упретесь в memcached. Чудес не бывает.

Остальное достигается какими угодно средствами, нетолько странной связкой php + memcached + nodejs
На счет memcached согласен, но все же это можно обойти. Это решение было взято, как «первое попавшееся». Сейчас, думаю, можно будет прибавить mysql, чтобы подстраховать memcached. Если вдруг будет много пользователей.
> Сейчас, думаю, можно будет прибавить mysql,
> возможности безграничны

Найдите противоречие.
Был бы рад выслушать идеи по улучшению.
Я не про улучшения. Я об излишнем энтузиазме. Особенно учитывая количество движущихся частей (php + memcached + nodejs + ffmpeg)
Насчет порядка полей в форме повеселили честное слово *Thumbs up*

<form method="post" action="http://nodeserver.com/?session_id=my_session_id">
  <input type="file" name="video"/>
  <input type="submit" name="submit"/>
</form>
У вас тормозит ресайз внутри самого ffmpeg, или самодельный?
Внутри самого ffmpeg. Для обработки видео использовался только он.
покажите работу с ффмпег и его опции сборки
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

а где вызов? Да и вы так сильно не любите ffplay, что 2 раза делаете --disable-ffplay? Это один из лучших плееров!
Не знал про 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;
};
а почему не mp4 контейнер выбрали?
Был выбор из двух: flv или mp4, в конечном итоге с этим будет работать flex-приложение. Честно скажу, не помню, почему именно flv, но кажется был какой-то глюк с mp4. Вообще ffmpeg тулза хорошая, но нюансов там хватает.
А зачем здесь node.js?
модно же :)
Чем предлагаете заменить?
ссм пост ниже
делал все тоже самое но средствами nginx + php без проблем:
загрузка ngx_http_upload_module
прогресс ngx_http_upload_progress_module
приватность ngx_http_accesskey_module
отдача видео ngx_http_flv_module

обработка видео ffmpeg на отдельном сервере

В данном случае обработка видео идет по ходу загрузки и на том же сервере, куда загружается видео.
значить вам повезло, что сервер мало загруженный.
Обработка видео — это операция требующая не мало процессорного времени, если ваш фронтэнд отжирает 100-120% на ядро, то обрабатывать на этом сервере и видею будет через-чур накладно.
У нас отдельно используются сервера под фронтенд, отдельно под обработку видео. Причем добавить новый сервер под видео — 5 минут. Используется Amazon EC2, там с этим просто.
Запросы загрузки кроссдоменные (easyXDM).
Идея поста интересная, хотелось бы увидеть пост с более подробным описанием.
Все здорово. Только зачем нужен node.js?
Зарегистрируйтесь на Хабре, чтобы оставить комментарий

Публикации

Истории