blog-blog-blog

Subscribe to RSS feed

Скачиваем оригинальные английские субтитры с notabenoid.com

Доделал скрипт-парсер сайта notabenoid.com для скачивания оригинальной версии субтитров. Парсинг осуществляется с помощью двух библиотек: Beautiful Soup http://www.crummy.com/software/BeautifulSoup/ и soupselect http://code.google.com/p/soupselect/. Сам скрипт вот:
from BeautifulSoup import BeautifulSoup as Soup
from soupselect import select
import sys, urllib

def GetSrt(url, srt_file):
  i = 0
  j = 0
  soup_text = Soup(urllib.urlopen(url+'?page='+str(i)))
  OutSub = open(srt_file, 'w')
  
  while not select(soup_text, 'tr#empty_msg'):
    print ('Read %s?page=%d' % (url, i))
    
    timing = select(soup_text, 'table.translator tr td.i')
    origin = select(soup_text, 'table.translator tr td.o')
    
    for x in range(len(timing)):
      time = unicode(timing[x])[14:-5].split('<br />')
      start_time = time[0]
      end_time = time[1]
      origin_text = unicode(origin[x])[14:-5].replace('<br />','')
      j = j + 1
      OutSub.write('%d\n%s --> %s\n%s\n\n' % (j, start_time, end_time, origin_text))
      
    i = i + 1
    soup_text = Soup(urllib.urlopen(url+'?page='+str(i)))
  OutSub.close()

GetSrt(sys.argv[1], sys.argv[2])
Использование простое: первым параметром передается url страницы с переводом вида http://notabenoid.com/book/20491/66978/ , вторым параметром - имя выходного файла субтитров. Пример:
html2srt.py http://notabenoid.com/book/20491/66978/ eng.srt
Теперь надо сделать скачивание перевода и по-тихоньку объединять все в один интерфейс.

Извлечение данных из MKV посредством Python и MKVtoolnix

Нашел на просторах интернета PyQt программку, которая использует mkvinfo и mkvextract для извлечения данных из MKV контейнера: http://www.qui-saura.fr/monBlog/python-mkvextract-et-un-petit-gui-en-pyqt.html.
В неё пришлось внести пару изменений: преобразование пути к MKV файлу из QString в string функцией unicode() и изменить регулярное выражение, извлекающее данные вывода утилиты mkvnfo.
Теперь надо объеденить обе программы в едином интерфейсе.
Также хочу добавить редактирование стилей для ASS субтитров.

Еще хорошо бы сделать парсер сайта notabenoid.com, который скачивал бы оттуда оригинальные субтитры, т.к. администрация сайта не делает возможности скачать их SRT файлов из соображений соблюдения авторских прав.
Ну и добавить скачивание перевода. И все это тоже добавить в интерфейс программы.

Сливаем два SRT в один ASS используя Python

Дописал вчерашний скрипт.
import os, sys, codecs
from pysrt import SubRipFile

ENG_SRT = sys.argv[1]
RUS_SRT = sys.argv[2]
OUT_ASS = sys.argv[3]
FILE_ENCODE = 'cp1251'

HEAD = '''[Script Info]
ScriptType: v4.00+
Collisions: Normal
Timer: 100.0000

[V4+ Styles]
Format: Name, Fontname, Fontsize, PrimaryColour, SecondaryColour, OutlineColour, BackColour, Bold, Italic, Underline, StrikeOut, ScaleX, ScaleY, Spacing, Angle, BorderStyle, Outline, Shadow, Alignment, MarginL, MarginR, MarginV, Encoding
Style: EngText,Arial,18,&H00FFFFFF,&H0000FFFF,&H00000000,&H00000000,-1,0,0,0,100,100,0,0,1,3,0,2,20,20,20,204
Style: RusText,Arial,18,&H00FFFFFF,&H0000FFFF,&H00000000,&H00000000,-1,0,0,0,100,100,0,0,1,3,0,8,20,20,20,204

[Events]
Format: Layer, Start, End, Style, Name, MarginL, MarginR, MarginV, Effect, Text'''

def srt2ass(file_name, lang_style, encode_type):
  '''
  file_name - path to *.srt file
  lang_style - EngText or RusText
  encode_type - *.str file encoding
  '''
  subs = SubRipFile.open(file_name, encoding=encode_type)
  for sub in subs:
    start_time = sub.start.to_time().strftime('%H:%M:%S.%f')[1:-4]
    end_time = sub.end.to_time().strftime('%H:%M:%S.%f')[1:-4]
    string = sub.text.replace('\n', '\\N')[:-2]
    OutSub.write('Dialogue: 0,%s,%s,%s,,0000,0000,0000,,%s\n' % (start_time, end_time, lang_style, string))

