вторник, 5 июля 2011 г.

[Видео]Буратино сам себе злобный

Сегодня мы на пальцах рассмотрим столь сложное действо, как запись и примитивный постмастеринг видео.

Записать видео очень просто - достаточно скачать и установить утилиту FRAPS. После установки и запуска в программе настроить параметры видео:


Запись будет вестись при нажатии кнопки «F9» или любой другой, которую назначите. Остановка записи - та же кнопка. Записанные файлы будут в указанной папке.

Теперь, когда у нас есть записанный файл невероятного размера, нужно что-то с ним сделать - обрезать лишнее в картинке, вырезать лишний видеоряд, сжать наконец, чтобы залить на тот же YouTube.

Для этих операций мы возьмем довольно популярный, бесплатный и простой линейный видеоредактор VirtualDub. Скачиваем, распаковываем и запускаем:


Затем открываем в нем наш видеофайл (File -> Open):


Работу над файлом начнем с подготовки картинки, а именно обрезке всего ненужного (окна клиента, сообщений и т.п. «мусора»). Для этого идем в меню «Video» и выбираем пункт «Filters»:


В открывшемся окошке нажимаем кнопку «Add», откроется список доступных фильтров, где нужно найти и выбрать «Null transform». Это «пустой» фильтр, который не делает с изображением ровным счетом ничего, но нужен нам, чтобы обрезать картинку:


Выбрав фильтр, нажимаем на кнопку «Cropping» и в открывшемся окне настраиваем поля кадрирования, которые будут вырезаны при процессинге ролика:


Настроив кадрирование, опять нажимаем кнопку «Add» и выбираем фильтр «Resize». Этот фильтр позволит нам уменьшить изображение, заодно и поместить в «стандартный» кадр. Я выбираю обычно размер 640х480, чего вполне хватает для видеохостингов. Тут вы сами определите для себя, какого размера вам нужен результирующий кадр:


Настроив фильтры, настроим параметры кодирования (сжатия) видео. Идем в тот же пункт меню «Video», убеждаемся, что пункт «Full processing mode» активен (если нет - включите) и выбираем «Compression»:


Откроется окно выбора кодеков, для простоты можно брать стандартный кодек от «Microsoft», он хорошо известен обработчикам видеохостингов. Если нужно, измените параметры кодирования, но можно все оставить, как есть, это на сегодня не слишком принципиально. Скажу только, что чем больше параметр «Data Rate», тем видео кодируется более тщательно, но и размер результирующего файла также возрастает:


Далее в меню «Audio» устанавливаем «Full processing mode», нажимаем «Compression»:


Выбираем звуковой кодек - здесь я тоже беру стандартный «Lame MP3» и настраиваем его параметры. Качества 128 кбит/c вполне хватит для нашего видео:


Теперь осталось подредактировать сам видеоряд, вырезав ненужное. Для этого существуют специальные маркеры (стрелочки). Ставите курсор на то место, откуда резать, жмете стрелку, смотрящую влево, затем на то место, до куда резать, жмете стрелку, смотрящую вправо. Кусок таймлайна выделится и обыкновенной кнопкой «Del» его можно удалить:


Все, можно запускать процессинг и ждать результатов. Идем в меню «File» и выбираем «Save». Появится окно с информацией о ходе процессинга и когда оно автоматически закроется, ваш файл готов. В окне можно посмотреть ожидаемый размер видеофайла, который получится в результате и много другой полезной информации, о назначении которой вы можете поинтересоваться самостоятельно:


К слову сказать, этот видеоредактор обладает куда большими возможностями, чем понадобилось нам в рамках этой статьи, но это уже совершенно другая история.

воскресенье, 27 марта 2011 г.

[SLifeHack] Лечим душную жабу

Часто бывает так: приходишь куда-нибудь, включаешь местное радио (медиа), а там играет нечто приятное, слух ублажающее и душу бередящее. И хочется, ох как хочется узнать, что же это такое играет, какое радио, откуда берется, но... Злой и противный аватар, хозяин земли, подло скрыл ссылку на поток, чтобы никому не досталось, чтобы приходили к нему и только к нему слушать и наслаждаться.

Наверняка же каждый бывал в подобной ситуации, не так ли?

К счастью, по недосмотру или умыслу какому программистов «Linden Lab» есть возможность восстановить попранную справедливость и узнать-таки вожделенный адрес столь волнующего радио. Я даже предложу вам пару способов на выбор - простой и, если он по какой-либо причине не сработает, чуть более сложный, самую малость.

Итак, открываем свойства земли, свойства аудио и - видим знакомую картину.


