Категория: Windows: Компоненты, библиотеки
Авторы: Wim Taymans, Steve Baker, Andy Wingo, Ronald S. Bultje, Stefan Kost
Дата публикации: 21 мая 2014 г.
Перевод: А.Панин
Дата перевода: 19 июня 2014 г.
Глава 10. Ваше первое приложениеВ данной главе мы обобщим всю информация из предыдущих глав. В ней освещены все аспекты создания простого приложения на основе фреймворка GStreamer, включая инициализацию библиотек, создание элементов, упаковку элементов с целью формирования конвейера и проигрывание мультимедийного потока с помощью этого конвейера. Выполнив эти действия, вы сможете создать простой проигрыватель аудиофайлов формата Ogg/Vorbis.
10.1. Hello worldМы будем создавать первое простое приложение, являющееся проигрывателем для аудиофайлов формата Ogg/Vorbis с интерфейсом командной строки. Для этого мы будем использовать стандартные компоненты фреймворка GStreamer. Проигрыватель будет читать файл, заданный с помощью параметра командной строки. Давайте начинать работу!
В Главе 4, "Инициализация библиотеки фреймворка GStreamer" мы узнали о том, что первой операцией, которую необходимо выполнить с помощью вашего приложения, является инициализация библиотеки фреймворка GStreamer, которая осуществляется путем вызова функции gst_init (). Также следует убедиться в том, что к исходному коду приложения подключен заголовочный файл gst/gst.h. который содержит необходимые объявления всех имен функций и объектов. Используйте директиву #include <gst/gst.h> для подключения этого файла.
После этого вы захотите создать различные элементы с помощью функции gst_element_factory_make (). Для реализации проигрывателя аудиофайлов формата Ogg/Vorbis нам потребуется элемент для ввода данных, который будет читать данные с диска. Фреймворк GStreamer включает элемент с описанными функциями и именем "filesrc". Далее, нам потребуются какие-либо элементы для разбора файла, а также его декодирования с целью получения раскодированного аудиопотока. Для этой цели в составе фреймворка GStreamer имеются два элемента: первый элемент позволяет осуществить разбор потока формата Ogg на элементарные потоки (аудио- и видеопотоки) и носит имя "oggdemux". Второй элемент является декодером аудиопотока формата Vorbis и, соответственно, назван "vorbisdec". Так как элемент "oggdemux" создает динамические точки соединения для каждого элементарного потока, вам придется устанавливать обработчик сигнала добавления точки соединения "pad-added" для элемента "oggdemux" таким же образом, как описано в разделе под названием "Динамические (или не постоянно доступные) точки соединения" для того, чтобы связать элемент демультиплексора потока формата Ogg с элементом декодера аудиопотока формата Vorbis. Наконец, нам также потребуется элемент для вывода аудиоданных, в качестве которого мы используем элемент с именем "autoaudiosink", который автоматически определит звуковое устройство.
Последняя операция, которую нам стоит выполнить, заключается в добавлении всех элементов в контейнерный элемент типа GstPipeline и ожидании завершения проигрывания всей композиции. Ранее мы узнали о том, как как добавлять элементы в контейнерный элемент в Главе 6, "Контейнеры". а также о состояниях элементов в разделе под названием "Состояния элементов". Кроме того, мы также установим обработчик сообщений конвейера для того, чтобы получать уведомления об ошибках и определять момент окончания потока.
А теперь давайте объединим все наши размышления в форме кода для того, чтобы получить наш первый проигрыватель аудиофайлов:
Мы создали завершенный конвейер. Теперь мы можем схематично изобразить его следующим образом:
Рисунок 10.1. Конвейер приложения "hello world"
10.2. Компиляция файла helloworld.c и запуск приложенияДля компиляции примера "helloworld" следует использовать команду: cc -Wall helloworld.c -o helloworld $(pkg-config --cflags --libs gstreamer-1.0). Фреймворк GStreamer использует инструмент pkg-config для получения флагов компилятора и линковщика, необходимых для компиляции данного приложения.
В том случае, если вы используете нестандартную установку (т.е. вы самостоятельно скомпилировали исходный код и установили библиотеки фреймворка GStreamer вместо того, чтобы использовать предварительно собранные пакеты), убедитесь в том, что переменная окружения PKG_CONFIG_PATH указывает на корректную директорию ($libdir/pkgconfig).
В маловероятном случае использования не устанавливаемой версии фреймворка GStreamer (т.е. gst-uninstalled), вам придется использовать инструмент libtool для выполнения сборки программы helloworld с помощью аналогичной команды: libtool --mode=link gcc -Wall helloworld.c -o helloworld $(pkg-config --cflags --libs gstreamer-1.0).
Вы можете запустить приложение, собранное на основе кода из данного примера, воспользовавшись командой ./helloworld file.ogg. Замените file.ogg на имя файла формата Ogg/Vorbis с вашей любимой композицией.
10.3. ЗаключениеНастало время для заключительных пояснений относительно нашего примера. Как вы видите, создание конвейера является очень низкоуровневой, но мощной операцией. В следующих частях руководства вы познакомитесь с методикой создания более мощного мультимедийного проигрывателя, требующей меньше усилий благодаря использованию более высокоуровневых интерфейсов. Обо всем этом мы поговорим в Части IV, "Высокоуровневые интерфейсы для приложений на основе фреймворка GStreamer". Однако, сначала мы подробнее обсудим более сложные внутренние механизмы фреймворка GStreamer.
При рассмотрении примера должно быть ясно то, что мы можем достаточно просто заменить элемент с именем "filesrc" на какой-либо другой элемент, который будет принимать данные посредством сети или другой элемент ввода данных, который будет лучше интегрирован с вашим окружением рабочего стола. Вы также можете использовать другие декодеры и элементы разбора потоков/демультиплексоры для добавления поддержки мультимедийных потоков других типов. К тому же, вы можете использовать другой элемент вывода аудиопотока в том случае, если вы используете не Linux, а Mac OS X, Windows или FreeBSD, причем вместо него вы можете использовать элемент вывода данных для записи аудиопотоков в файлы на диске вместо их воспроизведения. Используя элемент для ввода данных, работающий с аудиокартой, вы можете даже захватывать аудиопоток вместо его проигрывания. Все эти примеры свидетельствуют о наличии возможности повторного использования элементов фреймворка GStreamer, которая является его значительным преимуществом.
snegovick — Втр, 04/03/2014 - 05:50
Эта заметка будет короткой и я опишу пару трюков связанных с отображением видео полученного с помощью gstreamer .
Речь пойдет о захвате и выводе изображения в GTK .
Я знаю два способа вывода видео в окно GTK. Первый способ, реализация которого почему-то чаще встречается на stackoverflow предполагает что всем процессом получения кадров и вывода в окно, будет заведовать GStreamer. Для реализации этого способа нужно сконструировать пайплайн, в конце которого будет находиться xvimagesink, а затем указать этому элементу xid окна, в которое надо выводить видео. Пример такой реализации можно найти в этом гисте: https://gist.github.com/snegovick/9337018 .
Данная реализация не подходит в случае если нужно вывести видео в окно с какими-либо контролами (с кнопками, например), потому что видео будет отрисовано поверх всего окна, и поверх кнопок тоже.
Т.к. мне захотелось вывести видео в диалоговое окно с кнопками, то я решил сделать иначе.
Делаем иначеВо-первых, мы используем мой любимый плагин/элемент для gstreamer: appsink. Этот элемент проделал путь из набора gst-plugins-bad в gst-plugins-base. так что он с нами по-видимому надолго. В кратце, этот плагин позволяет забирать у GStreamer сырые данные вместо того чтобы подставлять своё окно. Т.е. мы можем делать вообще всё что угодно с этими данными. Мы и будем.
Для начала немного подправим скрипт camera_source.py (он был ранее написан для статьи "Захват видео: python + gstreamer и немного v4l2-ctl" ).
Кстати, если полученная картинка имеет неправильную последовательность цветов, то не надо идти на поводу у stackoverflow и переставлять подмассивы цветов с помощью numpy. Гораздо проще поменять маски цветов в параметрах элемента capsfilter. На данный момент в коде выше последовательность - BGR вместо обычной RGB - таковы особенности моей камеры. Неплохо было бы когда-нибудь вынести это в отдельную настройку, но это потом.
Gstreamer — самая популярная *nix библиотека для работы с видео, которая является основой для большинства популярных приложений (основной список можно найти здесь ).
Однако, столь гибкий инструмент требует тонкого подхода для стабильной и эффективной работы.
Все действия будут рассмотрены на примере онлайн HD трансляции с HDMI входа по RTMP с помощью blackmagic intensity pro, Debian Linux, gstreamer и Nginx.
Отладка (debugging) ( manual )У gstreamer есть встроенная возможность отладки, справку можно получить командой:
Сам вывод отладочной информации включается добавлением в команду:
где LEVEL — число от 0 (без вывода отладочной информации) до 9 (выводить всё).
Очень полезным является параметр. который будет выводить список возможных форматов элементов конвейера, если два элемента не могут найти подходящие друг другу форматы.
Однако, основной проблемой является огромное количество информации, которую требуется каким-то образом интерпретировать с целью дальнейшей оптимизации.
В данной ситуации есть прекрасная возможность генерации схем конвейера gstreamer, которая позволит наглядно увидеть порядок работы вашего конвейера:
По полученным данным можно будет найти узкие места вашего конвейера и добиться стабильной работы.
ОптимизацияВ рамках примера оптимизации будет рассмотрены следующие требования:
Цель — работа системы в режиме реального времени без потерь кадров и синхронизации звука/видео.
Очень важно сразу выяснить, сколько кадров в секунду требуется и сколько может выдать ваше оборудование.
Оптимальным для динамического изображения является 30fps, но для передачи статичного контента (например, презентации) есть смысл уменьшать fps до минимально комфортного.
Многопоточность (использование queue )В Gstreamer существует элемент queue, который оправдывает своё название — это очередь (поток) данных.
Использование queue позволит распараллелить вычисления и буферизировать информацию в автоматическом режиме для передачи между элементами.
Данный элемент является одним из ключевых наравне с queue2 (аналог queue с буферизацией на жесткий диск) и tee (разделение потока на несколько, например, для параллельной записи потока на диск), и они все достойны отдельной статьи.
Настройка элементов конвейераКонечно же, ключевым моментом является настройка элементов конвейера (декодера звука и видео и т.д.).
v4l2src always-copy=false
filesink enable-last-buffer=false
Использование GStreamer для трансляции аудио/видео в обычном виде, т.е. запуск требуемой цепочки, имеет ряд неудобств - запуск GStreamer занимает несколько секунд, что не всегда является комфортным. А на лету изменить какой-либо параметр запущенной цепочки не представляется возможным.
Пример - управление ездящей тележой с камерой. За приём команд с управляющего устройства (смартфон, планшет, ПК и т.д.) отвечает какой-то скрипт или скомпилированное приложение (сервер команд). За трансляцию видео отвечает GStreamer. При подключении клиента сервер команд определяет с какого IP произошло подключения и должен направить видеопоток на этот IP. Порт может быть фиксированным или случайным. При обычном подходе сервер команд может при каждом подключении клиента убивать текущий процесс GStreamer и запускать его заново, с указанием требуемого IP приёмника. В таком случае перезапуск видео может занимать несколько секунд, что не всегда удобно.
Однако, все модули GStreamer имеют возможность чтения и изменения практически любых параметров, но сделать это можно только если они были запущены контролируемо, из самописного приложения, а не из штатного gst-launch.
Мы уже собирались писать собственное приложение для управления цепочкой udpsink, но при гуглении оказалось что такое приложение уже есть и позволяет делать всё что нужно (и даже больше).
Итак, встречаем героя дня - gstd (GStreamer Daemon).
Так как передача команд управления сервером происходит через D-bus, сначала надо запустить его.
Управление цепочкамиВажное преимущество такого способа управления цепочками - все операции можно производить "на лету", без останова трансляции. Т.е. если шла трансляция видео, например, на хост 192.168.1.20 а нам надо перекинуть его на 192.168.1.10 - достаточно лишь изменить соответствующий параметр и поток сразу пойдёт на указанный адрес.
Создание цепочкиСоздание цепочки производится утилитой gst-client.
Формат запуска:
После запуска демона gstd можно создать какую-нибудь цепочку. Для примера возьмём нашу обычную цепочку трансляции видео по RTP. Однако, потребуются небольшие изменения. Для элемента где указываются формат видео необходимо явно добавить "capsfilter caps=". А сам перечень параметров в этом элементе требуется указывать без пробелов. Апострофы и кавычки также необходимо убрать.
В результате выполнения этой команды увидим в консоли что-то вроде
Это означает что цепочка создана, ей присвоено имя "/com/ridgerun/gstreamer/gstd/pipe0" (а номер цепочки, соответственно, 0).
После создания цепочка находится в состоянии паузы, т.е. неактивна.
Как можно заметить, данная цепочка бесполезна, т.е. будет транслировать видео на хост 127.0.0.1.
Изменение цепочкиТеперь изменим адрес трансляции видео.
Для запуска трансляции на хост, допустим, 192.168.1.10, надо изменить параметр host элемента udpsink.
Важное замечание - все элементы цепочки при обращении к ним имеют имя, состоящее из обычного названии элемента с добавлением в конце порядкового номера. Это сделано по той причине, что в цепочке может быть несколько элементов с одинаковыми названиями.
Так что для изменения элемента udpsink нам надо указывать имя udpsink0.
GStreamer is a toolkit for building audio- and video-processing pipelines. A pipeline might stream video from a file to a network, or add an echo to a recording, or (most interesting to us) capture the output of a Video4Linux device. Gstreamer is most often used to power graphical applications such as Totem. but can also be used directly from the command-line. This page will explain how GStreamer is better than the alternatives, and how to build an encoder using its command-line interface.
Before reading this page. see V4L capturing to set your system up and create an initial recording. This page assumes you have already implemented the simple pipeline described there.
Introduction to GStreamerNo two use cases for encoding are quite alike. What's your preferred workflow? Is your processor fast enough to encode high quality video in real-time? Do you have enough disk space to store the raw video then process it after the fact? Do you want to play your video in DVD players, or is it enough that it works in your version of VLC. How will you work around your system's obscure quirks?
Use GStreamer if you want the best video quality possible with your hardware, and don't mind spending a weekend browsing the Internet for information.
Avoid GStreamer if you just want something quick-and-dirty, or can't stand programs with bad documentation and unhelpful error messages.
Why is GStreamer better at encoding?GStreamer isn't as easy to use as mplayer. and doesn't have as advanced editing functionality as ffmpeg. But it has superior support for synchronising audio and video in disturbed sources such as VHS tapes. If you specify your input is (say) 25 frames per second video and 48,000Hz audio, most tools will synchronise audio and video simply by writing 1 video frame, 1,920 audio frames, 1 video frame and so on. There are at least three ways this can cause errors:
GStreamer solves these problems by attaching a timestamp to each incoming frame based on the time GStreamer receives the frame. It can then mux the sources back together accurately using these timestamps, either by using a format that supports variable framerates or by duplicating frames to fill in the blanks:
To get accurate timestamps, specify the do-timestamp=true option for all your sources. This will ensure accurate timestamps are retrieved from the driver where possible. Sadly, not all v4l2 drivers support timestamps - GStreamer will add timestamps for these drivers to stop audio and video drifting apart, but you will need to fix the initialisation timing yourself.
Getting GStreamerGStreamer, its most common plugins and tools are available through your distribution's package manager. Most Linux distributions include both the legacy 0.10 and modern 1.0 release series - each has bugs that stop them from working on some hardware, and this page focuses mostly on the modern 1.0 series. Converting between 0.10 and 1.0 is mostly just search-and-replace work (e.g. changing instances of av to ff because of the switch from ffmpeg to libavcodec ). See the porting guide for more.
Other plugins are also available, such as GEntrans (used in some examples below). Google might help you find packages for your distribution, otherwise you'll need to download and compile them yourself.
Using GStreamer with gst-launchgst-launch is the standard command-line interface to GStreamer. Here's the simplest pipline you can build:
This connects a single (fake) source to a single (fake) sink using the 1.0 series of GStreamer:
GStreamer can build all kinds of pipelines, but you probably want to build one that looks something like this:
To get a list of elements that can go in a GStreamer pipeline, do:
Pass an element name to gst-inspect-1.0 for detailed information. For example:
The images above are based on graphs created by GStreamer itself. Install Graphviz to build graphs of your pipelines:
To get graphs of the example pipelines below, prepend GST_DEBUG_DUMP_DOT_DIR=gst-visualisations to the gst-launch command. Run this command to generate a PNG version of GStreamer's most interesting stage:
Remember to empty the gst-visualisations directory between runs.
Using GStreamer with entransgst-launch is the main command-line interface to GStreamer, available by default. But entrans is a bit smarter:
You will probably need to build your own GStreamer pipeline for your particular use case. This section contains examples to give you the basic idea.
Note: for consistency and ease of copy/pasting, all filenames in this section are of the form test-$( date --iso-8601=seconds ) - your shell should automatically convert this to e.g. test-2010-11-12T13:14:15+1600.avi
Record raw video onlyA simple pipeline that initialises one video source. sets the video format, muxes it into a file format, then saves it to a file:
This will create an AVI file with raw video and no audio. It should play in most software, but the file will be huge.
Record raw audio onlyA simple pipeline that initialises one audio source. sets the audio format, muxes it into a file format, then saves it to a file:
This will create an AVI file with raw audio and no video.
Record video and audioInstead of a straightforward pipe with a single source leading into a muxer, this pipe has three parts:
Muxers combine data from many inputs into a single output, allowing you to build quite flexible pipes.
Create multiple sinksThe tee element splits a single source into multiple outputs:
This sends your stream to a file ( filesink ) and out over the network ( tcpclientsink ). To make this work, you'll need another program listening on the specified port (e.g. nc -l 127.0.0.1 -p 5678 ).
Encode audio and videoAs well as piping streams around, GStreamer can manipulate their contents. The most common manipulation is to encode a stream:
The theoraenc and vorbisenc elements encode the video and audio using Ogg Theora and Ogg Vorbis encoders. The pipes are then muxed together into an Ogg container before being saved.
Add buffersDifferent elements work at different speeds. For example, a CPU-intensive encoder might fall behind when another process uses too much processor time, or a duplicate frame detector might hold frames back while it examines them. This can cause streams to fall out of sync, or frames to be dropped altogether. You can add queues to smooth these problems out:
This creates a file using FLAC audio and x264 video in lossless mode, muxed into in a Matroska container. Because we used speed-preset=ultrafast. the buffers should just smooth out the flow of frames through the pipelines. Even though the buffers are set to the maximum possible size, speed-preset=veryslow would eventually fill the video buffer and start dropping frames.
Some other things to note about this pipeline:
30GB/hour). Anything up to quantizer=18 should not lose information visible to the human eye, and will produce much smaller files (
10GB/hour)If motion that should appear smooth instead stops and starts, try the following:
Check for muxer issues. Some muxers need big chunks of data, which can cause one stream to pause while it waits for the other to fill up. Change your pipeline to pipe your audio and video directly to their own filesink s - if the separate files don't judder, the muxer is the problem.
Check your CPU load. When GStreamer uses 100% CPU, it may need to drop frames to keep up.
As a general rule, you should try increasing buffers first - if it doesn't work, it will just increase the pipeline's latency a bit. Be careful with nice. as it can slow down or even halt your computer.
Check for incorrect timestamps. If your video driver works by filling up an internal buffer then passing a cluster of frames without timestamps, GStreamer will think these should all have (nearly) the same timestamp. Make sure you have a videorate element in your pipeline, then add silent=false to it. If it reports many framedrops and framecopies even when the CPU load is low, the driver is probably at fault.
If your video contains periods of video noise (snow), you may need to deal with some extra issues:
Sadly, you will probably run into several GStreamer bugs while creating a pipeline. Worse, the debugging information usually isn't enough to diagnose problems. Debugging usually goes something like this:
For example, at the time of writing GStreamer 1.0 would fail to create a pipeline unless you specified format=UYVY. Here's the process I went through to find that out (minus some wrong turns and silly mistakes):
The chip that captures audio and video might not deliver the exact framerates specified, which the AVI format can't handle. The audiorate and videorate elements remove or duplicate frames to maintain a constant rate.
View pictures from a webcam (GStreamer 0.10)In GStreamer 0.10, videoconvert was called ffmpegcolorspace.
Entrans: Record to DVD-compliant MPEG2 (GStreamer 0.10)This captures 3 minutes (180 seconds, see first line of the command) to test-$( date --iso-8601=seconds ).mpg and even works for bad input signals.
For most use cases, you'll want to wrap GStreamer in a larger shell script. This script protects against several common mistakes during encoding.
See also the V4L capturing script for a a wrapper that represents a whole workflow.
The script uses a command line similar to this to produce a DVD compliant MPEG2 file.
Пусть Linux и не испытывает недостатка в таких настольных приложениях, как проигрыватели мультимедиа – Дмитрий Мусаев все равно покажет вам,
как написать еще один, свой собственный.
Не возникало ли у вас когда-нибудь желания написать свой собственный медиа-плейер? Дело не только в том, чтобы почить на лаврах Totem и Kaffeine – это еще и прекрасный повод познакомиться с мультимедиа-каркасом GStreamer (http://gstreamer.freedesktop.org ). Он написан на С и имеет интерфейсы для многих других языков программирования, таких как С++. Python и C#. На данный момент для него существует более 150 модулей расширения (plugin ), позволяющих декодировать практически все аудио- и видеоформаты (полный список доступен по адресу http://gstreamer.freedesktop.org/documentation/plugins.html ). С помощью этих модулей можно не только просматривать или прослушивать аудио- и видеофайлы, но и перекодировать их; например, вы сможете легко написать скрипт для конвертации фильма в формат, понимаемый вашим сотовым телефоном, если последний вообще умеет воспроизводить видео. Можно получать и отправлять медиа-потоки через сеть – в списке модулей вы найдете реализацию нескольких протоколов. Например, чтобы получить видео с web-камеры, достаточно набрать в терминале команду gst-launch v4l2src! xvimagesink.
Немного теорииОбщая архитектура каркаса GStreamer представлена на рис. 1. Как можно видеть, он состоит из базового ядра, утилит и подключаемых модулей. Давайте введем некоторые понятия.
Элемент [element] – наиболее важный компонент в GStreamer. Мы будем создавать цепочки связанных между собой элементов и направлять через них поток данных. Элементы соединяются коннекторами [pads]; это не вполне точный перевод, но мне кажется, он удобнее, чем «пады» или «подушки». Коннекторы бывают входными [sink pad] и выходными [source pad]. Элемент может иметь различное количество коннекторов: одни присутствуют всегда, другие создаются в зависимости от типа медиа-данных, которые проходят через элемент. Посмотреть, какие именно коннекторы доступны у данного элемента, можно при помощи утилиты gst-inspect. Выполните команду gst-inspect decodebin. и вы получите много интересной информации.
Мы видим, что у элемента есть постоянный входной коннектор “sink ”, совместимый с любым типом медиа-данных, и иногда выходные коннекторы “src%d ”, количество которых зависит от типа входных данных. Отметим также, что элемент посылает три сигнала (на них мы остановимся позже):
Контейнер [bin] – это объект для управления набором элементов. Контейнер позволяет объединять несколько связанных элементов в один логический. Все, что справедливо для элементов, справедливо и для контейнеров. Например, с помощью контейнеров можно заранее подготовить в программе наборы элементов для кодирования или декодирования различных форматов входных данных и потом, в зависимости от типа последних, использовать тот или иной контейнер.
Конвейер [pipeline] – это специальный подтип контейнера, который позволяет управлять всеми дочерними контейнерами и элементами. Конвейер должен быть контейнером самого верхнего уровня; он присутствует во всех приложения работающих с каркасом.
Элементы GStreamer могут находиться в одном из четырех состояний:
GStreamer является многопоточным каркасом, и чтобы упростить взаимодействие приложения и конвейера, в нем введена простая система передачи сообщений Bus (шина сообщений). Каждый конвейер автоматически создает шину сообщений – приложению остается только назначить обработчики сигналов и реагировать на интересующие его события. Обработчики могут быть синхронными и асинхронными; мы будем использовать оба типа. Асинхронный обработчик сигналов вызывается в контексте главного цикла Gtk -приложения.
GStreamer предоставляет два высокоуровневых контейнера – это Playbin и Decodebin. Они обеспечивают всю рутинную работу по определению типа медиа-данных и их декодированию. Playbin – готовый медиа-плейер, которому нужно указать лишь источник данных и дескриптор окна (что, впрочем, не обязательно – он может создать и свое собственное), куда будет выводиться видео. Но мы будем использовать Decodebin. так как он поддается более тонкой настройке.
Исходя из вышесказанного, давайте составим схему нашего будущего медиа-плейера. Графически она представлена на рис. 2, а в текстовом виде может выглядеть так:
Gst-launch – одна из ключевых вспомогательных утилит каркаса. Она позволяет размещать элементы на конвейере, восклицательный знак служит их разделителем: SRCELEMENT.PAD1!SINKELEMENT.PAD1. Если коннекторы не указаны, то перебираются все коннекторы и соединяются подходящие. Свойство name используется для задания имени элемента, что дает нам возможность обратиться к нему. При использовании имени элемента точка в конце обязательна – таков синтаксис команды.
Время кодироватьПерейдем к написанию кода. Я буду использовать C++ и среду разработки Anjuta ; при желании, вы можете обойтись простым текстовым редактором. Итак, запускаем Anjuta и создаем новый проект; на вкладке C++ выбираем GTKmm.
Введите имя проекта, например, Playermm. и выберите его местоположение на жестком диске. Готово: мы имеем функцию main() и Glade -форму нашего будущего приложения. Нажимаем F7 и соглашаемся с тем, что нам надо создать проект; после завершения компиляции нажимаем F3. После запуска приложения вы должны увидеть пустое окно с заголовком "Hello world!". Теперь внесем небольшие изменения в main.cc (выделены жирным шрифтом)
Рис. 3. Для написания медиа-плейера подойдет Anjuta или любая другая среда, ориентированная на GNOME.