ads

"Делай что можешь с тем, что имеешь, там, где ты есть". Теодор Рузвельт

вторник, 1 октября 2013 г.

Конвертор mp3-файлов в VBR-формат

Конвертор mp3-файлов в VBR-формат с хорошим качеством и небольшим размером.

Удобен для сжатия mp3-файлов с большим битрейтом (256, 320 Кб/с). Использует утилиты lame и id3info.

#!/bin/bash
#
# Конвертор mp3-файлов в VBR-битрейт

# Вызов: bash mp3conv [каталог_с_mp3]
# egax

parse_tag ()
{
    retval=$(echo "$1" | grep -P "$2" | iconv -f CP1251 -t UTF-8)

    expr match "$retval" ".*:[ \\t]*\(.*\)"
}

cd "$1"
for curfile in *.mp3; do

    tag=$(id3info "$curfile")

    # берем поля тага
    title=$(parse_tag "$tag" TIT2)

    artist=$(parse_tag "$tag" TPE1)
    track=$(parse_tag "$tag" TRCK)

    year=$(parse_tag "$tag" TYER)
    album=$(parse_tag "$tag" TALB)

    newfile="$curfile"
    # новое имя файла $artist - [$track_]$title.mp3
    if [ ! -z "$artist" ] && [ ! -z "$title" ]; then

        if [ ! -z $track ]; then
            [ $track -lt 10  ] && track=0"$track"

            title="$track"_"$title"
        fi
        newfile="$artist"" - "$title".mp3"

    fi

    dirname=1
    # имя папки для новых файлов [$year_]$album
    if [ ! -z "$album" ]; then

        [ -z $year ] || album="$year"_"$album"
        dirname="$album"

    fi

    # создаем папку если не создана
    [ -d "$dirname" ] || mkdir "$dirname"

    newfile="$dirname"/"$newfile"

    # конвертим файл с VBR-битрейдом и копируем таги v2 и v1
    lame --vbr-new -B 192 "$curfile" "$newfile"

    id3cp -2 "$curfile" "$newfile"
    id3cp -1 "$curfile" "$newfile"
done

Настройка проектов для разработки плагинов PHP

Повысить скорость выполнения скриптов, особенно с использованием циклических вычислений, можно, перенеся части кода на язык C и оформив их как плагин PHP. У PHP есть отличный API позволяющий, даже не имея особых навыков программирования на С,создавать модули. Макросы и функции для работы с массивами, строками, входными аргументами уже есть в наличии, а примеры их использования есть в документации и исходном коде.

Создадим свое расширение myextension и настроим проект в среде Visual C 9 из пакета разработки Microsoft Visual Studio 9. В VС9 можно собирать модули для php версий 5.2, 5.3, 5.4. Для версии php 5.5 нужно использовать пакет Visual Studio 2012.

Для создания каркаса проекта с в каталоге ext в папке исходных кодов php запускаем скрипт ext_skel под Linux или ext_skel_win32.php под Windows с установленым пакетом Cygwin.

./ext_skel --extname=myextension

В созданной папке myextension открываем файл myextension.dsp в среде VC9. Открываем окно свойств проекта раскрываем меню Configuration Properties.

Включаем режим отладки в настройках Linker->Debugging->General Debug Info, выбираем Yes (/DEBUG).

В настройках C/C++->General->Debug Information Format выбираем Program Database (/ZI).

Указываем скрипт запуска во вкладке Debugging как Command с ....\Debug_TS\php.exe и Command Arguments с -f myextension.php.

Ставим точку останова, запускаем режим отладки по клавише F5 и убеждается, что она работает.

myext3.png

Все. Теперь сделаем тоже самое, но для среды NetBeans IDE 7.2 под Linux. Для этого в системе должна быть установлена отладочная версия php. Для этого берем исходники с сайта php.net, например, php-5.4.9.tar.gz. Распаковываем и собираем с режимом отладки:

./configure --prefix=/usr/local/php54d/ --enable-debug
make install

После установки запускаем редактор NetBeans, создаем проект "Приложение на C/C++" и включаем в него все файлы расширениями .h и *.c из каталога */ext/myextension. Открываем вкладку "Собрать" в окне свойств проекта. В подпункте "Тип конфигурации" указываем "Динамическая библиотека".

В разделе "Компилятор C" прописываем пути к инклудам php:

  • /usr/local/php54d/include/php
  • /usr/local/php54d/include/php/main
  • /usr/local/php54d/include/php/Zend
  • /usr/local/php54d/include/php/TSRM

В подпункте "Препроцессорные определения" указываем COMPILE_DL_MYEXTENSION=1.

В настройке "Компоновщик"->"Вывод" меняем имя libmyextension на php_myextension.

Теперь компилируем модуль и копируем его в каталог модулей php. По умолчанию это будет что-то типа /usr/local/php54d/lib64/extensions/debug-non-zts-20100525. После этого ставим точку останова и запускаем режим отладки. Если все настройки сделаны правильно, должно получиться.

nb0.png

Сборка плагина (extension) для PHP 5.x

Краткая сводка действий для сборки плагина под PHP 5.2-5.5

Сборка под Linux

PHP должен быть установлен в системе.

phpize
./configure
make
make test
make install (или скопировать вручную php_extension.so)

Сборка под Windows

Используем среду Visual Studio 2008.

Настройка php-sdk (поставляется отдельно от дистрибутива php):

setenv /x86 /xp /release
cd c:\php-sdk\
bin\phpsdk_setvars.bat
bin\phpsdk_buildtree.bat <php_src_dir>

Для PHP 5.2 также нужен win32build (ставится тоже отдельно):

set INCLUDE=c:\win32build\include

Выставляем переменные окружения Visual Studio:

c:\Program Files\Microsoft Visual Studio 9.0\VC in cvars32.bat

Собираем PHP через configure.js и nmake. В VS2008Express отсутствует компилятор сообщений mc.exe. Его можно взять из VS2010 добавив в Makefile строчку перед "MT = ...":

MC=C:\Program Files\Microsoft SDKs\Windows 7.0A in\mc.exe 
MT=C:\Program Files\Microsoft SDKs\Windows 6.0A in\mt.exe

Либо установить Windows SDK.

Инициализируем плагин:

  1. php.exe extskelwin32.php --extname=myextension --proto=myprototypefile.dat
  2. Раскомментарить ARGENABLE или ARGWITH в config.w32

Собираем PHP 5.2 с плагином:

buildconf.bat
cscript /nologo configure.js --disable-zts --disable-cgi --disable-fastcgi 
--disable-path-info-check --disable-bcmath --disable-calendar 
--disable-com-dotnet --disable-ctype --disable-xmlreader --disable-zlib 
--disable-xmlwriter --disable-ftp --disable-filter --disable-ctype 
--disable-com-dotnet --enable-cli --without-xml --without-libxml 
--without-simplexml --disable-ipv6 --with-EXTENSION[=shared[,PATH]]
nmake

Сборка PHP 5.3-5.5 с плагином:

buildconf.bat
cscript /nologo configure.js --disable-all --enable-cli 
--with-EXTENSION[=shared[,PATH]]
nmake

Для компиляции через Visual Studio в настройках проекта нужно выставить флаг препроцессора _USE_32BIT_TIME_T.