Теперь берем и нажимаем секретную комбинацию клавиш: Ctrl-Alt-V. Прошу обратить внимание, что эта комбинация сработает только в том случае, если у вас включено advanced-menu¹ (это видно по верхнему меню клиента, там должен быть пункт «Advanced»). Рядом должен появиться пункт «Admin» - значит, все получилось и можно открыть снова свойства земли, вкладку аудио и скопировать открывшийся URL аудиопотока себе.

Вообще включение отображения административных функций клиента даёт ряд дополнительных возможностей, но об этом как-нибудь в другой раз. Если вдруг решите поисследовать их самостоятельно, сразу хочу предупредить, что очень большое количество вновь открывшихся функций работать не будут - для этого нужно иметь фамилию Linden или, на худой конец, быть симовладельцем.

Если по какой-то причине фокус с админскими опциями у вас не получился (может быть, клиент так себя повел, вмешалась третья липовая сила или инопланетяне из космоса хорошо защитили свой аудиопоток от любопытных читателей моего блога - всякое может случиться), то есть немного более сложный способ получить желаемое. Для этого служит другая комбинация клавиш, не менее волшебная.

Жмём Ctrl-Shift-4 и на экране появляется окошко, чуть более, чем полностью набитое чудовищной абракадаброй, которая с приличной скоростью проносится перед глазами.


Теперь не зевайте - тыкайте мышом в кнопку запуска проигрывания музыки и сразу ищите строчки, похожие на те, что я заботливо выделил для вас приятной глазу зелёной рамочкой. Это и есть адрес искомого радиопотока. Скопировать, к сожалению, адрес не удастся, поэтому придется быстренько его куда-нибудь переписать вручную.

Все, теперь можно той же комбинацией клавиш отключить это пугающее окно, вернув экран в привычный глазу вид, глубоко вздохнуть и использовать полученный адрес по своему усмотрению. Я, к примеру, скармливаю их известному плееру. Кстати, звучат там радиопотоки не в пример лучше.


Listen and enjoy!


¹ Advanced-menu в большинстве клиентов включается комбинацией клавиш Ctrl-Shift-Alt-D

суббота, 26 марта 2011 г.

Разбираем старый хлам (скрипт-кладовщик)

Вы давно вдумчиво заглядывали в свой инвентарь?

Я периодически заглядываю и ужас меня берет ледяными пальцами за самое естество. Ведь чем больше объектов лежит у нас в инвентаре, тем большие лаги это вызывает. Почему так происходит, позвольте не объяснять в рамках данной статьи - это отдельная «наука» о хранении предметов в SL в принципе... Сегодня мы просто попытаемся как-то систематизировать и даже заархивировать то барахло, которое нам жалко выбросить, но и место оно занимает, собирая виртуальную пыль.

Ни для кого не секрет, что можно создать банальный кубик и в его инвентарь напихать довольно много всяческих причиндалов: скины, текстуры, скрипты и т.п. В общем все, что может лежать в инвентаре, может быть сохранено в кубике. Таким образом, имея некоторое количество предметов в инвентаре, можно заменить их на один, поместив их все в его инвентарь.


Допустим, мы разложили это все по кубикам и у нас полный порядок в этом вопросе. Но как потом разобраться, по прошествии времени, что где лежит, в каком количестве? Да, конечно, мы будем называть наши кубики-коробки должным образом, но это зачастую малоинформативно по той простой причине, что приходится сильно обобщать.

Например, ящик с оружием, который называется... «Weapons». Внезапно, не правда ли? ;) Или вот они, коробочки наши, стоят, а где и что - нужно нажать Ctrl-3, ткнуть каждую мышом, чтобы хотя бы прочитать, как они называются.

Давайте упростим себе жизнь, используя скрипты - кровь этого нарисованного мира.

Итак, что же должен уметь наш скрипт? Как минимум, он должен уметь:
  1. Динамически отображать название коробки in-world
  2. Динамически же отображать количество содержимого
  3. Выдавать список своего содержимого владельцу
  4. Самостоятельно распаковываться в инвентарь в случае необходимости
Конечно же, скрипт может уметь ещё много чего, но сейчас не будем загружать себе голову, реализуем только эти основные функции, которые мы для себя определили.

Для этого нам в основном понадобятся следующие функции встроенного скриптового языка LSL:
  1. llSetText()
  2. llGetObjectName()
  3. llGetInventoryNumber()
  4. llDialog()
  5. llListen()
  6. llListenRemove()
  7. llSetTimerEvent()
  8. llDetectedKey()
  9. llGetOwner()
  10. llOwnerSay()
  11. llGetScriptName()
  12. llGiveInventoryList()

Конечно, я буду использовать в примере несколько большее количество функций, но это скорее для эстетики, можно обойтись и без них, упростив отдельные конструкции.

Итак, сделаем для начала, чтобы наша коробочка могла при помощи всплывающего текста обозначать своё название. Для этого определяем пользовательскую функцию setName() и будем потом её вызывать, когда нам понадобится изменить надпись.


