Comments 32
Надеюсь уже 12 добавлений в избранное, показатель того что мы ждем продолжения и деталей.
Тема интересная.
Тема интересная.
У меня единственный вопрос:…
Который отпал после вот этого пассажа:
Который отпал после вот этого пассажа:
Здесь есть один важный момент: session_id в самой форме нужно ставить вначало, потому что POST-запрос передает параметры в порядке их следования в HTML. То есть, если мы сделаем не так, в таком случае к node.js сначала прийдет сам файл, а потом session_id, что не есть хорошо.
> возможности безграничны
> нужно было как-то передать данные сессии на сервер node.js. Для этих целей использовался memcached.
Найдите противоречие
> нужно было как-то передать данные сессии на сервер node.js. Для этих целей использовался memcached.
Найдите противоречие
Можно загружать видео на один сервер, а запускать обработку на другом и т.д. (перекодировка на одном, раскадровка на втором, экстракт аудио на третьем) Т.е. распределить загрузку.
Вы упретесь в memcached. Чудес не бывает.
Остальное достигается какими угодно средствами, нетолько странной связкой php + memcached + nodejs
Остальное достигается какими угодно средствами, нетолько странной связкой php + memcached + nodejs
Насчет порядка полей в форме повеселили честное слово *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;
};
А зачем здесь node.js?
делал все тоже самое но средствами nginx + php без проблем:
загрузка ngx_http_upload_module
прогресс ngx_http_upload_progress_module
приватность ngx_http_accesskey_module
отдача видео ngx_http_flv_module
обработка видео ffmpeg на отдельном сервере
загрузка ngx_http_upload_module
прогресс ngx_http_upload_progress_module
приватность ngx_http_accesskey_module
отдача видео ngx_http_flv_module
обработка видео ffmpeg на отдельном сервере
В данном случае обработка видео идет по ходу загрузки и на том же сервере, куда загружается видео.
значить вам повезло, что сервер мало загруженный.
Обработка видео — это операция требующая не мало процессорного времени, если ваш фронтэнд отжирает 100-120% на ядро, то обрабатывать на этом сервере и видею будет через-чур накладно.
Обработка видео — это операция требующая не мало процессорного времени, если ваш фронтэнд отжирает 100-120% на ядро, то обрабатывать на этом сервере и видею будет через-чур накладно.
Идея поста интересная, хотелось бы увидеть пост с более подробным описанием.
Все здорово. Только зачем нужен node.js?
Sign up to leave a comment.
Потоковая загрузка и обработка видео посредством node.js + php и ffmpeg — часть первая