Qt 4.5.1. Phonon. Программирование звука и видео часть 1.


    Введение.


    Приветствую вас! Сегодня мы начнем разбираться в мультимедейном Фреймворке Qt Pnonon. Стоит немного рассказать об общих правилах программирования мультимедиа, поняв их мы, сразу же приступим к делу. Phonon на мой взгляд выполнен очень лаконично, и я считаю, что с него и следует начинать разбираться с программированием мультимедиа. И так, начнем.
    Программирование мультимедиа основано на графах. Граф состоит из объектов, которые называются по-разному в терминах разных систем, но суть везде одна и та же, это законченный объект представляющий собой кодек, демуксер, файл или сплитер. Т.е. для воспроизведения файла мы просто должны составить правильный граф. Вот вам пример из мануала:

Здесь та самая картинка из мануала

    Выше изображен граф для воспроизведения mp3 файла. На графе мы видим четыре элемента соединенных между собой. Это файл источник, медиа объект, забегая вперед я скажу, что через него и осуществляется управление графом, аудио синк, это объект рендерер, который соединен с физическим устройством вывода звука, на котором собственно и осуществляется рендеринг. И так, теперь пора прекратить ковыряться в низкоуровневых деталях, и начать разбираться какую поддержку этих вещей мы найдем в phonon. Скажу честно, ничего проще Phonon я не встречал, остальные средства либо не позволяют управлять  графом, либо не позволяют сделать это так просто. И так начнем.

    Объект источник представлен в Phonon классом Phonon::MediaSource. Он может работать с файлами в локальной файловой системе, с файлами в сети, потоками и устройствами. Объект управления графом представлен как Phonon::MediaObject. Этот класс является едва ли не главным при программировании Phonon, он позволяет управлять состоянием графа и изменять его, например, включая воспроизведение или стоп, или приостанавливать граф (пуза). Аудио выход реализован в виде Phonon::AudioOutput, а устройство в виде Phonon::AudioDevice. Кстати, будет не лишним упомянуть, что Phonon::MediaObject, при работе с видео, автоматически разбивает поток на два, аудио поток и видео, но об этом позже.

    Я постараюсь в нескольких статьях рассказать обо всем. А сейчас нас ожидает пример воспроизведения звука. Но внимательный читатель наверняка заметил, что чего-то нам еще не хватает. И верно, наличие всех этих элементов это еще не все, нам нужно средство, которое позволит конструировать из них тот самый граф, т.е. некий способ связать эти элементы между собой. За это отвечает функция Phonon::createPath() принимающая два аргумента, первый это указатель на источник потока, а второй это указатель на приемник потока. Возвращает функция объект типа Phonon::Path, но нам пока ни к чему о нем знать, забегая в перед, скажу лишь, что при его помощи можно вставлять в поток эффекты и т.д. И так, пример. Сейчас мы постоим граф который изображен на рисунке выше.


int main(int argc, char *argv[])
{
    QApplication a(argc, argv);

    //Объект
    Phonon::MediaObject object;

    //Аудио выход
    Phonon::AudioOutput output;

    //Разумеется тут следует указать свой файл
    object.setCurrentSource(Phonon::MediaSource("D:\\music\\a\\ROY  JONES  Jr  PRES.mp3"));

    //Связывание объектов
    Phonon::createPath(&object,&output);

    //Воспроизведение
    object.play();
    return a.exec();
}

    Если у кого то в системе нет поддержки mp3, воспроизведите что нибудь другое, заиграет любой файл, поддержка формата которого корректно установлена в системе. Ну что, пора и честь знать.Спасибо за внимание. До новых встреч.



Добавлена: 15-05-2009 | Пользователем: gnudimarik | Просмотров: 3795

Комментарии

funtik 27-04-2010 01:25
не плохо бы было добавить, что в файл проекта нужно дописать QT += phonon, а в хедеры
#include <QApplication>
#include <phonon/AudioOutput>
#include <phonon/MediaObject>
просто у начинающего этот код просто не заработает, а он не сможет понять (с ходу по крайней мере) в чем ошибка.

А так, статья очень хорошая. Понятная и легко читается, спасибо)
gnudimarik 27-04-2010 17:02
Благодарю за замечание :)
Правда не знаю когда дойдут руки вновь что нибудь написать


Оставить комментарий



Капча *

Captcha

Комментарий будет опубликован после проверки модератором

Для подсветки синтаксиса исходный код следует обрамлять следующими тэгами
<pre><code class="синтаксис" >код</code></pre>
Подерживаются следующие: cpp php javascript sql html-xml css ini