Теперь нужно научить нашу коробку подсчитывать, какое количество объектов есть у нее в инвентаре, а также следить за тем, не изменилось ли их количество, ну и сообщать нам при помощи всё того же всплывающего текста. Для этого мы несколько модернизируем нашу функцию.


Обратите внимание - мы вычитаем из содержимого переменной objNum единичку. Это сделано для того, чтобы корректно отображать количество инвентаря, ведь наш управляющий скрипт по сути также является объектом инвентаря, но как бы «не считается».

Если мы что-то добавляем или удаляем из инвентаря объекта, то происходит событие changed(), которым мы воспользуемся для вызова нашей пользовательской функции и пересчета количества содержимого инвентаря.


Для проверки добавим в инвентарь нашей коробки какой-нибудь объект, произойдет событие, которое вызовет определённую ранее функцию и она отобразит корректные данные. Хочу обратить внимание на то, что возвращаемое событием число является битовым полем, из которого при помощи оператора ветвления мы вычисляем бит нужного нам события - изменения инвентаря.

К сожалению, нет события, которое бы отслеживало изменение такого параметра, как смена имени объекта. Но мы обойдем это ограничение, что называется, «малой кровью» - не важно, когда изменилось имя, важно, чтобы при следующем доставании этой коробки имя отображалось корректно.

Для этого воспользуемся событием on_rez(), возникающим всегда, когда вы что-то достаёте из своего «кармана» и кладете на землю. Нужно лишь просто при возникновении этого события еще раз вызвать нашу функцию setName() ;)


Иными словами, вы меняете название коробки в её свойствах, кладёте ее «в карман», а когда в следующий раз достанете, то подписана она будет уже тем именем, которое вы ей дали.

Ну вот, нам осталась самая малось - научить коробку сообщать выдавать список своего содержимого и распаковываться автоматически красивой папочкой. Сделать это можно разными способами, но мы сделаем это красиво при помощи милого голубого меню, хорошо знакомого всем аватарам.


Мы использовали событие touch(), возникающее каждый раз, когда кто-то ткнет мышом в объект. Из данных, возвращаемых этим событием мы получаем ключ кликнувшего аватара и сравниваем с ключем владельца коробки. Если все совпадает, выдаем владельцу менюшку.

И здесь хочу обратить внимание на конструкцию с использованием события timer(). При вызове меню мы инициализируем обратный отсчет времени, равный 30 секундам и начинаем слушать канал чата. Когда 30 секунд истекают, мы сообщаем об этом владельцу коробки и перестаем слушать чат. Делается это для того, чтобы снизить нагрузку на сим и, как следствие, уменьшить лаги, которых и без того хватает в избытке от гламурных кис с их АО'шками и любителей всевозможных псевдозащитных гаджетов.

Ещё один немаловажный момент - переменные, содержащие номер канала и его идентификатор должны быть определены, как глобальные, поскольку используются в разных местах скрипта и не должны потерять своих значений.

И вот она, финишная прямая - осталось дописать обработчики кнопок меню. Начнем с выдачи списка предметов. Для этого определим еще одну функцию, которую назовем... Да чего мудрствовать лукаво, мы же не Ed7v Resident с его cunt'овской философией - пусть функция называется listInventory().


Мы также не включаем в список содержимого коробки наш управляющий скрипт, кроме того, эта функция уже не тихо сама с собою что-то делает, а имеет тип и возвращает значение в соответствии со своим типом, в данном случае массив со списком.

Возвращаемся к обработчику меню - здесь нам поможет событие listen(), происходящее каждый раз, когда кто-то или что-то говорит в чат, причем, без разницы, на каком канале. При условии, что мы вообще слушаем чат (а мы его слушаем 30 секунд после вызова меню, помним об этом).


Послушали, поняли, что говорят нам и говорит тот, кого нужно слушать, распознали, какую кнопку нажали и - ответили нужным действием, пока что прочитали в приват владельцу коробки её содержимое. Вообще давать служебную информацию в личку владедельцу - правило хорошего тона. Когда объекты загаживают чат флудом есть путь неверный и ведет на тёмную сторону Силы, помните об этом.


Всё, играем коду, выходим на прямой - обрабатываем распаковку в красивую папочку буквально одной волшебной функцией.


И вуаля! Содержимое коробки у нас снова в инвентаре целиком и полностью, за исключением управляющего скрипта.


Вот, собственно, всё, что я хотел сегодня показать и рассказать. Описанный скрипт же можно изготовить самостоятельно, руководствуясь этой статьёй, либо приобрести всего за L$150 на маркетплейсе, ибо вещь полезная и в хозяйстве сгодится если не любому, то каждому.