В поликлинике, где я работаю, установлено информационное табло.
Его установили с целью демонстрации роликов с сайта МЗНСО (www.miac-nso.ru). Мы решили немного развить эту идею и показывать ролики передач о здоровье, свои ролики, мультики и объявления. Таким образом была поставлена задача - каждый день показывать новый видеоряд роликов. Вот условия, предъявленные к показу роликов:
Таким образов плей-лист должен формироваться каждый день и выглядеть так:
Его установили с целью демонстрации роликов с сайта МЗНСО (www.miac-nso.ru). Мы решили немного развить эту идею и показывать ролики передач о здоровье, свои ролики, мультики и объявления. Таким образом была поставлена задача - каждый день показывать новый видеоряд роликов. Вот условия, предъявленные к показу роликов:
- Ролики распределяются по группам
- Передачи о здоровье
- Ролики с сайта МЗНСО
- Реклама смотрового кабинета
- Мультики (смешарики, лунтик, Маша и медведь)
- Все это чередовать одно с другим и зациклить по кругу
- После каждого ролика - показ объявлений поликлиники.
передача о здоровье
объявления
ролик с сайта МЗНСО
объявления
ролик поликлиники (реклама смотрового)
объявления
мультик
объявления
Первой мыслью было использовать powershell, но немного подумав, я решил использовать nodeJS.
Идея в принципе простая - для каждой группы роликов создать свою директорию, потом программно пробегать по этим директориям в заданном порядке, брать из каждой директории случайным образом название ролика и вставлять запись о нем в playlist.
В итоге получилась такая структура каталогов:
notice - содержит видео с объявлениями
videos - группы роликов. Название каждой группы начинается с цифры для того, чтобы управлять порядком этих роликов в плей-листе (сначала ролик из папки 01_tv, потом из 02_miac и т.д.)
Сам плей-лист лежит в папке gp26_videos.
В качестве проигрывателя решил использовать media player classic home cinema (http://mpc-hc.org/).
В документации к плееру написано как вызвать плеер из командной строки с указанием плей-листа и задать полноэкранный режим показа (mpc-hc.exe /fullscreen /play dir/playlist.mpcpl).
Эта система будет работать в window 7, так что необходимо было средствами системы организовать поочередное выполнение следующий действий.
- Запуск программы для формирования плей-листа.
- Запуск проигрывателя с новым плей-листом.
Единственное - надо разрешить выполнение скриптов powershell. Для этого - запустить под админом powershell и выполнить set-executionpolicy remotesigned .
Система получилась достаточно гибкая видео можно добавлять динамически, только надо соблюдать правила наименования роликов (нужно использовать только латинские буквы). Можно создавать новые каталоги с роликами и они будут участвовать в формировании плей-листа.
Основные параметры для программы формирования плей-листа я вынес в конфигурационный файл. Вот его содержание:
module.exports = {
// где находятся подкаталоги с видео
video_dir : 'd:/gp26_videos/videos/',
//где находится видео с объявлениями
gp26_notice : 'd:/gp26_videos/notice/mess.mpg',
// где находится плей-лист
plDir : 'd:/gp26_videos/'
}
Так же используется логирование для слежения за работой программы формирование плей-листа и фиксации ошибок.
Вот код программы формирования плей-листа:
var fs = require('fs');
var sys = require('sys');
var _ = require('underscore');
var winston = require('winston');
var logger = new (winston.Logger)({
transports: [
new (winston.transports.Console)(),
new (winston.transports.File)({ filename: 'log/pl.log' })
]
});
var config = require('config');
var pl = "MPCPLAYLIST";
var curStrPl = 0;
/**
* Создает запись в плей листе
* @param nStr номер записи в плей-листе
* @param subDir название директории
* @param callback
*/
function createRecord (nStr, subDir, callback) {
//1,filename,D:\gp26_videos\tv\vrachi_03102011.mp4
fs.readdir(config.video_dir + subDir, function (err, files) {
if (!err) {
pl += '\n' + nStr + ',type,0';
pl += '\n' + nStr + ',filename,' + config.video_dir + subDir + files[_.random(0, files.length - 1)];
pl += '\n' + (nStr + 1) + ',type,0';
pl +='\n' + (nStr + 1) + ',filename,' + config.gp26_notice;
callback(nStr);
} else {
logger.log('error', 'Create record: Error of ' + config.video_dir + subDir + ' read dir');
}
});
}
function createPl () {
fs.readdir(config.video_dir, function (err, subdirs) {
if (!err) {
// Обойти все подкаталоги и для каждого создать запись в плей-листе
_.each(subdirs, function (subdir, i) {
curStrPl++;
var nStr = i + curStrPl;
createRecord(nStr, subdir + '/', function (n) {
// Запись плей-лист на диск
if ((n + 1) === (subdirs.length * 2)) {
plName = 'playlist_gp26.mpcpl';
fs.open(config.plDir + plName,"w",0644, function (err, file_handle) {
if ( !err ) {
fs.write(file_handle, pl, null, 'ascii', function (err, writenn) {
if (!err) {
logger.log('info', 'Playlist ' + plName + ' created.');
}
});
} else {
logger.log('error', 'Record playlist: Error opening file ' + config.plDir + plName);
}
});
}
});
});
} else {
logger.log('error', 'Create playlist: Error of ' + config.video_dir + ' read dir');
}
});
}
createPl();
Вот код программы формирования плей-листа:
var fs = require('fs');
var sys = require('sys');
var _ = require('underscore');
var winston = require('winston');
var logger = new (winston.Logger)({
transports: [
new (winston.transports.Console)(),
new (winston.transports.File)({ filename: 'log/pl.log' })
]
});
var config = require('config');
var pl = "MPCPLAYLIST";
var curStrPl = 0;
/**
* Создает запись в плей листе
* @param nStr номер записи в плей-листе
* @param subDir название директории
* @param callback
*/
function createRecord (nStr, subDir, callback) {
//1,filename,D:\gp26_videos\tv\vrachi_03102011.mp4
fs.readdir(config.video_dir + subDir, function (err, files) {
if (!err) {
pl += '\n' + nStr + ',type,0';
pl += '\n' + nStr + ',filename,' + config.video_dir + subDir + files[_.random(0, files.length - 1)];
pl += '\n' + (nStr + 1) + ',type,0';
pl +='\n' + (nStr + 1) + ',filename,' + config.gp26_notice;
callback(nStr);
} else {
logger.log('error', 'Create record: Error of ' + config.video_dir + subDir + ' read dir');
}
});
}
function createPl () {
fs.readdir(config.video_dir, function (err, subdirs) {
if (!err) {
// Обойти все подкаталоги и для каждого создать запись в плей-листе
_.each(subdirs, function (subdir, i) {
curStrPl++;
var nStr = i + curStrPl;
createRecord(nStr, subdir + '/', function (n) {
// Запись плей-лист на диск
if ((n + 1) === (subdirs.length * 2)) {
plName = 'playlist_gp26.mpcpl';
fs.open(config.plDir + plName,"w",0644, function (err, file_handle) {
if ( !err ) {
fs.write(file_handle, pl, null, 'ascii', function (err, writenn) {
if (!err) {
logger.log('info', 'Playlist ' + plName + ' created.');
}
});
} else {
logger.log('error', 'Record playlist: Error opening file ' + config.plDir + plName);
}
});
}
});
});
} else {
logger.log('error', 'Create playlist: Error of ' + config.video_dir + ' read dir');
}
});
}
createPl();


Комментариев нет:
Отправить комментарий