OutSub = codecs.open(OUT_ASS, encoding=FILE_ENCODE, mode='w+')
OutSub.write(HEAD)

srt2ass(ENG_SRT, 'EngText', FILE_ENCODE)
srt2ass(RUS_SRT, 'RusText', FILE_ENCODE)

OutSub.close()

Пример использования:
srt2ass.py eng.srt rus.srt out.ass

Осталось сделать графический интерфейс и выдергивалку субтитров из контейнеров.

Перекодируем субтитры из SRT в ASS на Python.

Появилось желание смотреть видео с субтитрами на двух языках одновременно. Тема эта уже обсуждалась, были предложены скрипт для mplayer, а так же плееры с уже встроенной такой возможностью: kmplayer, powerdvd, bsplayer.
В VLC VideoLan уже 5 лет висит тикет 824, в котором запрашивали такую возможность.
Все эти варианты мне не подошли по разным причинам: проблемы с кодировкой, "корявое" воспроизведение, непривичный интерфейс. Я уже привык к Media Player Classic и хотел бы смотреть виде через него.
И мне пришла в голову идея быстрого слияния английского и русского STR субтитров в один ASS файл.
Ознакомившись со спецификацией ASS субтитров на сайте http://subs.com.ru/page.php?al=ssa_description, набросал стили для отображения русского и английского текста:
[Script Info]
ScriptType: v4.00+
Collisions: Normal
Timer: 100.0000

[V4+ Styles]
Format: Name, Fontname, Fontsize, PrimaryColour, SecondaryColour, OutlineColour, BackColour, Bold, Italic, Underline, StrikeOut, ScaleX, ScaleY, Spacing, Angle, BorderStyle, Outline, Shadow, Alignment, MarginL, MarginR, MarginV, Encoding
Style: EngText,Arial,18,&H00FFFFFF,&H0000FFFF,&H00000000,&H00000000,-1,0,0,0,100,100,0,0,1,3,0,2,20,20,20,204
Style: RusText,Arial,18,&H00FFFFFF,&H0000FFFF,&H00000000,&H00000000,-1,0,0,0,100,100,0,0,1,3,0,8,20,20,20,204

Стиль выбрал аналогичный шрифту по умолчанию для SRT субтитров в Media Player Classic, его можно изменить на свой вкус.

Для работы с SRT субтитрами существует библиотека PySrt http://pypi.python.org/pypi/pysrt/.
Сам скрип я только начал писать, еще не все реализовал, остается добавить обработку второго SRT файла, аргументы командной строки и, возможно, добавить графический интерфейс.
import os
import codecs

from pysrt import SubRipFile

INPUT_FILE = 'test.srt'
OUTPUT_FILE = 'out.ass'
FILE_ENCODE = 'cp1251'

head = '''[Script Info]
ScriptType: v4.00+
Collisions: Normal
Timer: 100.0000

[V4+ Styles]
Format: Name, Fontname, Fontsize, PrimaryColour, SecondaryColour, OutlineColour, BackColour, Bold, Italic, Underline, StrikeOut, ScaleX, ScaleY, Spacing, Angle, BorderStyle, Outline, Shadow, Alignment, MarginL, MarginR, MarginV, Encoding
Style: EngText,Arial,18,&H00FFFFFF,&H0000FFFF,&H00000000,&H00000000,-1,0,0,0,100,100,0,0,1,3,0,2,20,20,20,204
Style: RusText,Arial,18,&H00FFFFFF,&H0000FFFF,&H00000000,&H00000000,-1,0,0,0,100,100,0,0,1,3,0,8,20,20,20,204

[Events]
Format: Layer, Start, End, Style, Name, MarginL, MarginR, MarginV, Effect, Text'''

OutSub = codecs.open(OUTPUT_FILE, encoding=FILE_ENCODE, mode='w+')
OutSub.write(head)
subs = SubRipFile.open(INPUT_FILE, encoding=FILE_ENCODE)
for sub in subs:
  start_time = sub.start.to_time().strftime('%H:%M:%S.%f')[1:-4]
  end_time = sub.end.to_time().strftime('%H:%M:%S.%f')[1:-4]
  string = sub.text.replace('\n', '\\N')[:-2]
  OutSub.write('Dialogue: 0,%s,%s,EngText,,0000,0000,0000,,%s\n' % (start_time, end_time, string))

