Хабр Курсы для всех
РЕКЛАМА
Практикум, Хекслет, SkyPro, авторские курсы — собрали всех и попросили скидки. Осталось выбрать!
Здесь есть один важный момент: session_id в самой форме нужно ставить вначало, потому что POST-запрос передает параметры в порядке их следования в HTML. То есть, если мы сделаем не так, в таком случае к node.js сначала прийдет сам файл, а потом session_id, что не есть хорошо.
<form method="post" action="http://nodeserver.com/?session_id=my_session_id">
<input type="file" name="video"/>
<input type="submit" name="submit"/>
</form>
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
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 + php и ffmpeg — часть первая