Разработка тренажёров и обучающих программ

Автор: Пользователь скрыл имя, 20 Ноября 2014 в 22:02, курсовая работа

Краткое описание

Цель разработки: создание информационной мультимедиа системы (медиа-плеера) для презентации аудио-видео информации о факультете КТАС, представленной в специально отснятых и смонтированных .avi файлах.
Результатом разработки является программная реализация специализированного видео проигрывателя и оформление его в виде прикладного приложения в среде Visual C++ 2003 .NET, а также построение специализированного модуля для воспроизведения и управления воспроизведением .avi файлов.

Оглавление

Введение.............................................................................................2

1. Эскизный проект.............................................................................3
1.1 Концептуальная модель системы………………………………….3
1.2 Методика реализации визуализации ИМС …............................4
1.3 Методика реализации пользовательского интерфейса .............4

2. Технологический проект.................................................................5
2.1 Технология разработки модулей программы ……….................5
2.2 Разработка модулей ………………………………........................5
2.2.1. Разработка модуля воспроизведения …………….............5
2.2.2. Разработка модуля пользовательского интерфейса..........9

3. Руководство программиста.............................................................11
3.1 Назначение и условия применения программы..........................11
3.2 Входные и выходные данные.....................................................11

Заключение.........................................................................................12

Файлы: 1 файл

Пояснтельная записка.doc

— 202.50 Кб (Скачать)

 

Для продолжения воспроизведения нужно вызвать функцию 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 );

  1. Создание региона с помощью функции ExtCreateRegion из двоичного файла типа RGN;
  2. Назначение полученного региона главному окну программы с помощью функции SetWindowRgn(RGN rng);
  3. Теперь необходимо предусмотреть прорисовку заднего фона окна при наступлении события Paint. Для этого сделаны следующие шаги:

а) в процедуре инициализации окна необходимо получить контекст графического устройства с помощью процедуры GetDC();

б) создать совместимый с ним контекст в памяти (для хранения фонового рисунка) с помощью функции CreateCompatibleDC;

в) поместить в этот контекст фоновый рисунок с помощью функции SelectObject;

г) в процедуре Paint отображаем фоновый рисунок с использованием контекста, полученного в п. 2), с использованием функции BitBlt();

Для прорисовки кнопок округлой  формы использован несколько другой подход. Алгоритм создания:

  1. В процедуре инициализации главного окна необходимо для каждой кнопки создать контекст графического устройства, совместимый с контекстом главного окна, и назначить каждому рисунок, который будет выступать в качестве фонового рисунка соответствующей кнопки;
  2. В дизайнере форм среды VisualStudio.NET установить свойство «OwnerDraw» кнопок в true (это сделано для того, чтобы мы сами отвечали за отображение поверхности кнопки при наступлении системного события WM_DRAWITEM);
  3. Событие WM_DRAWITEM обрабатывается с помощью функции-члена OnDrawItem класса главного окна, при этом программист имеет доступ к структуре типа LPDRAWITEMSTRUCT, содержащей информацию о состоянии кнопки, ее позиции в окне, контекст устройства, связанный с кнопкой, ее размеры и другие параметры;
  4. В переопределенной функции OnDrawItem используется переменная skin типа CBitmap для хранения вида кнопки, в эту переменную мы загружаем картинку из ресурсов приложения с помощью функции LoadBitmap;
  5. Теперь отображаем фоновый рисунок с помощью соответсвующего контекста, полученного на первом шаге, с помощью функции BitBlt;
  6. Теперь для текущего контекста кнопки, полученного из структуры LPDRAWITEMSTRUCT, назначаем кисть для рисования из переменной skin с помощью функции CreatePatternBrush;
  7. Далее для создания круглой формы (региона) кнопки используется функция CreateEllipticRgnIndirect, которая использует данные о размере прямоугольника кнопки;

Теперь полученный регион назначаем кнопке с помощью функции SetWindowRgn;

        

       

 

3 РУКОВОДСТВО ПРОГРАММИСТА

 

3.1 Назначение и условия применения программы

Программа предназначена для воспроизведения видео файлов  в формате .avi. Для того, чтобы осуществить воспроизведение нужно:

  1. Установить на исполняемом компьютере драйвера того аппаратного устройства, которое будет использовано в качестве графического ускорителя, а также звуковой карты;
  2. Наличие операционной системы  Windows XP/ NT/ 2000;
  3. Установить набор необходимых для воспроизведения файла кодеков (Обычно бывает достаточно набора кодеков DivX желательно более поздних версий 5.0 или 6.0);
  4. 20 Мб оперативной памяти.
  5. Наличие в системе DirectX 8.0. или более поздней версии.

После запуска проигрывателя, он переходит в режим ожидания действий пользователя. Одни из возможных действий пользователя в данной ситуации:

  1. Кнопка «Воспроизведение» приводит к выводу видео файла на экран;
  2. Кнопка «Стоп» прекращает вывод изображения видео файла на экран;
  3. Кнопка «Полноэкранный режим» служит для перехода проигрывателя в полноэкранный режим.

Запуск программы осуществляется двойным щелчком на исполняемом файле программ.

Управление воспроизведением можно осуществить нажатиями следующих клавиш:

R- воспроизведение/остановка

P - Пауза

M – заглушка/включение звука

F – Переключение между оконным и полноэкранным режимами.

Реестр файлов представлен на прилагаемом компакт диске в директории последней версии пояснительной записке в файле реестр файлов.doc.

 

3.2 Входные и выходные данные

Входными данными программы являются файлы в формате .avi , сжатые с помощью любого установленного в системе кодека, и параметры, введенные пользователем. Такими параметрами можно назвать логическую переменную, отвечающую за состояние проигрывателя в полноэкранном режиме, положение окна проигрывателя в оконном режиме.

Выходным данным является динамическое изображение, составленное из декодированных кадров .avi файла.

 

Заключение

 

В данном курсовом проекте были исследованы и реализованы возможности DirectShow по выводу декодированного из видео файла в формате .avi изображения и звука.

Разработан модуль PlayWnd, содержащий класс Player, и соответственно все необходимые процедуры для осуществления воспроизведения и контроля над воспроизведением:

PlayMovieInWindow() – Проигрывание видео

ToggleFullScreen()      – Переключение полноэкранного режима

ToggleMute()               – Переключение звука

PaintAudioWindow() – Прорисовка окна, если проигрываем только звук

OpenClip()                   – Открытие файла

PauseClip()                   – Пауза

StopClip()                     – Остановка

Использованы возможности Windows GDI по созданию привлекательного пользовательского интерфейса.

К достоинствам разработанного программного продукта можно отнести следующее:

  1. Интерфейс приложения понятен любому пользователю.
  2. Возможность настройки параметров работы проигрывателя:
  • Заглушать/ включать звук
  • Переходить в полноэкранный режим и выходить из него
  1. Независимость от аппаратного обеспечения.

Среди недостатков приложения можно назвать:

    1. Отсутствие возможности выбора воспроизводимых файлов.
    2. Невозможность плавного масштабирования изображения.
    3. Невозможность менять скорость воспроизведения.
    4. Невозможность подключения специальных 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));

Информация о работе Разработка тренажёров и обучающих программ