UNICK-SOFT http:unick-soft.xost.ru
VLC документация для разработчиков
Разделы
Оглавление
Глава 1
Глава 2
Глава 3
Глава 4
Глава 5
Глава 6
Голосарий
Приложение А
Приложение B
Приложение C
Приложение E

Не нашли ответ здесь, заходите на Профессиональный ответ по VLC
< >

Использование libvlc в С++

Реклама

Глава 1. Обзор LibVLC

Что такое LibVLC?

LibVLC это главная часть VLC (в коде программы даже комментарий на против объявления LibVLC, который переводится как: «Корень зла») . Это библиотека, которая обеспечивает интерфейс доступа для программ, такой как VLC для доступа к большому количеству функций таких как: функции доступа к потокам, вывод звуков и изображения, работа с плагинами, работа с потоками. Все исходные файлы LibVLC расположены в папки src и содержит следующие поддиректории:

interface/: содержи код для пользовательского взаимодействия, такие как нажатия клавиш, извлечение устройств.

playlist/: управлением playlist. Такие функции как остановка, играть, играть случайный трек. В VLC плеере playlist запускается в отдельном потоке, и является одним из главных объектов. Все проигрываемые ролики помещаются в плейлист (даже если вы открываете один файл), хотя по началу так и не скажешь. Например, если вам надо что бы в конце проигрывания ролика плеер переходил на начало и останавливал проигрывания, то вам необходимо внести изменения в поток playlist-а, что бы в место прекращения позиция становилась равной 1, и потом включалась пауза.

input/: отвечает за открытие файлов, потоков, чтения пакетов и посылка его декодеру. Чтения также работает в отдельном потоке.

video_output/: инициализация видео дисплея, получения всех картинок и субтитров, преобразование изображения в нужный формат и вывод изображения. Всё это осуществляется в отдельном потоке. Одна из главных функция, которая всё это сделает, за исключением инициализации void RunThread( vout_thread_t *p_vout), которая располагается в файле video_output.c.

audio_output/: инициализация аудио, определия правильно частоты проигрывания, восстанавливать форму квантованного сигнала получаемого от декодера.

stream_output/: вывод видео, в сеть или в файл при конвертации, VLC также умеет транслировать видео с сеть.

misc/: разные утилиты для использования их в других частях libvlc, таких как работа с потоками, очередью сообщений, определения CPU, система поиска объектов, или код специфичный для платформ.

network/: работа с сетью на низком уровне, чтение пакетов, запись пакетов.

control/: реализация функций управления для внешних программ, которые используют libvlc.

modules/: функции для работы с модулями: поиск, создания, удаления, управление ссылками. Вообще весь VLC плеер построен на модулях, существует множество модулей с одними функциями, например OpenGL и DirectX оба могут использоваться для вывода видео, но они могу отличатся рейтингом, и соответственно с большим рейтингом программа выберет модуль.

Что такое VLC?

VLC это простая программа создания для использования LibVLC (так написано в документации, это мне кажется эта программа уже давно не простая.) . VLC имеет множество мультемидийных возможностей благодаря LibVLC , которая поддерживает динамическую подгруздку модулей.

Модули VLC.

Модули расположены в поддиректориях директории modules/ и загружаются во время исполнения (хотя это справедливо только для динамической линковки, то есть когда каждый модуль представляет из себя отдельный файл - динамической библиотеки) . Каждый модель может различаться по функциональности, которая может быть лучше для отдельных файлов или отдельной среды. Мало того, различные модули по-разному работать на разных платформах, или вообще не поддерживается определёнными платформами.
Модули плагинов загружаются и выгружаются динамически, этой работой занимаются функции из файлов src/misc/modules.c и include/modules*.h. API будет рассмотрено в главах ниже.
Модули могут быть встроены напрямую в приложении, которое использует LibVLC, в отдельном случае, в операционной системе, которая не поддерживает динамические библиотеки. Модули статично встраиваемые в приложение называются builtins. Из своего опыта под ОС Windows, встроить все модули в приложение можно, но только придётся править makefile, так как генерируются makefiles не совсем корректные. Смысл в том, что бы в месте когда линкуется exe файл, добавить командную строку все статические либы, которые необходимы.

Потоки

Управление потоками

