понедельник, 9 марта 2009 г.
Простой учет номера билда в MSVC++
Итак, надо чтобы после каждого билда номер билда увеличивался на единицу. И этот номер пусть будет макросом BUILD_NUMBER в файле version.h. В настройках проекта, Build -> Post-build event пишется cscript incnum.js, а вот и сам incnum.js:
Здесь не используется более сложный подход (разбор содержимого в version.h и его перезапись) ради простоты и устойчивости к ошибкам. Потому что чуть что - и номер билда может быть потерян.
воскресенье, 25 января 2009 г.
Создание DVD из TS
ffmpeg -i file.ts -acodec copy -vcodec copy file.vobили MEncoder:
mencoder -oac copy -ovc copy -of mpeg -mpegopts \
format=dvd -o file.vob file.tsОднако, если присутствуют ошибки в потоке, может произойти рассинхронизация, или еще что похуже. Для таких случаев существует ровно 3 инструмента:
VideoReDo [Win32]
Работает быстро и качественно. Имеет поддержку скриптования с помощью ActiveX. Платен.
replex
Работает быстро, но плохо. Режим Remux выдает DVD-совместимый MPEG, но при этом видео начинает как-то странно дергаться. Режим Demux выдает "битые" потоки. То есть либо звук, либо видео может кончиться на середине. Хорошо бы такие "битые" потоки как-то исправлять, т.е. находить, в каких местах поток кончается, и исправлять маркер конца на пустой кадр.
ProjectX
Очень странный инструмент, написанный на Java. Странный потому, что, во-первых, работает быстро, а во-вторых, может любой TS-файл разделить на видео и звук, попутно исправляя в них ошибки.
Чтобы получившиеся аудио- и видеопотоки свести вместе в один DVD-совместимый MPEG, лучше всего использовать mplex. И, чтобы не терять даром время, получившийся программный поток можно по конвейеру передавать dvdauthor:
mplex -f 8 -o - file.m2v file.m2a | dvdauthor -t - -o \
path_to_dvdТолько вот mplex не знает, что "-" - это stdout. Это легко исправить. Нужно в файле main.cpp (/mjpegtools-*/mplex) в функцию
int FileOutputStream::Open() добавить:Описанный выше вариант преобразования MPEG-TS в DVD - пока что единственный рабочий (с использованием фриварных и кроссплатформенных утилит).
четверг, 15 января 2009 г.
Массовый опрос сети
Для начала, нужно найти все машины в сети. Для этого рассылаются ICMP ECHO пакеты. Под *x это делается через сокеты, что требует прав рута. Одна из таких программ - fping. Она компилируется и под Win32 (cygwin, mingw), и тоже требует прав администратора.
Однако, под Win32 все намного проще. Есть специальный API для ICMP, не требующий особых прав. Можно написать что-то типа аналога fping. Вот кусок кода, взятый с АНТИЧАТ:
Вышеупомянутая утилита fping может принимать на вход список IP-адресов, и, сканируя их, выдавать только те, что доступны. Это удобно, и это стоит реализовать в нашем Win32-аналоге fping.
Кстати, Win32-вариант работает раз в 5 быстрее.
А теперь, когда есть список машин, можно к каждой пытаться соединиться на выбранный порт. Одновременно.
Данный скрипт под Win32 может выдать список адресов где-то за 5 секунд. И от ширины канала это особо не зависит.
Есть маленькое неудобство: адреса не сортированы. Если сортировать эти адреса как строки, то, например, адрес 192.168.1.11 будет идти раньше, чем 192.168.1.9. Чтобы не углубляться в преобразования адресов, можно просто сделать сортировку по числу после последней точки, то есть:
Очевидно, что если адреса будут отличаться на 2 разряда и больше, такой способ не пойдет.
четверг, 25 декабря 2008 г.
Christmas VLC
Разработчики VLC не перестают радовать пользователей. И, вместе с тем, делать свое творение еще более популярным.
Где-то после 16го декабря (линуксоиды сообщают о 19м), иконка VLC в панели задач "оделась" по-новогоднему. По крайней мере, это первое, что бросилось в глаза. Естественное желание - посмотреть в Help->About - было тоже учтено. В общем, выходит, что все иконки vlc, включая полноразмерные, "переоделись". Веселенький такой [Easter] Christmas Egg :)
воскресенье, 14 декабря 2008 г.
Getopt и неGNU
Многие спрашивают: а где же Getopt в Windows? Ответ прост: там же, где и libc. То есть нету. Портировать libc под Win никто не хочет, и не собирается. И если большинству функций в libc есть альтернативы в MSVC и др., то Getopt альтернативы нет. Разве что boost::program_options, но он не очень-то функционален или удобен.
Так вот, на FTP GNU можно взять исходник GNU hello, в котором будет Getopt, unistd.h и еще кое-что полезное. Getopt там полностью рабочий, а unistd.h идет как заглушка\обертка, но в любом случае полезная для портирования вещь. Эти фрагменты glibc туда включены для обеспечения совместимости с неGNU системами, и предполагается, что пишущие под GPL тоже будут их включать в свои исходники. К сожалению, почти никто так не делает (разве что в Apache был замечен Getopt.c). Иначе портировать было бы гораздо легче.
пятница, 12 декабря 2008 г.
Прикручиваем звук и картинки
libao
Маленькая бибиотека для работы с Wave и вывода звука в звуковые устройства. Под линуксом все просто: libao обычно уже стоит в виде динамической библиотеки, и плюс к этому у нее есть плагины для вывода звука через Alsa, OSS и др. Под Win - тоже просто: можно скопилить эту либу как статическую (или динамическую) и написать плагин для вывода звука через WaveOut. Всяких юниксовых библиотек она не требует, и посему компилится без проблем.
ImageMagick
... а именно Magick++, С++-оболочка для ImageMagick. Опять же, в линуксах ImageMagick чаще идет как динамическая либа, а под Win можно пойти двумя путями: либо потребовать установленной ImageMagick DLLs (~20 MB + права админа), либо скопилить ее как статическую либу (тогда размер EXE вырастет на ~3 MB). Для второго варианта, нужно взять ImageMagick-windows.zip (например, здесь ), и немного постучать в бубен. В переносном смысле. Сначала хочется в прямом, но потом, после прочтения инструкции на сайте, это желание пропадает. Так вот: в папке VisualMagick\Configure лежит configure.bat, который компилит configure.exe, который создает configure.sln. Последний надо скомпилить (уже в MSVC 7+), причем только в Release. Потом запустить этот скомпиленный configure.exe, который оказывается визардом, чтобы он создал VisualMagickXX.sln. И вот уже этот Solution можно компилить как угодно.
JPEGlib
Это вариант только для Win-прог малого размера (под линуксом легче будет предыдущий вариант). После некоторого ковыряния, нормально компилится под Win. В качестве статической либы, особого увеличения размера проги не дает, и ничего особенного не требует. К тому же, используется в boost::gil.