Комплексна обробка мультимедіа за допомогою gstreamer
Рішенням цієї проблеми може стати використання GStreamer. Об'єднуючи різні інструменти і бібліотеки та реалізуючи узагальнену концепцію media pipeline (мультімедіаконвейер), GStreamer дозволяє працювати з різними типами мультимедіа за допомогою єдиного підходу. Це дозволяє зосередитися безпосередньо на мультимедіа, замість того щоб кидати всі сили на перевірку і забезпечення сумісності форматів.
GStreamer дозволяє вирішити безліч проблем, наприклад, перекодування файлів різних аудіоформатів в загальний формат. Так як всі формати обробляються однаково, для цього буде потрібно лише один інструмент. Це економить час і робить рішення більш цілісним і підтримуваним. Крім того, після вивчення основних принципів GStreamer можна знайти нові можливості для його застосування. Для передачі аудиопотока по мережі необхідно подбати тільки про мережевому взаємодії, тому що API-інтерфейси для відтворення звуку і базових завдань залишаться незмінними.
Основні принципи
Оскільки по функціональності GStreamer знаходиться вище рівня звичайної бібліотеки, важливо точно розуміти, на що вона здатна, що знаходиться за рамками її можливостей, і як ці можливості реалізовані.
GStreamer - це бібліотека для обробки мультимедіа даних. Це означає, що доведеться працювати з якоїсь абстрактної моделлю перетворення (transformation), що складається з введення / виводу даних і різних проміжних стадій. Таке рішення дозволяє розробити конкретний варіант перетворення з урахуванням вхідного типу даних і необхідного вихідного формату. Приклади подібних перетворень:
Для досягнення такого різноманіття результатів GStreamer оперує абстрактним поняттям pipeline (конвеєра). Pipeline - це спрямований граф, в якому медіа-дані протікають в заданому напрямку - від входу до виходу. Pipeline складається з element'ов (елементів), і це ще одне ключове поняття. Element - це об'єкт, який поміщається в pipeline і дозволяє виконати певне перетворення мультимедійних файлів. Можна пов'язати елементи між собою, щоб вони разом організували процес, які перетворює вхідні дані в необхідний формат вихідних. Для наочності вважається, що потік даних через pipeline проходить зліва (вхідний потік) направо (вихідний потік). Такий же підхід застосовується для опису конвеєра за допомогою інструменту gst-launch. як буде показано нижче.
Сам по собі GStreamer не містить елементів, головна його задача - створення конвеєра з наданих елементів. Конкретні завдання вирішуються за допомогою плагінів. Кожен плагін, який розповсюджується у вигляді відкомпільованого файлу (.so для Unix® або .dll для Microsoft® Windows®), містить один або кілька елементів. При запуску GStreamer опитує всі встановлені плагіни, щоб зібрати список доступних елементів. Зазвичай доданок не сам виконує обробку мультимедіа, а взаємодіє з іншими бібліотеками для даних задач: наприклад, декодер MPEG2 викликає існуючу бібліотеку для роботи з MPEG-форматом. Однак подібне делегування виконується прозоро для додатка, і воно взаємодіє тільки з елементами із загальним інтерфейсом.
Деякі плагіни поширюються в базових пакетах і являють собою єдину бібліотеку, що складається з різних елементів. Інші базові плагіни поширюються в пакеті gst-plugins-base. Вони є в більшості варіантів установки GStreamer. Також є gst-plugins-good, -bad і -ugly пакети, де підібрані різні плагіни в залежності від рівня підтримки і принципу поширення. Нарешті, є плагіни, поширювані сторонніми виробниками і призначені для обмеженого використання тільки одним додатком.
Приклад використання GStreamer
Тепер, після пояснення базових понять GStreamer, прийшла черга вивчити їх реалізацію. Для цього необхідно ввести декілька нових понять.
Плутанина в назвах - sink (англ. Викид) - це вхід, а source (англ. Джерело) - вихід ?!
Насправді плутанини немає. Через sink pad (точку входу) в елемент надходять дані, а в source pad (точки виходу) іншого елементa вони починаються. Тому елемент тільки з точками виходу називається source (джерело), а елемент тільки з точками входу називається sink (споживач). Так що все просто, незважаючи на гадану логічну помилку.
Як згадувалося, головним поняттям в обробці є element, представлений класом GstElement. GStreamer написаний на C, але використовує бібліотеку GObject з GTK + для додаткових ООП можливостей (див. Розділ Ресурси). Цей GstElement має дві pads (точки стикування) з іншими елементами GStreamer. Є два типи pads:
- sink pad. точка входу для мультимедійних файлів.
- source pad. точка виходу даних, оброблених елементом.
У pad є параметри, звані caps (насадки), що визначають дані якого формату можуть проходити через pad. Наприклад, лістинг 1 представляє код для елемента vorbisdec. який декодує вільний формат Vorbis. Знак долара $ на початку рядка вказує, що це звичайна команда оболонки UNIX.
Лістинг 1. Фрагмент опису елемента vorbisdec
Як ми бачимо, в фрагменті оголошені два шаблони pad: один для виведення даних (src), інший для введення (sink). Pad для виведення доступний постійно (Always) і підтримує наступний шаблон відтворюваних даних: необроблене аудіо з частотою від 8 до 50 кГц, від одноканального до шестиканального, з прямим порядком байтів і 32-бітових семплами. Інші можливі варіанти типу доступу: іноді (sometimes) і завжди (request). Шаблон вхідного pad також забезпечує постійний доступ і дозволяє приймати аудіо в форматі Vorbis.
Ці шаблони вкрай важливі для коректної роботи конвеєра. При спробі зв'язати разом два елементи, щоб сформувати конвеєр, GStreamer перевіряє, чи сумісні шаблони pad'ов пов'язують елементів. Цей процес називається negotiation (переговори). Під час переговорів елементи намагаються підібрати кращий формат з тих, які вони обидва можуть підтримувати. Якщо це не вдається, то зв'язування елементів не виконується. Якщо ж вони вибирають загальний формат, то цей формат уже не один з можливих шаблонів, а fixed caps - однозначно затверджений формат обміну даними. Тепер дані можуть передаватися від одного елемента до іншого.
Представленої інформації цілком достатньо для початку роботи з GStreamer. Для цього буде потрібно універсальний інструмент для GStreamer - gst-launch.
Робота з gst-launch
Інші утиліти GStreamer
На додаток до gst-launch GStreamer пропонує інші вкрай корисні утиліти, такі як gst-inspect і gst-typefind.
Коли невідомо, як застосувати будь-якої element, скористайтеся gst-inspect. На ім'я запитуваної елементa або плагіна gst-inspect виведе всі відомості, які GStreamer може надати про нього.
Використовуючи gst-typefind. GStreamer-аналог file (1) -Утиліта UNIX, можна дізнатися тип файлу, точніше, до якого типу відносить цей файл сам GStreamer.
gst-launch - це універсальна програма з широкими можливостями. Для GStreamer інструмент gst-launch - це те ж саме, що оболонка shell для UNIX. З його допомогою можна створювати складні конвеєри, використовуючи спеціальний синтаксис команд gst-launch. як показано в лістингу 2.
Лістинг 2. Використання утиліти gst-launch
Код з лістингу 2 являє собою найпростіший аудіоплеєр, що використовується для відтворення файлу concept.mp3. У таблиці 1 наводиться детальний розбір коду.
Таблиця 1. Розбір коду лістингу 2 по фрагментах
Створюється element класу filesink (приймач файлів) і встановлюється його властивість location (місце розташування) на файл concept.mp3. Цей елемент може зчитувати файли, зазначені в location. і запустить програму зчитування файлу concept.mp3 в поточному каталозі.
Знак оклику означає зв'язати з (link to). Схожий на символ | оболонки shell, він був обраний з-за зовнішньої схожості і так як може використовуватися без обробки в shell, якщо оточений пробілами.
Це найважливіший елемент в складі Gstreamer - autoplugger (компоновщик). Використовуючи типи даних, задані його для входу і виходу, він переглядає всі доступні елементи, щоб організувати sub-pipeline, який забезпечить необхідний результат. Вхідні / вихідні формати всіх елементів GStreamer повинні бути чітко зазначених у них, тому знак оклику (.) Неявно надає інформацію про форматах елементів, які їм пов'язані. Так як filesrc має cap типу ANY. то першим завданням decodebin є визначення дійсного розміру потоку (typefind). Для цього він зчитує параметри, які визначають тип даних. Всі ці дії виконуються прозоро для користувача.
Цей елемент використовується для виведення аудіо в Linux®. Він взаємодіє зі звуковою картою і виводить на неї підготовлені аудіоматеріали. Також він контролює пропускну здатність конвеєра, так як звукова карта може сприймати дані тільки з певною швидкістю.
Після натискання Enter виводиться кілька інформаційних повідомлень, поки конвеєр не досягне стану PLAYING (відтворення). У цей момент дані починають рух через конвеєр, і аудіокарта запускає відтворення звуку через динаміки.
Як ми бачимо, GStreamer дозволяє значно спростити обробку мультимедійних файлів. Немає навіть необхідності знати точний формат матеріалів, які необхідно перетворити. Однак, як оболонка shell не здатна замінити програми на мові С, так і gst-launch не може замінити повноцінне додаток GStreamer. Наприклад, gst-launch не може контролювати роботу конвеєра після його запуску, що не дозволяє пропускати непотрібні ділянки в потоці даних. Незважаючи на ці обмеження gst-launch неймовірно зручний інструмент для швидкого вирішення простих завдань, таких як перекодування файлів з одного формату в інший.
Продовження знайомства з GStreamer
Повне керівництво по gst-launch можна знайти у відповідному розділі man. Його синтаксис дозволяє створювати більш складні і цікаві конвеєри, включаючи ті, які можна придумати самим. Також можна створити свій варіант gst_launch. більш детально ця можливість розбирається в розділі документації по функції gst_parse_launch ().
Крім того, ви можете приєднатися до списку розсилки або IRC-каналу (#[email protected]). У співтоваристві розробників GStreamer можна знайти ту людину, яка допоможе вам або яким зможете допомогти ви.
- Multipurpose multimedia processing with GStreamer (EN). оригінал статті
- GStreamer Application Development Manual. додаткова інформація про GStreamer і його можливості при розробці додатків.
- GStreamer Plugin Writer's Guide. керівництво для створення власних плагінів.
- GStreamer 0.10 Core Reference Manual. довідкове керівництво по GStreamer.
- GObject Reference Manual. це керівництво дозволить дізнатися більше про об'єктно-орієнтованої бібліотеці, використовуваної GStreamer.
- AIX® і UNIX. розділ AIX і UNIX сайту developerWorks надає багато різної інформації, що відноситься до всіх аспектів системного адміністрування AIX і прийомам роботи з UNIX.
- Семінари і навчання на developerWorks Україна
- Podcasts. аудіозаписи презентацій експертів IBM.
Отримати продукти і технології
- Домашня сторінка GStreamer. на цьому сайті розміщені останні оновлення та дистрибутиви GStreamer.
- Istanbul. додаток на базі GStreamer для запису сеансів на настільному комп'ютері.
- IBM trial software. ознайомчі версії програмного забезпечення для розробників, які можна завантажити зі сторінки спільноти developerWorks.