Anatoly Vorobey (avva) wrote,
Anatoly Vorobey
avva

Category:

немного об уважении к пользователю

Не знаю, получится ли вкратце объяснить, но история поучительная (для программистов в основном, наверное).

Разнообразных форматов видео-файлов существует сейчас огромное количество. Как правило, видео-файл включает в себя информацию о картинке, определённым образом сжатую (видео-поток), информацию о звуке, определённым образом сжатую (аудио-поток); кроме того, они должны быть
соответствующим образом синхронизированы и сохранены вместе внутри одного файла. На всё это - способ сжатия видео, способ сжатия аудио, способ их соединения вместе (называется muxing или multiplexing) - существует множество разных стандартов и алгоритмов. Кроме того, либо в самом видео-файле, либо в отдельных файлах могут присутствовать субтитры; они могут быть записаны как в виде текстового потока, определённым образом синхронизированного с секундами видео-потока, так и в качестве отдельных картинок, тоже синхронизированных. На всё это тоже есть штук 5 разных популярных стандартов.

В сети, особенно в сетях файлообмена P2P, существует огромное количество разнообразных файлов, записанных с применением десятков таких разных стандартов. Всё это надо как-то проигрывать и показывать пользователям, на экранах компьютеров, телевизоров и проекторов. Под Windows большинство пользователей запускают Windows Media Player, но для того, чтобы он читал большинство популярных в сети форматов, нужно сгрузить и установить в него множество разных плагинов, которые называются "кодеки" (codec). Под Линуксом существует много разных библиотек и относительно немного больших удобных программ, которые умеют понимать и показывать почти все форматы.

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

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


Представьте себе, что вы запускаете программу, прося её показать какой-то, например, фильм, и потом выбираете опцию "Full screen" (кнопка f в программах mplayer и xine, есть, кроме того, и опция в меню и в командной строке), чтобы расширить картинку до максимума. В моём случае картинка идёт на подключенный к компьютеру телевизор, но многие смотрят фильмы прямо на мониторах, если это достаточно удобно; полезная опция, одним словом.

Когда вы выбираете эту опцию, программа "забирает" себе всё пространство экрана, и пытается расширить картинку до максимума так, чтобы она в него влезла. Но если вы смотрите широкоформатный фильм, и даже некоторые TV-форматные записи, то после такого расширения у вас всё равно останется "лишнее пространство" снизу и сверху кадра: отношение ширины к высоте больше у кадра фильма, чем у вашего монитора (точнее, чем у разрешения вашего монитора, например, 640x480 или 800x600).

Например, предположим, что у кадра фильма отношение ширины к высоте составляет 1.85:1, а ваш монитор находится в разрешении 800x600. Тогда после того, как картинка расширится до предела, её высота будет составлять 800/1.85 = 432 пикселя, т.е. полоса в 168 пикселей высотой будет оставаться неиспользованной - точнее, обычно две полосы, 84 сверху и 84 снизу кадра.

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

Программа xine это делает сама по умолчанию. Тут всё очень просто: если запустить её и переключить в full-screen режим, она просто начинает писать субтитры в нижнюю часть экрана, а не в нижнюю часть кадра, который стоит посреди экрана; и всё отлично. А вот mplayer так не умеет; если запустить его и сделать full-screen режим, он продолжает писать субтитры в нижнюю часть кадра, оставляя чёрную полосу ниже неиспользованной. И это очень раздражает: ведь есть уже это место, ясно, что он может - но не пишет.

Почему так получается? Когда я перевожу программу в режим full-screen, я как бы заставляю её разграничить два понятия, которые в обычном режиме у неё совпадают: понятие прямоугольника на экране, куда проецируется картинка, и понятия прямоугольника на экране, который программа контролирует. В режиме full-screen программа "занимает" весь экран, закрывая чёрным цветом даже те его части, которые не попадают в область расширенной картинки. Но при этом, очевидно, внутри программы xine эта более широкая область существует в качестве отдельного понятия - понятия области, где программа может что-то рисовать, даже если она выходит за пределы кадра. А во внутренностях mplayer этого нет, он не умеет рисовать нечто, относящееся к фильму, за пределами прямоугольника кадра фильма. Для его модуля-"проектора" существует только этот прямоугольник кадра; "зачернение" оставшихся полос в режиме full-screen происходит где-то в другом месте, и информация об этом не передаётся модулю-"проектору".

Мораль ясна: в этой области внутренний дизайн xine продуман явно лучше внутреннего дизайна mplayer, и это отражается на том, что может и чего не может сделать пользователь, самым непосредственным образом.

Но это ещё не всё. На самом деле в mplayer есть возможность сделать то же самое, но несколько другим способом. Перед тем, как раскодированная и расширенная до нужного размера картинка "поступает" на передачу на экран к модулю-"проектору", mplayer позволяет пропустить её через множество разного рода фильтров, в которых можно задать (в командной строке) всякие простые визуальные эффекты и преобразования. Одна из таких опций - возможность искусственно "расширить" кадр за счёт чёрных полос, не меняя его содержимое. Тогда получается вот что: кадр, скажем, сам размером 800x432, но путём искусственого добавления тёмных полос сверху и снизу я превращаю его в кадр размером 800x600, и в таком виде он поступает к модулю-"проектору"; он, как и раньше, умеет добавлять субтитры только в нижнюю часть самого кадра, как он его видит, но эта нижняя часть теперь находится в добавленной чёрной полосе.

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

mplayer -vf expand=0:-168:0:84 [имя файла]

Здесь "-vf" означает "видео фильтр", "expand" - название фильтра, потом идут четыре числа, первые два объясняют, насколько расширять кадр - 0 в ширину, -168 в высоту (минус означает здесь, что это добавочная высота, а не общая конечная высота), потом ещё два числа, означающие, где надо ставить первоначальную картинку внутри расширенной — '84' означает, что она сдвигается на 84 пикселя ниже верхней границы расширенного кадра, и поэтому добавленная высота в 168 пикселей делится на две полосы в 84 пикселя вверху и внизу.

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

И глупо тут то, что ведь всё это совершенно тривиально было бы сделать автоматически или хотя бы с помощью отдельной простой опции. Пусть mplayer не умеет, как xine, писать в область экрана, лежащую вне кадра; всё равно, этот видео-фильтр "expand" можно было бы наладить автоматически после того, как пользователь нажимает кнопку "f". Зачем заставлять его вычислять все эти числа (168, 84) и правильно их писать в командной строке? У самой программы все эти данные уже есть. В крайнем случае, если трудно поставить фильтр, когда программа уже показывает фильм, можно было бы сделать дополнительную опцию, что-то вроде -fullsub, и если она есть в командной строке, то mplayer сам вычисляет всё, что нужно, и налаживает фильтр. Но нет, философия этой программы и её создателей - плевать на пользователя, не стоит делать никаких "косметических" изменений, которые облегчили бы ему жизнь. И на практике это выражается в том, что mplayer'ом пользуются только те, кто могут сами разобраться в мириадах сложных опций и плохой документации. А жаль, потому что с технической точки зрения программа действительно отличная.

Всё.
Subscribe
  • Post a new comment

    Error

    default userpic

    Your IP address will be recorded 

    When you submit the form an invisible reCAPTCHA check will be performed.
    You must follow the Privacy Policy and Google Terms of use.
  • 37 comments