Связываем Qt Creator и code.google.com

Чтобы не забыть.
Создаем новый проект на сайте http://code.google.com/hosting/createProject
В поле Version control system выбираем Subversion
На странице https://code.google.com/hosting/settings получаем пароль

Устанавливаем Subvrsion. Варианты установщиков есть тут: http://subversion.apache.org/packages.html
Для Windows я выбрал Win32Svn с сайта http://sourceforge.net/projects/win32svn/

В Qt Creator заходим в Tools->Otions->Version Control->Subversion
Указываем путь к файлу svn.exe (C:\Program Files\Subversion\bin\svn.exe)
В поле Username вводим почту на Google, а в Password пароль со страницы https://code.google.com/hosting/settings
Нажимаем OK.

Нужно заранее создать проект и сохранить его какую-нибудь папку.
Потом выбрать New Project->Project from Version Control->Subversion Checkout->Choose...
В поле Repository указать https://%project_name%.googlecode.com/svn/trunk
В поле Checkout Path указать директорию, содержащуу папку с проектом.
В поле Checkout Directory указать имя папки с проектом.
Нажать Next.

У меня вывелся следующий лог:
Executing in C:\QtSDK: C:\Program Files\Subversion\bin\svn.exe --username %user_name%@gmail.com --password ******** checkout https://chell.googlecode.com/svn/trunk chell

Checked out revision 1.

The process terminated with exit code 0.


В папке с проектом появится скрытая папка .svn
В Qt Creator в меню Tools появится пункт Subversion

Чтобы добавить файл в коммит нужно его выбрать выбрать и выполнить Tools->Subverion->Add %file_name%
Для отправки коммита на сервер нужно выполнить Tools->Subverion->Commit All Files

Утилитка на PyQt. Изменение атрибутов файлов.

, , ,

Есть такой злобный вирус, который устанавливает директориям атрибуты скрытый и системный. Графическими средствами Windows эти атрибуты не снять, для чего набросал эту утилитку. Она использует файл графического интерфейса form.py из прошлого поста.
# -*- coding: utf-8 -*-
import sys, os, time, win32api, win32con
from PyQt4 import QtGui, QtCore
from form import Ui_Form

class pyqt01(QtGui.QMainWindow):
  def __init__(self):
    QtGui.QMainWindow.__init__(self)
    self.ui = Ui_Form()
    myWidget = QtGui.QWidget()
    self.ui.setupUi(myWidget)
    self.setCentralWidget(myWidget)
    self.connect(self.ui.listWidget, QtCore.SIGNAL('itemSelectionChanged()'), self.ptext)
    self.connect(self.ui.pushButton, QtCore.SIGNAL('clicked()'), self.showDialog)
    self.connect(self.ui.listWidget, QtCore.SIGNAL('itemDoubleClicked(QListWidgetItem *)'), self.setAttr)
    font = QtGui.QFont()
    font.setBold(True)
	
	
  def setAttr(self):
    win32api.SetFileAttributes(unicode(self.ui.listWidget.item(self.ui.listWidget.currentRow()).text()), win32con.FILE_ATTRIBUTE_NORMAL)
    self.ui.listWidget.item(self.ui.listWidget.currentRow()).setFont(QtGui.QFont(self.font().family(), self.font().pixelSize(), QtGui.QFont.Normal))
    self.ptext()

  def showDialog(self):
    filename = QtGui.QFileDialog.getExistingDirectory(self, 'Open file')
    self.ui.listWidget.clear()
    names = os.listdir(unicode(filename))
    for dirs in names:
      fullname = os.path.join(unicode(filename), dirs)
      if os.path.isdir(fullname):
        self.ui.listWidget.addItem(fullname)
        attrs = win32api.GetFileAttributes(fullname)
        if attrs & win32con.FILE_ATTRIBUTE_SYSTEM:
          self.ui.listWidget.item(self.ui.listWidget.count()-1).setFont(QtGui.QFont(self.font().family(), self.font().pixelSize(), QtGui.QFont.Bold))
        if attrs & win32con.FILE_ATTRIBUTE_HIDDEN:
          self.ui.listWidget.item(self.ui.listWidget.count()-1).setFont(QtGui.QFont(self.font().family(), self.font().pixelSize(), QtGui.QFont.Bold))
		  
  def ptext(self):
    attrs = win32api.GetFileAttributes(unicode(self.ui.listWidget.item(self.ui.listWidget.currentRow()).text()))
    self.ui.textEdit.setText(unicode(self.ui.listWidget.item(self.ui.listWidget.currentRow()).text()))
    if attrs & win32con.FILE_ATTRIBUTE_READONLY: # 1
      self.ui.textEdit.append("FILE_ATTRIBUTE_READONLY")
    if attrs & win32con.FILE_ATTRIBUTE_HIDDEN: # 2
      self.ui.textEdit.append("FILE_ATTRIBUTE_HIDDEN")
    if attrs & win32con.FILE_ATTRIBUTE_SYSTEM: # 4
      self.ui.textEdit.append("FILE_ATTRIBUTE_SYSTEM")      
    if attrs & win32con.FILE_ATTRIBUTE_DIRECTORY: # 16
      self.ui.textEdit.append("FILE_ATTRIBUTE_DIRECTORY")
    if attrs & win32con.FILE_ATTRIBUTE_ARCHIVE: # 32
      self.ui.textEdit.append("FILE_ATTRIBUTE_ARCHIVE")
    if attrs & win32con.FILE_ATTRIBUTE_NORMAL: # 128
      self.ui.textEdit.append("FILE_ATTRIBUTE_NORMAL")
    if attrs & win32con.FILE_ATTRIBUTE_TEMPORARY: # 256
      self.ui.textEdit.append("FILE_ATTRIBUTE_TEMPORARY")
    if attrs & win32con.FILE_ATTRIBUTE_COMPRESSED: # 2048
      self.ui.textEdit.append("FILE_ATTRIBUTE_COMPRESSED")


