Программа, предназначенная для воспроизведения видео файлов
Создание информационной мультимедиа системы (медиа-плеера) для презентации аудио-видео информации о факультете КТАС, представленной в специально отснятых и смонтированных avi-файлах. Разработка модуля пользовательского интерфейса, выходные данные.
Рубрика | Программирование, компьютеры и кибернетика |
Вид | курсовая работа |
Язык | русский |
Дата добавления | 21.11.2014 |
Размер файла | 41,5 K |
Отправить свою хорошую работу в базу знаний просто. Используйте форму, расположенную ниже
Студенты, аспиранты, молодые ученые, использующие базу знаний в своей учебе и работе, будут вам очень благодарны.
Размещено на http://www.allbest.ru
Размещено на http://www.allbest.ru
СОДЕРЖАНИЕ
РЕФЕРАТ
ВВЕДЕНИЕ
1. ЭСКИЗНЫЙ ПРОЕКТ
1.1 Концептуальная модель системы
1.2 Методика реализации визуализации ИМС
1.3 Методика реализации пользовательского интерфейса
2. ТЕХНОЛОГИЧЕСКИЙ ПРОЕКТ
2.1 Технология разработки модулей программы
2.2 Разработка модулей
2.2.1 Разработка модуля воспроизведения
2.2.2 Разработка модуля пользовательского интерфейса
3. РУКОВОДСТВО ПРОГРАММИСТА
3.1 Назначение и условия применения программы
3.2 Входные и выходные данные
ЗАКЛЮЧЕНИЕ
СПИСОК ИСПОЛЬЗОВАННЫХ ИСТОЧНИКОВ
Приложение 1.Листинг модуля воспроизведения playwnd.h на языке С++
Приложение 2.Листинг модуля воспроизведения playwnd.cpp на языке С++
РЕФЕРАТ
Объем пояснительной записки составляет: 26 МП листа формата А4., ИЛ2.Использованных источников - 4.
КЛЮЧЕВЫЕ СЛОВА: DirectShow, DirectX, IGraphBuilder, IMediaControl, видеоизображение, интерфейс, информационные мультимедиа системы, кодек, пиксель, скорость воспроизведения, цветовая гамма.
Цель разработки: создание информационной мультимедиа системы (медиа-плеера) для презентации аудио-видео информации о факультете КТАС, представленной в специально отснятых и смонтированных .avi файлах.
Результатом разработки является программная реализация специализированного видео проигрывателя и оформление его в виде прикладного приложения в среде Visual C++ 2003 .NET, а также построение специализированного модуля для воспроизведения и управления воспроизведением .avi файлов.
Основные характеристики данная программа отличается универсальностью, интуитивностью, простотой взаимодействия модулей. Также программу хорошо характеризует простой, но мощный алгоритм отображения видео файла, который должен действовать на многих машинах, имеющих необходимый минимум для этого.
Основное применение приложения заключается в представлении информации о кафедре ВТ и АСУ для всех желающих.
ВВЕДЕНИЕ
Количество систем, предоставляющих возможность создания информационных мультимедиа систем (далее ИМС) достаточно велико. Областью применения подобных программ является такая обширная сфера деятельности, как образование создание видеоконференций и презентаций. В больших программных комплексах такого рода проигрывание видео информации является лишь одной из услуг, предоставляемых разработчиками.
На сегодняшний день широко известными системами создания ИМС являются PowerPoint, Dream viewer, 3DS Max, Alias Wave Front Maya, Adobe Premiere и Macromedia Flash. Они предоставляют пользователю возможность установки, настройки и конфигурирования программного обеспечения, позволяющего создавать мультимедиа приложения для различных сфер деятельности, а также создавать полноценные видеоролики с трёхмерной графикой.
В курсовом проекте для реализации информационной мультимедиа системы был выбран принцип модульности и применен таким образом, что оболочка программы разрабатывается независимо от подключаемых модулей декодирования видео информации. Модульность ведёт к упрощению разработки системы в целом, а также способствует уменьшению ошибок при соединении модулей в систему, вследствие того, что компиляция и тестирование отдельных модулей производится независимо от остальных модулей. Использование специально разработанного алгоритма, на основе технологии DirectShow, проигрывания видео информации позволяет добиться достаточного быстродействия при среднем аппаратном обеспечении и отсутствия установки, что позволяют говорить об относительной универсальности системы по сравнению с ИМС, выполненными с помощью рассмотренных ранее средств. Разработка модуля воспроизведения на основе интерфейсов DirectShow и документации по DirectX SDK делает работу несложной и увлекательной.
В целом можно сказать, что ведение разработок в данной отрасли информационных технологий является довольно перспективным и востребованным в наши дни, о чем говорит обширный рынок программных продуктов этой индустрии и специальных средств для созданию своих приложений, использующих самые последние мультимедиа технологии.
1 ЭКСКИЗНЫЙ ПРОЕКТ
1.1 Концептуальная модель системы
Концептуальная модель разрабатываемого приложения представляет собой структуру ключевых абстракций предметной области и механизмов взаимодействия системы, разрабатываемой в рамках объектно-ориентированного подхода, и включает в себя:
1)Подсистема визуализации работы оболочки программы (модуль взаимодействия с пользователем);
2) Подсистема декодирования видео данных;
3) Подсистема кодирования видео данных;
Схематичное изображение работы данной системы представлено на рисунке 1.
поток команд
поток команд
поток д.д.
поток
файлов поток д.д.
Рисунок 1 - Функциональное взаимодействие внутренних структур графической подсистемы DirectShow и программной оболочки проекта.
Основой взаимодействия компонентов является передача совместно используемых данных между объектами посредством ссылок и указателей на объекты.
В первом приближении сценарий работы обучающей мультимедиа системы:
Принять запрос пользователя, как реакцию на изменение или выбор того, или иного визуального компонента программы (нажатие кнопок выбора ролика, проигрывания, останова, отключения звука, закрытия приложения, развёртки на весь экран);
В соответствии с выполненным пользователем действием, сгенерировать сообщение.
Вызвать функцию обработчик по карте сообщений в соответствии с поступившим сообщением;
Передать видео данные модулю декодирования, предоставляемого операционной системой.
Вывести на экран декодированную видео информацию.
Перевести систему в состояния готовности принять и обработать очередной запрос, либо реакцию пользователя.
Также необходима независимость работоспособности ИМС от операционной системы, в которой её запускают. Оболочка обучающей программы будет выполнять основные функции реакции на запросы пользователь, а также отображение информации.
Не менее значимой частью ИМС является реализация видео информации, которая представляет собой отдельные файлы, подключаемые к программе при запуске. Каждый файл соответствует определенному разделу. Файлы видео информации содержат независимые блоки информации соответствующие основной теме презентации - «Презентации видео информации о факультете КТАС».
1.2 Методика реализации визуализации ИМС
Говоря о визуализации ИМС, будем иметь ввиду использование библиотеки визуальных компонентов (DirectX) среды Microsoft Windows, применительно к главному рабочему окну программы. Поскольку остальные модули не имеют собственных интерфейсов взаимодействия с пользователем, а подключаются к главному окну, то необходимо приложить максимум усилий на доступность и простоту его функциональных возможностей.
Для выбора и запуска файлов содержащих видео информацию программы будем использовать одну из стандартных частей библиотеки DirectX: DirectShow. Он позволяет отображать декодированную видео информацию. Для отображения видео будем использовать оконный и полноэкранный режим по выбору пользователя.
1.3 Методика реализации пользовательского интерфейса
Для создания окон произвольной формы использовались регионы, которые являются элементами графической подсистемы Windows GDI (Graphic Development Interface).
2 ТЕХНОЛОГИЧЕСКИЙ ПРОЕКТ
2.1 Технология разработки модулей программы
Технология разработки включает в себя следующие этапы:
Анализ предметной области;
Выделение основных абстракций предметной области и оформление их в виде классов;
Определение интерфейсов классов, выделенных на втором этапе;
Реализация операций, определенных на этапе проектирования;
Отладка созданного приложения;
Тестирование приложения.
Проектирование приложений является итеративным процессом, поэтому на протяжении всех этапов разработки необходимо возвращаться к предыдущим этапам для их уточнения.
2.2 Разработка модулей
Разработка модулей является основной задачей на данном этапе и в проектировании системы в целом.
2.2.1 Разработка модуля воспроизведения
DirectShow -- это API, позволяющий Windows-приложениям управлять широким спектром устройств ввода аудио-- и видеоинформации, в частности цифровыми видеокамерами, веб-камерами, DVD-приводами и платами ТВ-тюнеров. Он обеспечивает программную поддержку множества форматов -- от WAV и AVI до Windows Media. Кроме того, DirectShow является расширяемой технологией и позволяет сторонним разработчикам поддерживать собственные специализированные устройства, форматы и компоненты обработки. DirectShow доступен как часть Microsoft DirectX SDK.
Успешному решению поставленной задачи помогло знание интерфейсов DirectShow и среды разработки приложений Microsoft Visual Studio .NET 2003.
Архитектура DirectShow построена таким образом, чтобы программисту было легко работать с ним. Загрузка и воспроизведение файлов требует небольшого числа процедур и проста в исполнении.
Перечень интерфейсов, использованных в работе:
IGraphBuilder ;
IMediaControl ;
IMediaEventEx ;
IVideoWindow ;
IBasicAudio ;
IBasicVideo ;
IMediaSeeking ;
IMediaPosition;
Все интерфейсы наследованы от интерфейса IUnknown, который имеет всего три функции:
AddRef - добавление ссылки на объект интерфейса
QueryInterface - получение родительских или наследственных интерфейсов выбранного объекта
Release - удаление из памяти интерфейса и возвращение затраченных аппаратных средств
Подробнее остановимся на интерфейсах DirectShow.
IGraphBuilder - интерфейс, осуществляющий построение картинки с помощью определённых DirectShow фильтров.
IMediaControl - интерфейс, осуществляющий контроль над воспроизведением файла (получается на основе интерфейса IGraphBuilder)
IMediaEventEx - более расширенный интерфейс для контроля над осуществлением мультимедиа событий при воспроизведении файла (получается на основе интерфейса IGraphBuilder)
IvideoWindow - интерфейс, осуществляющий управление окном для вывода графической информации (получается на основе интерфейса IgraphBuilder)
IBasicAudio, IBasicVideo - интерфейсы для доступа к базовым видео и аудио функциям
IMediaSeeking, IMediaPosition - интерфейсы для перемещения по воспроизводимому файлу для поиска нужных фрагментов и контроля за текущим временем воспроизведения.
Алгоритм воспроизведения видео файла:
Создание интерфейса IGraphBuilder с помощью функции CoCreateInstance()
Определяем имя воспроизводимого файла
Вызов функции IGraphBuilder::RenderFile для установки связи между файлом на жестком диске и интерфейсом IGraphBuilder
Получение интерфейсов IMediaControl, IMediaEventEx, IMediaSeeking, IMediaPosition, IvideoWindow, IBasicAudio, IBasicVideo с помощью функции QueryInterface.
Проверка, является ли файл только аудио файлом
Если нет, то определяем стиль окна вывода с помощью функций put_Owner и put_WindowStyle и далее инициализируем окно вывода с помощью функции InitVideoWindow в которой можно изменять масштаб выводимого изображения
Если да то инициализируем окно плеера.
Показываем окно приложения
Обновляем окно приложения для борьбы с артефактами
Устанавливаем нормальную скорость воспроизведения 1.0
Вызываем функцию Run интерфейса IMediaControl
Алгоритм остановки воспроизведения видео файла
Если состояние проигрывателя «Воспроизведение» или «Пауза» то
Вызываем функцию SetPositions интерфейса IMediaSeeking
Вызываем функцию Pause() интерфейса IMediaControl
Для паузы воспроизведения нужно вызвать функцию Pause() интерфейса IMediaControl.
Для продолжения воспроизведения нужно вызвать функцию Run() интерфейса IMediaControl.
В процессе разработки модуля воспроизведения был создан класс Player. Прототипы его функций можно представить так:
//
// Function prototypes
//
//Инициализация окна плеера
HRESULT InitPlayerWindow(void);
//Инициализация окна воспроизведения
HRESULT InitVideoWindow(int nMultiplier, int nDivider);
//Переключение между полноэкранным и оконным режимами
HRESULT ToggleFullScreen(void);
//Обработка графических событий
HRESULT HandleGraphEvent(void);
//Переключение между тишиной и нормальным по громкости воспроизведением
HRESULT ToggleMute(void);
//Закраска окна в режиме “только звук”
void PaintAudioWindow(void);
//Проверка на наличие видео данных в файле
void CheckVisibility(void);
//Освобождение интерфейсами аппаратных ресурсов
void CloseInterfaces(void);
//Открытие файла
void OpenClip(int);
//Пауза
void PauseClip(void);
//Остановка
void StopClip(void);
//Закрытие клипа
void CloseClip(void);
Прототипы его констант и переменных можно представить так:
//
// Constants
//
//объём звука при нормальном воспроизведении
#define VOLUME_FULL 0L
//объём звука при заглушенном воспроизведени
#define VOLUME_SILENCE -10000L
// начальный путь для поиска мультимедиа файлов
#define DEFAULT_MEDIA_PATH TEXT("\\\0")
// Константы отвечающие за геом. Размеры окна в пикселях
#define DEFAULT_AUDIO_WIDTH 240 // Ширина по //умолчанию в режиме «только звук»
#define DEFAULT_AUDIO_HEIGHT 120 // Высота по //умолчанию в режиме «только звук»
#define DEFAULT_VIDEO_WIDTH 320 // Ширина по //умолчанию
#define DEFAULT_VIDEO_HEIGHT 240 // Высота по //умолчанию
#define MINIMUM_VIDEO_WIDTH 200 // мин ширина
#define MINIMUM_VIDEO_HEIGHT 120 // макс ширина
// перечисляемый тип состояния плеера
enum PLAYSTATE {Stopped, Paused, Running, Init};
//
//Макро определения
//
#define SAFE_RELEASE(x) { if (x) x->Release(); x = NULL; }
#define JIF(x) if (FAILED(hr=(x))) \
{Msg(TEXT("FAILED(hr=0x%x) in ") TEXT(#x) TEXT("\n\0"), hr); return hr;}
#define LIF(x) if (FAILED(hr=(x))) \
{Msg(TEXT("FAILED(hr=0x%x) in ") TEXT(#x) TEXT("\n\0"), hr);}
//Внешние переменные
extern PLAYSTATE g_psCurrent;
extern HWND ghApp;
extern HINSTANCE ghInst;
extern BOOL g_bFullscreen;
Разработанный класс имеет все основные возможности для комфортного воспроизведения и управления воспроизведением файла.
2.2.2 Разработка модуля пользовательского интерфейса
Модуль пользовательского интерфейса программы является важной частью программы, так как от результатов разработки этого модуля зависит «внешний вид» ИМС, ее доступность и функциональность. При разработке интерфейса были использованы следующие возможности библиотеки GDI+: Создание окон произвольной формы. Для создания окон произвольной формы использовались регионы. Создание кнопок произвольной формы. Для их создания аналогичным образом использовались регионы. Алгоритм использования региона для создания окна произвольной формы:
1) Создание бинарного файла типа RGN содержащего информацию о регионе с помощью специализированного ПО (пр.Photoshop CS2 );
Создание региона с помощью функции ExtCreateRegion из двоичного файла типа RGN;
Назначение полученного региона главному окну программы с помощью функции SetWindowRgn(RGN rng);
Теперь необходимо предусмотреть прорисовку заднего фона окна при наступлении события Paint. Для этого сделаны следующие шаги:
а) в процедуре инициализации окна необходимо получить контекст графического устройства с помощью процедуры GetDC();
б) создать совместимый с ним контекст в памяти (для хранения фонового рисунка) с помощью функции CreateCompatibleDC;
в) поместить в этот контекст фоновый рисунок с помощью функции SelectObject;
г) в процедуре Paint отображаем фоновый рисунок с использованием контекста, полученного в п. 2), с использованием функции BitBlt();
Для прорисовки кнопок округлой формы использован несколько другой подход. Алгоритм создания:
В процедуре инициализации главного окна необходимо для каждой кнопки создать контекст графического устройства, совместимый с контекстом главного окна, и назначить каждому рисунок, который будет выступать в качестве фонового рисунка соответствующей кнопки;
В дизайнере форм среды VisualStudio.NET установить свойство «OwnerDraw» кнопок в true (это сделано для того, чтобы мы сами отвечали за отображение поверхности кнопки при наступлении системного события WM_DRAWITEM);
Событие WM_DRAWITEM обрабатывается с помощью функции-члена OnDrawItem класса главного окна, при этом программист имеет доступ к структуре типа LPDRAWITEMSTRUCT, содержащей информацию о состоянии кнопки, ее позиции в окне, контекст устройства, связанный с кнопкой, ее размеры и другие параметры;
В переопределенной функции OnDrawItem используется переменная skin типа CBitmap для хранения вида кнопки, в эту переменную мы загружаем картинку из ресурсов приложения с помощью функции LoadBitmap;
Теперь отображаем фоновый рисунок с помощью соответсвующего контекста, полученного на первом шаге, с помощью функции BitBlt;
Теперь для текущего контекста кнопки, полученного из структуры LPDRAWITEMSTRUCT, назначаем кисть для рисования из переменной skin с помощью функции CreatePatternBrush;
Далее для создания круглой формы (региона) кнопки используется функция CreateEllipticRgnIndirect, которая использует данные о размере прямоугольника кнопки;
Теперь полученный регион назначаем кнопке с помощью функции SetWindowRgn;
3 РУКОВОДСТВО ПРОГРАММИСТА
3.1 Назначение и условия применения программы
Программа предназначена для воспроизведения видео файлов в формате .avi. Для того, чтобы осуществить воспроизведение нужно:
Установить на исполняемом компьютере драйвера того аппаратного устройства, которое будет использовано в качестве графического ускорителя, а также звуковой карты;
Наличие операционной системы Windows XP/ NT/ 2000;
Установить набор необходимых для воспроизведения файла кодеков (Обычно бывает достаточно набора кодеков DivX желательно более поздних версий 5.0 или 6.0); информационная мультимедиа система интерфейс
20 Мб оперативной памяти.
Наличие в системе DirectX 8.0. или более поздней версии.
После запуска проигрывателя, он переходит в режим ожидания действий пользователя. Одни из возможных действий пользователя в данной ситуации:
Кнопка «Воспроизведение» приводит к выводу видео файла на экран;
Кнопка «Стоп» прекращает вывод изображения видео файла на экран;
Кнопка «Полноэкранный режим» служит для перехода проигрывателя в полноэкранный режим.
Запуск программы осуществляется двойным щелчком на исполняемом файле программ.
Управление воспроизведением можно осуществить нажатиями следующих клавиш:
R- воспроизведение/остановка
P - Пауза
M - заглушка/включение звука
F - Переключение между оконным и полноэкранным режимами.
Реестр файлов представлен на прилагаемом компакт диске в директории последней версии пояснительной записке в файле реестр файлов.doc.
3.2 Входные и выходные данные
Входными данными программы являются файлы в формате .avi , сжатые с помощью любого установленного в системе кодека, и параметры, введенные пользователем. Такими параметрами можно назвать логическую переменную, отвечающую за состояние проигрывателя в полноэкранном режиме, положение окна проигрывателя в оконном режиме.
Выходным данным является динамическое изображение, составленное из декодированных кадров .avi файла.
ЗАКЛЮЧЕНИЕ
В данном курсовом проекте были исследованы и реализованы возможности DirectShow по выводу декодированного из видео файла в формате .avi изображения и звука.
Разработан модуль PlayWnd, содержащий класс Player, и соответственно все необходимые процедуры для осуществления воспроизведения и контроля над воспроизведением:
PlayMovieInWindow() - Проигрывание видео
ToggleFullScreen() - Переключение полноэкранного режима
ToggleMute() - Переключение звука
PaintAudioWindow() - Прорисовка окна, если проигрываем только звук
OpenClip() - Открытие файла
PauseClip() - Пауза
StopClip() - Остановка
Использованы возможности Windows GDI по созданию привлекательного пользовательского интерфейса.
К достоинствам разработанного программного продукта можно отнести следующее:
Интерфейс приложения понятен любому пользователю.
Возможность настройки параметров работы проигрывателя:
Заглушать/ включать звук
Переходить в полноэкранный режим и выходить из него
Независимость от аппаратного обеспечения.
Среди недостатков приложения можно назвать:
Отсутствие возможности выбора воспроизводимых файлов.
Невозможность плавного масштабирования изображения.
Невозможность менять скорость воспроизведения.
Невозможность подключения специальных DirectShow фильтров (например, для изменения цветовой гаммы изображения).
СПИСОК ИСПОЛЬЗОВАННЫХ ИСТОЧНИКОВ
1. Э. Гамма, Р. Хелм, Р. Джонсон, Дж. Влиссидес
Приемы объектно-ориентированного проектирования. - М.:BHV, 2003. - 356 c.
2. Документация по DirectX SDK 2004. - Корпорация Microsoft®, 2004.
3. С. Г. Горнаков
DirectX 9.0 Уроки программирования на С++ - БХВ - Петербург, 2004. - 273 с.
4. http://go.divx.com/divx/divxpro/overview/en - источник документации по набору кодеков DivX
ПРИЛОЖЕНИЕ 1
Листинг модуля воспроизведения playwnd.h на языке С++
namespace Player
{
//
// Function prototypes
//
//Инициализация окна плеера
HRESULT InitPlayerWindow(void);
//Инициализация окна воспроизведения
HRESULT InitVideoWindow(int nMultiplier, int nDivider);
//Переключение между полноэкранным и оконным режимами
HRESULT ToggleFullScreen(void);
//Обработка графических событий
HRESULT HandleGraphEvent(void);
//Переключение между тишиной и нормальным по громкости воспроизведением
HRESULT ToggleMute(void);
//Закраска окна в режиме “только звук”
void PaintAudioWindow(void);
//Проверка на наличие видео данных в файле
void CheckVisibility(void);
//Освобождение интерфейсами аппаратных ресурсов
void CloseInterfaces(void);
//Открытие файла
void OpenClip(int);
//Пауза
void PauseClip(void);
//Остановка
void StopClip(void);
//Закрытие клипа
void CloseClip(void);
void Msg(TCHAR *szFormat, ...);
//
// Constants
//
#define VOLUME_FULL 0L
#define VOLUME_SILENCE -10000L
// Begin default media search at root directory
#define DEFAULT_MEDIA_PATH TEXT("\\\0")
// Defaults used with audio-only files
#define DEFAULT_AUDIO_WIDTH 240
#define DEFAULT_AUDIO_HEIGHT 120
#define DEFAULT_VIDEO_WIDTH 320
#define DEFAULT_VIDEO_HEIGHT 240
#define MINIMUM_VIDEO_WIDTH 200
#define MINIMUM_VIDEO_HEIGHT 120
#define WM_GRAPHNOTIFY WM_USER+13
enum PLAYSTATE {Stopped, Paused, Running, Init};
//
// Macros
//
#define SAFE_RELEASE(x) { if (x) x->Release(); x = NULL; }
#define JIF(x) if (FAILED(hr=(x))) \
{Msg(TEXT("FAILED(hr=0x%x) in ") TEXT(#x) TEXT("\n\0"), hr); return hr;}
#define LIF(x) if (FAILED(hr=(x))) \
{Msg(TEXT("FAILED(hr=0x%x) in ") TEXT(#x) TEXT("\n\0"), hr);}
extern PLAYSTATE g_psCurrent;
extern HWND ghApp;
extern HINSTANCE ghInst;
extern BOOL g_bFullscreen;
}
ПРИЛОЖЕНИЕ 2
Листинг модуля воспроизведения playwnd.cpp на языке С++
#include <dshow.h>
#include <commctrl.h>
#include <commdlg.h>
#include <stdio.h>
#include <tchar.h>
#include <atlcore.h>
#include <objbase.h>
#include "playwnd.h"
namespace Player
{
//
// Global data
//
HWND ghApp=0;
HINSTANCE ghInst=0;
TCHAR g_szFileName[MAX_PATH]={0};
BOOL g_bAudioOnly=FALSE, g_bFullscreen=FALSE;
LONG g_lVolume=VOLUME_FULL;
DWORD g_dwGraphRegister=0;
PLAYSTATE g_psCurrent=Stopped;
double g_PlaybackRate=1.0;
// DirectShow interfaces
IGraphBuilder *pGB = NULL;
IMediaControl *pMC = NULL;
IMediaEventEx *pME = NULL;
IVideoWindow *pVW = NULL;
IBasicAudio *pBA = NULL;
IBasicVideo *pBV = NULL;
IMediaSeeking *pMS = NULL;
IMediaPosition *pMP = NULL;
const int AUDIO=1, VIDEO=2; // Used for enabling playback menu items
//Я
HRESULT PlayMovieInWindow(LPTSTR szFile)
{
USES_CONVERSION;
WCHAR wFile[MAX_PATH];
HRESULT hr;
if (!szFile)
return E_POINTER;
// Clear open dialog remnants before calling RenderFile()
UpdateWindow(ghApp);
// Convert filename to wide character string
wcsncpy(wFile, T2W(szFile), NUMELMS(wFile)-1);
wFile[MAX_PATH-1] = 0;
// Get the interface for DirectShow's GraphBuilder
JIF(CoCreateInstance(CLSID_FilterGraph, NULL, CLSCTX_INPROC_SERVER,
IID_IGraphBuilder, (void **)&pGB));
if(SUCCEEDED(hr))
{
// Have the graph builder construct its the appropriate graph automatically
JIF(pGB->RenderFile(wFile, NULL));
// QueryInterface for DirectShow interfaces
JIF(pGB->QueryInterface(IID_IMediaControl, (void **)&pMC));
JIF(pGB->QueryInterface(IID_IMediaEventEx, (void **)&pME));
JIF(pGB->QueryInterface(IID_IMediaSeeking, (void **)&pMS));
JIF(pGB->QueryInterface(IID_IMediaPosition, (void **)&pMP));
//// Query for video interfaces, which may not be relevant for audio files
JIF(pGB->QueryInterface(IID_IVideoWindow, (void **)&pVW));
JIF(pGB->QueryInterface(IID_IBasicVideo, (void **)&pBV));
//// Query for audio interfaces, which may not be relevant for video-only files
JIF(pGB->QueryInterface(IID_IBasicAudio, (void **)&pBA));
//// Is this an audio-only file (no video component)?
CheckVisibility();
//// Have the graph signal event via window callbacks for performance
JIF(pME->SetNotifyWindow((OAHWND)ghApp, WM_GRAPHNOTIFY, 0));
if (!g_bAudioOnly)
{
// Setup the video window
JIF(pVW->put_Owner((OAHWND)ghApp));
JIF(pVW->put_WindowStyle(WS_CHILD | WS_CLIPSIBLINGS | WS_CLIPCHILDREN));
JIF(InitVideoWindow(1, 1));
}
else
{
// Initialize the default player size and enable playback menu items
JIF(InitPlayerWindow());
}
// Complete window initialization
ShowWindow(ghApp, SW_SHOWNORMAL);
UpdateWindow(ghApp);
SetForegroundWindow(ghApp);
g_bFullscreen = FALSE;
g_PlaybackRate = 1.0;
//#ifdef REGISTER_FILTERGRAPH
// hr = AddGraphToRot(pGB, &g_dwGraphRegister);
// if (FAILED(hr))
// {
// Msg(TEXT("Failed to register filter graph with ROT! hr=0x%x"), hr);
// g_dwGraphRegister = 0;
// }
//#endif
// Run the graph to play the media file
JIF(pMC->Run());
g_psCurrent=Running;
SetFocus(ghApp);
}
return hr;
}
//Я
HRESULT InitVideoWindow(int nMultiplier, int nDivider)
{
//LONG lHeight, lWidth;
HRESULT hr = S_OK;
RECT rect;
if (!pBV)
return S_OK;
// Read the default video size
//hr = pBV->GetVideoSize(&lWidth, &lHeight);
if (hr == E_NOINTERFACE)
return S_OK;
// Account for requests of normal, half, or double size
/*lWidth = lWidth * nMultiplier / nDivider;
lHeight = lHeight * nMultiplier / nDivider;
int nTitleHeight = GetSystemMetrics(SM_CYCAPTION);
int nBorderWidth = GetSystemMetrics(SM_CXBORDER);
int nBorderHeight = GetSystemMetrics(SM_CYBORDER);*/
GetClientRect(ghApp, &rect);
// Account for size of title bar and borders for exact match
// of window client area to default video size
SetWindowPos(ghApp, NULL, 0, 0, rect.right,rect.bottom,
SWP_NOMOVE | SWP_NOOWNERZORDER);
GetClientRect(ghApp, &rect);
JIF(pVW->SetWindowPosition(rect.left, rect.top, rect.right,rect.bottom));
return hr;
}
//Я
HRESULT InitPlayerWindow(void)
{
// Reset to a default size for audio and after closing a clip
/*SetWindowPos(ghApp, NULL, 0, 0,
DEFAULT_AUDIO_WIDTH,
DEFAULT_AUDIO_HEIGHT,
SWP_NOMOVE | SWP_NOOWNERZORDER);*/
// Check the 'full size' menu item
// CheckSizeMenu(ID_FILE_SIZE_NORMAL);
// EnablePlaybackMenu(FALSE, 0);
return S_OK;
}
void CheckVisibility(void)
{
long lVisible;
HRESULT hr;
if ((!pVW) || (!pBV))
{
// Audio-only files have no video interfaces. This might also
// be a file whose video component uses an unknown video codec.
g_bAudioOnly = TRUE;
return;
}
else
{
// Clear the global flag
g_bAudioOnly = FALSE;
}
hr = pVW->get_Visible(&lVisible);
if (FAILED(hr))
{
// If this is an audio-only clip, get_Visible() won't work.
//
// Also, if this video is encoded with an unsupported codec,
// we won't see any video, although the audio will work if it is
// of a supported format.
//
if (hr == E_NOINTERFACE)
{
g_bAudioOnly = TRUE;
}
else
{
Msg(TEXT("Failed(%08lx) in pVW->get_Visible()!\r\n"), hr);
}
}
}
void PauseClip(void)
{
if (!pMC)
return;
// Toggle play/pause behavior
if((g_psCurrent == Paused) || (g_psCurrent == Stopped))
{
if (SUCCEEDED(pMC->Run()))
g_psCurrent = Running;
}
else
{
if (SUCCEEDED(pMC->Pause()))
g_psCurrent = Paused;
}
}
void StopClip(void)
{
HRESULT hr;
if ((!pMC) || (!pMS))
return;
// Stop and reset postion to beginning
if((g_psCurrent == Paused) || (g_psCurrent == Running))
{
LONGLONG pos = 0;
hr = pMC->Stop();
g_psCurrent = Stopped;
// Seek to the beginning
hr = pMS->SetPositions(&pos, AM_SEEKING_AbsolutePositioning ,
NULL, AM_SEEKING_NoPositioning);
// Display the first frame to indicate the reset condition
hr = pMC->Pause();
}
}
//Я
void OpenClip(int clip)
{
HRESULT hr;
// Reset status variables
g_psCurrent = Stopped;
g_lVolume = VOLUME_FULL;
GetCurrentDirectory(MAX_PATH,g_szFileName);
LPSTR file;
switch(clip)
{
case 1:file=_tcscat(g_szFileName,_T("\\clip1.avi"));break;
case 2:file=_tcscat(g_szFileName,_T("\\clip2.avi"));break;
case 3:file=_tcscat(g_szFileName,_T("\\clip3.avi"));break;
case 4:file=_tcscat(g_szFileName,_T("\\clip4.avi"));break;
}
// Start playing the media file
hr = PlayMovieInWindow(file);
// If we couldn't play the clip, clean up
if (FAILED(hr))
CloseClip();
}
void CloseClip()
{
HRESULT hr;
// Stop media playback
if(pMC)
hr = pMC->Stop();
// Clear global flags
g_psCurrent = Stopped;
g_bAudioOnly = TRUE;
g_bFullscreen = FALSE;
// Free DirectShow interfaces
CloseInterfaces();
// Clear file name to allow selection of new file with open dialog
g_szFileName[0] = L'\0';
// No current media state
g_psCurrent = Init;
// Reset the player window
RECT rect;
GetClientRect(ghApp, &rect);
InvalidateRect(ghApp, &rect, TRUE);
InitPlayerWindow();
}
void CloseInterfaces(void)
{
HRESULT hr;
// Relinquish ownership (IMPORTANT!) after hiding video window
if(pVW)
{
hr = pVW->put_Visible(OAFALSE);
hr = pVW->put_Owner(NULL);
}
// Disable event callbacks
if (pME)
hr = pME->SetNotifyWindow((OAHWND)NULL, 0, 0);
// Release and zero DirectShow interfaces
SAFE_RELEASE(pME);
SAFE_RELEASE(pMS);
SAFE_RELEASE(pMP);
SAFE_RELEASE(pMC);
SAFE_RELEASE(pBA);
SAFE_RELEASE(pBV);
SAFE_RELEASE(pVW);
SAFE_RELEASE(pGB);
}
//Я
void Msg(TCHAR *szFormat, ...)
{
TCHAR szBuffer[1024]; // Large buffer for long filenames or URLs
const size_t NUMCHARS = sizeof(szBuffer) / sizeof(szBuffer[0]);
const int LASTCHAR = NUMCHARS - 1;
// Format the input string
va_list pArgs;
va_start(pArgs, szFormat);
// Use a bounded buffer size to prevent buffer overruns. Limit count to
// character size minus one to allow for a NULL terminating character.
_vsntprintf(szBuffer, NUMCHARS - 1, szFormat, pArgs);
va_end(pArgs);
// Ensure that the formatted string is NULL-terminated
szBuffer[LASTCHAR] = TEXT('\0');
// Display a message box with the formatted string
MessageBox(NULL, szBuffer, TEXT("PlayWnd Sample"), MB_OK);
}
//Я
HRESULT ToggleMute(void)
{
HRESULT hr=S_OK;
if ((!pGB) || (!pBA))
return S_OK;
// Read current volume
hr = pBA->get_Volume(&g_lVolume);
if (hr == E_NOTIMPL)
{
// Fail quietly if this is a video-only media file
return S_OK;
}
else if (FAILED(hr))
{
Msg(TEXT("Failed to read audio volume! hr=0x%x\r\n"), hr);
return hr;
}
// Switch volume levels
if (g_lVolume == VOLUME_FULL)
g_lVolume = VOLUME_SILENCE;
else
g_lVolume = VOLUME_FULL;
// Set new volume
JIF(pBA->put_Volume(g_lVolume));
//UpdateMainTitle();
return hr;
}
HRESULT ToggleFullScreen(void)
{
HRESULT hr=S_OK;
LONG lMode;
static HWND hDrain=0;
// Don't bother with full-screen for audio-only files
if ((g_bAudioOnly) || (!pVW))
return S_OK;
// Read current state
JIF(pVW->get_FullScreenMode(&lMode));
if (lMode == OAFALSE)
{
// Save current message drain
LIF(pVW->get_MessageDrain((OAHWND *) &hDrain));
// Set message drain to application main window
LIF(pVW->put_MessageDrain((OAHWND) ghApp));
// Switch to full-screen mode
lMode = OATRUE;
JIF(pVW->put_FullScreenMode(lMode));
g_bFullscreen = TRUE;
}
else
{
// Switch back to windowed mode
lMode = OAFALSE;
JIF(pVW->put_FullScreenMode(lMode));
// Undo change of message drain
LIF(pVW->put_MessageDrain((OAHWND) hDrain));
// Reset video window
LIF(pVW->SetWindowForeground(-1));
// Reclaim keyboard focus for player application
UpdateWindow(ghApp);
SetForegroundWindow(ghApp);
SetFocus(ghApp);
g_bFullscreen = FALSE;
}
return hr;
}
//Я
HRESULT HandleGraphEvent(void)
{
LONG evCode, evParam1, evParam2;
HRESULT hr=S_OK;
// Make sure that we don't access the media event interface
// after it has already been released.
if (!pME)
return S_OK;
// Process all queued events
while(SUCCEEDED(pME->GetEvent(&evCode, (LONG_PTR *) &evParam1,
(LONG_PTR *) &evParam2, 0)))
{
// Free memory associated with callback, since we're not using it
hr = pME->FreeEventParams(evCode, evParam1, evParam2);
// If this is the end of the clip, reset to beginning
if(EC_COMPLETE == evCode)
{
LONGLONG pos=0;
// Reset to first frame of movie
hr = pMS->SetPositions(&pos, AM_SEEKING_AbsolutePositioning ,
NULL, AM_SEEKING_NoPositioning);
if (FAILED(hr))
{
// Some custom filters (like the Windows CE MIDI filter)
// may not implement seeking interfaces (IMediaSeeking)
// to allow seeking to the start. In that case, just stop
// and restart for the same effect. This should not be
// necessary in most cases.
if (FAILED(hr = pMC->Stop()))
{
Msg(TEXT("Failed(0x%08lx) to stop media clip!\r\n"), hr);
break;
}
if (FAILED(hr = pMC->Run()))
{
Msg(TEXT("Failed(0x%08lx) to reset media clip!\r\n"), hr);
break;
}
}
}
}
return hr;
}
}
Размещено на Allbest.ru
Подобные документы
Сравнительная характеристика программ-аналогов. Разработка мультимедиа-проигрывателя по систематизированной обработке музыкальных файлов. Создание удобного пользовательского интерфейса. Поддержка списка воспроизведения, базовые функции управления.
курсовая работа [1,1 M], добавлен 02.02.2014Разработка мультимедиа-программы для прослушивания аудио-файлов и просмотров видео. Описание меню для пользователей и для администраторов проекта. Создание форм для указанного приложения при помощи Visual Foxpro 9. Листинг программы и ее результаты.
курсовая работа [1,9 M], добавлен 27.07.2013Общая характеристика видео-аудио конференции, основные сферы ее использования, режимы и способы проведения. Характеристика средств групповой обработки информации. Системы передачи данных в сети Интернет. Проведение аудио-видео конференции и криптозащита.
дипломная работа [2,7 M], добавлен 17.07.2013Визуальный компонент, используемый для создания главного меню на форме, создание закладки и добавление в список воспроизведения музыкального файла. Определение повторения воспроизведения и отображение списков строк, проигрывание аудио и видео файлов.
лабораторная работа [128,7 K], добавлен 27.03.2012Порядок разработки информационной системы "Архив online-видео" для скачивания и добавления файлов, его структура и основные компоненты. Методика регистрации на сайте, просмотра, добавления и скачивания видео. Программирование администрирования сайта.
курсовая работа [1,9 M], добавлен 04.06.2009Сравнительный анализ функциональных возможностей десктопных видео редакторов. Функциональные возможности разрабатываемого Web-приложения. Процессы взаимодействия пользователя и системы. Выбор библиотек для обработки видео. Создание локального сервера.
дипломная работа [1,3 M], добавлен 30.11.2016Основная возможность Adobe Premiere – обработка одних видео и аудио файлов и последующий их экспорт в другие видео и аудио файлы. Стандартные эффекты в Adobe Premiere. Дополнения к программе (дополнительные спецэффекты), позволяющие работать с клипами.
реферат [1,9 M], добавлен 26.05.2009Форматы и характеристики цифрового видео: частота кадра, экранное разрешение, глубина цвета, качество изображения. Типовый технологический процесс производства видеокомпонентов для мультимедиа продуктов с использованием программы miroVIDEO Capture.
лекция [2,7 M], добавлен 30.04.2009Система управления базой данных - программный инструмент создания БД и приложений пользователя. Проект СУБД "ИС Продажа видео и аудио продукции". Разработка иерархической, сетевой и реляционной моделей, таблиц и схемы базы данных, форм, отчетов, запросов.
курсовая работа [1,6 M], добавлен 17.06.2013Характерные особенности мультимедиа-технологий. Особенности разработки мультимедиа-проигрывателя. Анализ удобного пользовательского интерфейса, эквалайзера регулятора громкости. Разработка строки описания треков, программы меню, информации "О программе".
курсовая работа [1,6 M], добавлен 12.12.2011