вторник, 9 декабря 2008 г.

SXEmacs - Unix-way

Bloated software

Часто приходится слышать, что Емакс это не Unix-way, но так как он огромен, то в Емакс можно всё, иногда даже говорят, что Емакс это целая операционная система.

Да, GNU Emacs огромен, ибо подход выбран доставлять до пользователя максимально укомплектованный дистрибутив. В SXEmacs выбран другой подход — предоставить пользователю небольшой дистрибутив и лёгкий способ установки пакетов. Напомню, что в SXEmacs (в отличии от XEmacs), при поддержке ffi-curl, можно начать устанавливать пакеты без наличия каких-либо предустановленных пакетов. Так каким образом в дистрибутиве размером 9Mb может быть всё? Его там нет. Зато в Unix-like системе есть всё.

Вернёмся к изначальному вопросу. Емакс это и есть Unix-way в чистом виде и в Емакс можно всё потому и только потому, что в Unix-like системе можно всё, то есть Емакс это добротный унифицированный пользовательский интерфейс к Unix-like системе.

Давеча, экспериментируя с отображением видео, я добился таки показа видео в обычном glyph посредством xlib-ffi, но далеко не был удовлетворён. Я нутром чувствовал неправильность, хотя результаты были просто потрясающими. А смущало меня наличие mplayer — отличного средства для проигрывания видео. Памятуя совет из SICPмысли отталкиваясь от желаемого (wishful thinking)1, я всё мечтал, чтобы видео в glyphе отображал mplayer, а не сам SXEmacs. И в итоге додумал как это можно сделать! Этот способ работает как в SXEmacs так и в XEmacs, хотя в XEmacs есть небольшие ограничения. Итак, код:

(defun lg-video-glyph (file &optional w h)
  "Create video glyph to play FILE.
Optionally you can specify width and height by passing W and H args."
  (let* ((gg (make-glyph [subwindow]))
         (prc (start-process "mplayer" nil "mplayer"
                             "-wid" (int-to-string
                                     (subwindow-xid
                                      (glyph-image-instance gg)))
                             (expand-file-name file))))
    (resize-subwindow
     (glyph-image-instance gg) (or w 200) (or h 140))
    (put gg 'mplayer-proc prc)
    gg))

(setq gg (lg-video-glyph "~/video/kids/kung-fu-panda.mp4"))
(set-extent-end-glyph
 (make-extent (point) (point))
 gg) 

конечно, укажите не ~/video/kids/kung-fu-panda.mp4, а реальный какой-нибудь файл с видео, который у вас есть. Появившийся, после выполнения s-exp с set-extent-end-glyph, glyph можно изменять в размерах при помощи:

(resize-subwindow (glyph-image-instance gg) WIDTH HEIGHT) 

Заметим также, что если навести мышкой на этот glyph, то можно управлять программой mplayer как обычно, т.е. делать перемотку, паузить, менять громкость и т.д. Должен работать и OSD.

В XEmacs вы можете обнаружить, что glyph становится микроскопическим (20x20) если изменить размер фрейма XEmacs. Эта неприятность была исправлена в SXEmacs.

Есть и ещё проблема. Как нам определить размер видео фрейма, чтобы выставить размеры glyphа, соблюдающие пропорцию? Можно, конечно, разобрать вывод программы mplayer, но что если формат вывода будет изменён2? Нет, нужно что-то более подходящее. В SXEmacs есть такая вещь как media-stream, воспользуемся этой возможностью:

(make-media-stream :file "~/crypt/video/kung-fu-panda.mp4" 'ffmpeg)
=>
#<media-stream :kind #<file "/home/lg/crypt/video/kung-fu-panda.mp4">
  #<media-substream :type #<video mov,mp4,m4a,3gp,3g2,mj2
                            (h264), 720x304 (2.37/1)>>
  #<media-substream :type #<audio mov,mp4,m4a,3gp,3g2,mj2
                            (mpeg4aac), stereo, 48000 Hz, 16 Bit>>
  driven by ffmpeg> 

как видим, информация о размере фрейма у нас имеется, в моём случае это 720x304.

У многих может возникнуть резонный вопрос «зачем в SXEmacs отображать видео?», некоторые даже могут подумать, что это идиотизм. Но представим, что есть «сумасшедший», который решил написать клиента для обмена сообщениями, работающего под SXEmacs. Причём сообщением может быть не только коротенький текст, но и голос или видео+голос или даже объект векторной графики. mplayer умеет принимать данные из stdin, поэтому вырисовывается неплохая схема медиа потоков.

SXEmacs media streams

Схема медиа потоков в SXEmacs

Опять же может возникнуть вопрос зачем такой клиент в SXEmacs, ведь есть XXX. Да, как отдельный компонент, возможно, задающие вопрос правы, но если этот клиент будет частью системы для совместной разработки (collaborative development), то уже не так очевидно. Понятно, что в системе совместной разработки должны присутствовать компоненты:

  • Мощный текстовый редактор ;)
  • Средство для совместного редактирования файлов
  • Средство для обмена сообщениями: текстовыми, голосовыми, видео
  • Средства для мозгового штурма — совместная доска для рисования, писания, черкания и т.д.
  • Система контроля версий

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

Основной же вывод из примера с видео-glyph я хочу сделать, что SXEmacs — это и есть Unix-way как он задумывался изначально.


1В русском переводе SICP «wishful thinking» переведено как «мечтать не вредно».
2Стандартизированный ввод и вывод программ это тоже один из аспектов Unix-way.

ReST source Скачать оригинал

3 комментария:

Ilya Zonov комментирует...

Здравствуйте! Вопрос слегка так не по теме )
В чем нарисована "Схема медиа потоков в SXEmacs"? Просто понравилось как это выглядит, надо самому для курсача несколько сделать!

lg комментирует...

В Inkscape - отличный софт, только вот памяти кушает ай-яй-яй

облако выдернул из Cisco-сеть элементов Dia

исходник схемы можно скачать тут

откуда, кстати, узнали про этот blog?

Ilya Zonov комментирует...

Отлично! Буду копать, учится схемы рисовать )
Читаю "Русскую планету Emacs". Оттуда и вышел на этот блог.