if __name__ == "__main__":
    app = QtGui.QApplication(sys.argv)
    window = pyqt01()
    window.show()
    sys.exit(app.exec_())

Утилитка на PyQt. Выборка из XML, созданных в Everest

, , ,

Понадобилась для работы утилитка, которая выбирала бы нужные строки из XML файла, созданного в Everest.
Основой файл:
# -*- coding: utf-8 -*-
import sys, os, glob
from PyQt4 import QtGui, QtCore
from form import Ui_Form
	
class pyqt01(QtGui.QMainWindow):
  def __init__(self):
    QtGui.QMainWindow.__init__(self)
    self.ui = Ui_Form()
    myWidget = QtGui.QWidget()
    self.ui.setupUi(myWidget)
    self.setCentralWidget(myWidget)
    self.connect(self.ui.listWidget, QtCore.SIGNAL('itemSelectionChanged()'), self.ptext)
    self.connect(self.ui.pushButton, QtCore.SIGNAL('clicked()'), self.showDialog)

  def showDialog(self):
    filename = QtGui.QFileDialog.getExistingDirectory(self, 'Open file')
    names = glob.glob(unicode(filename) + '\*.xml')
    self.ui.listWidget.clear()
    for name in names:
      if os.path.isfile(name):
        self.ui.listWidget.addItem(name)	
	
  def ptext(self):
    fh = open(unicode(self.ui.listWidget.item(self.ui.listWidget.currentRow()).text()), 'r')
    self.ui.textEdit.setText(self.ui.listWidget.item(self.ui.listWidget.currentRow()).text()[-12:-4])
    for line in fh.readlines():
      if ((line.find("<Item><Title>Тип ЦП</Title><Icon>") > -1) and (line.find("</Icon><Value>") == -1)):
        self.ui.textEdit.append(unicode(line[line.find('</ID><Value>')+12:-16], 'cp1251'))
      if ((line.find("<Item><Title>Системная плата</Title><Icon>") > -1) and (line.find("</Icon><Value>") == -1)):
        self.ui.textEdit.append(unicode(line[line.find('</ID><Value>')+12:-16], 'cp1251'))
      if ((line.find("<Item><Title>Системная память</Title><Icon>") > -1) and (line.find("</Icon><Value>") == -1)):
        self.ui.textEdit.append(unicode(line[line.find('</ID><Value>')+12:-16], 'cp1251'))
      if ((line.find("<Item><Title>DIMM</Title><Icon>") > -1) and (line.find("</Icon><Value>") == -1)):
        self.ui.textEdit.append(unicode(line[line.find('</ID><Value>')+12:-16], 'cp1251'))
      if ((line.find("<Item><Title>Дисковый накопитель</Title><Icon>") > -1) and (line.find("</Icon><Value>") == -1)):
        self.ui.textEdit.append(unicode(line[line.find('</ID><Value>')+12:-16], 'cp1251')) 