VLC очень многопоточное приложение. Мы решили делать так, а не однопоточное приложение, потому что приготовления декодера и планирования должны управляться (для случия декодера и вывод изображений должно быть в отдельных потоках, иначе не возможно показывать кадр точно в необходимое время.) и мы сейчас не имеем плана для поддержки однопоточных клиентов. Много процессорный декодер обычно подразумевает более накладно (проблемы доступа к памяти) и взаимодействие между потоками.

Наши потоковые структуры основана на pthreads (Кажется это для большинства Unix систем, для Windows используются стандартные функции работы с потоком). Однако, для краткости мы не называем pthread_* функциями на прямую, но используем одинаковые wrapper, созданные как vlc_thread_create, vlc_thread_exit, vlc_thread_join, vlc_mutex_init, vlc_mutex_lock, vlc_mutex_unlock, vlc_mutex_destroy, vlc_cond_init, vlc_cond_signal, vlc_cond_broadcast, vlc_cond_wait, vlc_cond_destroy, и структуры vlc_thread_t, vlc_mutex_t, и vlc_cond_t.

Синхронизация

Другая ключевая особенность VLC это декодировании и проигрывания (вывод изображения на экран) асинхронные: декодирование выполняется в потоке декодирования, проигрывание выполняется в потоках audio_output и video_output. Конструктивная цель в том, что бы быть уверенным, что аудио или видео кадр проигрывается точно в правильное время, без блокировки других потоков декодирования. Это ведёт к сложному взаимодействию между структурами потоков интерфейса, ввода, декодирования и вывода.

Имея несколько входных потоков и потоков вывода видео чтение несколько файлов одновременно позволяет, несмотря факт который текущий интерфейс не позволяет любого пути сделать это [это субтитры сменяющиеся в недалеком будущем]. Anyway the client has been written from the ground up with this in mind. This also implies that a non-reentrant library (including in particular liba52) cannot be used without using a global lock.

Представление индексов времени расположено в системе слаёв потока, которые обрабатываются декодером и всех результирующих семплов датируются соответственно. Выводные слои поддерживают проигрывание в правильно время. Время переводится в микросекунды, абсолютно количество миллисекунд с начала эпохи. (1 января 1970 года). Тип mtime_t это 64-битное целое число.

Текущие время может быть получено с помощью mdate(). Использование потоков может быть приостановлено до точной даты полученной через via mwait ( mtime_t date ). Вы можете приостановить поток на определённое количество микросекунд с помощью функции msleep ( mtime_t delay ).

Предупреждение:
Please remember to wake up slightly before the presentation date, if some particular treatment needs to be done (e.g. a chroma transformation). For instance in modules/codec/mpeg_video/synchro.c, track of the average decoding times is kept to ensure pictures are not decoded too late.

Правила оформления кода

Название функций

Все функции называются таким образов: «имя модуля»(маленькими буквами) + «_» + имя функции (каждое слово с большой буквы без символов «_»). Например: intf_FooFunction. Статические функции не нуждаются в использовании имя модуля.

Имена переменных:

Используется венгерская нотация, которое значит мы используем соответствующие префиксы:

i_ для integers (иногда l_ для long integers);
b_ для booleans;
d_ для doubles (иногда f_ для floats);
pf_ для указателей на функцию;
psz_ для указателя на строчку с нулём на концеa (C-строка);
В большинстве случаев мы добавляем «p» когда переменные являются указателями. Если одна переменная не имеет базового типа (например, сложные структуры), не используются различные префиксы (исключая «p_» для указателей). После первого префикса идёт точное имя переменной в нижнем регистре. Если имя переменной содержит несколько слов, то слова соединяются нижними подчёркиваниями «_» (не различными регистрами) Например:

data_packet_t * p_buffer;
char psz_msg_date[42];
int pi_es_refcount[MAX_ES];
void (* pf_next_data_packet)( int * );

Пару слов о пробелах.

Первое, никогда не используете символ табуляции в исходных файлах (они должны использоваться в Makefile :-). Используйте expandtab под vim или его эквивалент под emacs. Требует уровни отделять 4 пробелами.

Второе, пробелы между операторами, и внутри скобок. Например:
for( i = 0; i < 12; i++, j += 42 );

Третье, закрывающиеся и открывающиеся фигурные скобки должны быть на одном уровни и на отдельной строке (GNU стиль). Например:
if( i_es == 42 )
{
p_buffer[0] = 0x12;
}

Мы пишем на C и используем C-стиль комментариев /* ... */.

< >
Программа была скачена с сайта http://unick-soft.xost.ru

со всеми вопросами обращаться на soft_support@list.ru