if __name__ == "__main__":
    app = QtGui.QApplication(sys.argv)
    window = pyqt01()
    window.show()
    sys.exit(app.exec_())



Файл графической формы form.py
# -*- coding: utf-8 -*-

from PyQt4 import QtCore, QtGui

try:
    _fromUtf8 = QtCore.QString.fromUtf8
except AttributeError:
    _fromUtf8 = lambda s: s

class Ui_Form(object):
    def setupUi(self, Form):
        Form.setObjectName(_fromUtf8("Form"))
        Form.resize(640, 240)
        self.gridLayout = QtGui.QGridLayout(Form)
        self.gridLayout.setObjectName(_fromUtf8("gridLayout"))
        self.splitter = QtGui.QSplitter(Form)
        self.splitter.setOrientation(QtCore.Qt.Horizontal)
        self.splitter.setObjectName(_fromUtf8("splitter"))
        self.widget = QtGui.QWidget(self.splitter)
        self.widget.setObjectName(_fromUtf8("widget"))
        self.verticalLayout = QtGui.QVBoxLayout(self.widget)
        self.verticalLayout.setMargin(0)
        self.verticalLayout.setObjectName(_fromUtf8("verticalLayout"))
        self.pushButton = QtGui.QPushButton(self.widget)
        self.pushButton.setMinimumSize(QtCore.QSize(121, 0))
        self.pushButton.setObjectName(_fromUtf8("pushButton"))
        self.verticalLayout.addWidget(self.pushButton)
        self.listWidget = QtGui.QListWidget(self.widget)
        self.listWidget.setMinimumSize(QtCore.QSize(121, 0))
        self.listWidget.setObjectName(_fromUtf8("listWidget"))
        self.verticalLayout.addWidget(self.listWidget)
        self.textEdit = QtGui.QTextEdit(self.splitter)
        self.textEdit.setObjectName(_fromUtf8("textEdit"))
        self.gridLayout.addWidget(self.splitter, 0, 0, 1, 1)

        self.retranslateUi(Form)
        QtCore.QMetaObject.connectSlotsByName(Form)

    def retranslateUi(self, Form):
        Form.setWindowTitle(QtGui.QApplication.translate("Form", "Открывалка XML - ЗАО \"Луч\"", None, QtGui.QApplication.UnicodeUTF8))
        self.pushButton.setText(QtGui.QApplication.translate("Form", "Выбрать папку...", None, QtGui.QApplication.UnicodeUTF8))

Про PostgreSQL 8.3.7-1 на Windows

Потребовалось установить PostgreSQL 8.3.7-1, но установка заканчивалоась такой ошибкой:
Problem running post-install step. Installation may not complete correctly 
Error reading file C:/Program Files/PostgreSQL/8.3/data/postgresql.conf

Ошибка, насколько я понял, заключается в том, что инсталлятор создает папку DATA с неверными правами доступа.
Решение нашлось на оффициальном форуме EnterpriseDB (ссылка). Там предложили скачать обновленную версию инсталлера PostgreSQL 8.3.7-2 отсюда:
http://uploads.enterprisedb.com/download.php?file=fd66bbc24b3b7105a22f54b11447eeea
Но оффициально эту версию EnterpriseDB на данный момент не представили, возможно требуются еще какие-то доработки.

PostgreSQL я ставил для изучения Django (фреймворк для создания веб приложений на Python)
Во время установки PostgreSQL попросил установить пароль для суперпользователя (по умолчанию postgres). Но устанавливаемая вместе с PostgreSQL админка pgAdmin пароль не приняла. Оказалось что pgAdmin использует вместо имени суперпользователя PostgreSQL имя учетной записи Windows. Требуется вручную изменить имя пользователя на postgres.

И себе на заметку:
Для работы страницы администратирования в Django 1.0.2 потребовалось доустановить Python Imaging Library для Python 2.6.2
Библиотека для работы с PostgreSQL под Windows бралась здесь: http://www.stickpeople.com/projects/python/win-psycopg/

Пилотный пост. Qt)

, , , ...

Когда возникают различные вопросы, ответы и решения можно найти в сети интернет. Решить проблему и не возвращяться к ней длительное время. За которое можно и забыть, как что делал.

Начну, пожалуй, с Qt под Windows.
Устанавливается просто единым установщиком Qt SDK с сайта http://www.qtsoftware.com/
При этом получаем среду разработки (IDE) Qt Creator (который включает теперь Qt Designer), саму библиотеку, исходники библиотеки, различные демо и примеры, и компилятор MinGw.

На тот момент я работал с версией Qt 4.5.1 2009.02.1

Со всем этим можно уже работать, но меня не устроила одна вещь: поддержка мультимедия (проигрываия аудио и видео). Для работы с ними в Qt используется Phonon. Но он не поставляется в бинарной версии Qt под Windows из-за проблем с компилятором MinGw, который не может собирать библиотеки DirectX.

Решения два: или пересобрать Qt с использованием компилятора Microsoft Visual C++, или использовать способ предложенный тут: http://wiki.qtcentre.org/index.php?title=Building_the_Phonon_backend_plugin_on_Windows_using_MinGW (плюс в помощь http://www.prog.org.ru/topic_9638_0.html )
Пока что я попробовал второе решение, его и опишу.

Для начала проверим, чтобы в переменной среде PATH был указаны директории: C:\Qt\2009.02\mingw\bin;C:\Qt\2009.02\qt\bin (это пути при установке по-умолчанию).

У меня также заданы следующие переменные среды (не помню, нужны ли они):
INCLUDE C:\Qt\2009.02\mingw\include
LIB C:\Qt\2009.02\mingw\lib
QMAKESPEC win32-g++
QTDIR C:\Qt\2009.02\qt

Далее я установил TortoiseSVN http://tortoisesvn.net/ и скопировал svn://anonsvn.kde.org/home/kde/trunk/kdesupport/kdewin/ в C:\Qt\2009.02\qt\src\kdewin
Там содержатся библиотеки DirectX уже подготовленные для компиляции MinGw. Хвала разработчикам KDE ^__^
Копируем файл C:\Qt\2009.02\qt\src\kdewin\include\mingw\comdef.h в папку C:\Qt\2009.02\qt\src\kdewin\include\directx\

Редактируем файл C:\Qt\2009.02\qt\src\plugins\phonon\ds9\ds9.pro
DESTDIR = $$QT_BUILD_TREE/plugins/phonon_backend
QT += phonon
win32:!win32-g++*:!wince*:contains(QT_CONFIG,opengl):LIBS += opengl32.lib
win32:!win32-g++*:!wince*:LIBS += gdi32.lib
!win32-g++*:win32-msvc2005:DEFINES += _CRT_SECURE_NO_WARNINGS
!win32-g++*:LIBS += strmiids.lib Dmoguids.lib uuid.lib msdmo.lib
win32-g++*:contains(QT_CONFIG,opengl):LIBS += -lopengl32
win32-g++*:LIBS += -lgdi32 -lstrmiids -lDmoguids -luuid -lmsdmo -lole32 -loleaut32
TARGET = phonon_ds9
DEFINES += PHONON_MAKE_QT_ONLY_BACKEND
PHONON_DS9_DIR = $$QT_SOURCE_TREE/src/3rdparty/phonon/ds9
INCLUDEPATH += $$QT_SOURCE_TREE/src/kdewin/include/directx
...

Редактируем файл C:\Qt\2009.02\qt\src\phonon\phonon.pro
Нужно всавить первой строчкой:
QT_SOURCE_TREE=../..

Далее "самое интересное".
В директории C:\Qt\2009.02\qt\ из под коммандной строки выполняем:
configured with -phonon -phonon-backend

И запускаем сборку:
mingw32-make

У меня запустилась сборка ВСЕХ исходником содержащихся в Qt SDK (в том числе с примерами) и продолжалась около восьми часов на Pentium D 2.8GHz. Для сборки потребовалось около 5 Гб свободного места. Можно выключить компьютер, не прерывая процесс компиляции, переведя его в спящий режим.
Я мало знаком со всеми этими вещами и, думаю, можно было сконфигурировать более оптимально, отключив сборку ненужных библиотек и примеров.
Но на выходе получаем сборку Qt с поддержкой Phonon и, как следствие, возможностью работы с аудио и видео.
Убедиться в работоспособности можно собрав и запустив из демок mediaplayer.

Надеюсь ничего не забыл. Буду с Qt знакомиться дальше и вносить исправления и дополения.