[ главная ]   [ рейтинг статей ]   [ справочник радиолюбителя ]   [ новости мира ИТ ]



Ответов: 0
25-02-12 07:01







   Web - программирование
PHP


ASP






XML



CSS

SSI





   Программирование под ОС











   Web - технологии








   Базы Данных









   Графика






Данные




Программирование под ОС / C - C++ /

Пишем аудио видео проигрыватель

Доброе время суток, как вы наверно поняли по названию статьи, мы будем писать проигрыватель, по-сути эта статья является логическим продолжением статьи “Пишем CD проигрыватель”, правда, учитывая тот факт, что сегодня мы займемся написанием аудио и видео проигрывателя обычных файлов мультимедиа, с поддержкой плэй листа. Так же мы включим возможность сохранения и загрузки плэй листов, подключим различные таймеры и поработаем над интерфейсом. Итак, начнем пожалуй, самого простого, раскидаем нужные компоненты, чтобы примерно представлять структуру программы.

В первую очередь нам понадобиться компонент MediaPlayer (куда же без него =)) от этого компонента нам понадобиться только его возможности, визуально он нам не нужен так, что сразу присвойте значение Visible равное false, компонент ListBox (будет играть роль плэй листа), и десять штук кнопок (первые пять кнопок – это главные кнопки управления: воспроизвести, пауза, вперед, назад, стоп; другие пять кнопок расположите под предполагаемым плэйлистом, эти кнопки станут управлять плэйлистом: добавить, удалить, удалить все, сохранить лист, загрузить лист.), хотя если вы хотите использовать другие компоненты (image или sppedbutton, есть еще один хороший вариант – работа с Popup menu) - используйте. Примерно, набросок:

В первую очередь давайте проработаем систему добавления новых песен в плэй лист, для этого киньте на форуме компонент OpenDialog. В свойствах объекта OpenDialog установите в Filter только необходимые расширения файлов. Пишем событие для добавления новых песен:

if (OpenDialog1->Execute()) //Если диалог открыт, добавляем имя файла.
{
ListBox1->Items->Add(OpenDialog1->FileName); // Добавляем трэк
}

Теперь давайте напишем функцию воспроизведения трэков (я назвал ее my_play):

void my_play ()
{

if (Form1->ListBox1->ItemIndex == -1)
//Если файл не выбран в ListBox
{
ShowMessage("Укажите файл!"); //Предупреждаем
} else { // Если выбран

Form1->MediaPlayer1->FileName=Form1->ListBox1->Items->operator [](Form1->ListBox1->ItemIndex); //Присваиваем имя выбранного трека
Form1->Timer1->Enabled=true; //Включаем таймер, о нем читайте ниже.

Form1->Caption=(ExtractFileName(Form1->MediaPlayer1->FileName) ); // выводим имя трека

try { //Воспроизводим трек
Form1->MediaPlayer1->Open();
Form1->MediaPlayer1->Play();
}
catch(...) // Если трек не может воспр.
{
ShowMessage("Ошибка воспр. файла!");
}
}
}


Мы позже вернемся к этой функции, теперь создайте событие для кнопки плэй (воспр.) и объявите внутри события нашу функцию.

Давайте, теперь создадим события для остальных кнопок, они будут архи-простыми, для кнопки пауза

MediaPlayer1->Pause();
Timer1->Enabled=false;

Стоп -

MediaPlayer1->Stop();
Timer1->Enabled=false;

Теперь кнопка вперед:

if (ListBox1->ItemIndex >= ListBox1->Count-1) // Если выбран последний в списке файл
{
ListBox1->ItemIndex=0; //Выбираем первый
my_play();// и его воспроизводим
}
Else // если выбран НЕ последний
{
ListBox1->ItemIndex=ListBox1->ItemIndex+1; // Переход к следующему
my_play(); // И воспроизводим
}

Кнопка назад:

if (ListBox1->ItemIndex == -1) //Если файл вообще не выбран
{
ListBox1->ItemIndex=0; //Выбераем первый
my_play(); // и воспроизводим
} else {

if (ListBox1->ItemIndex==0) // Если выбран первый файл
{
ListBox1->ItemIndex=ListBox1->Count -1; // Указываем последний
my_play(); // И воспроизводим
}
Else
{
ListBox1->ItemIndex=ListBox1->ItemIndex -1; // Просто переключаемся на трек назад
my_play(); // И воспроизводим
}
}


Отлично, теперь мы разберемся с таймером (Timer), который даст нам возможность по оканчании трека переключаться на следующий. Не забудьте присвоить таймеру Enabled равное false, интервал оставьте по умолчанию:

if (Form1->MediaPlayer1->Position >= Form1->MediaPlayer1->Length) // А трек-то закончился:
{
if (ListBox1->ItemIndex >= ListBox1->Count-1) // Если файл был последним, переходим к первому:
{
ListBox1->ItemIndex=0;
my_play();
}
else{
ListBox1->ItemIndex=ListBox1->ItemIndex+1; // Переходим к следующему
my_play();
}
}


Это только первое действие, которое выполняет данный таймер. Он нам пригодиться для ввода времени трека и общей длины, начнем мы с последнего, т.е сейчас научимся выводить общее время трека, киньте на форму Label и продолжим работать с нашим Timer (можно кинуть на форму новый компонент Timer, но во избежание головной боли, лучше работать с уже использованным). Для начала нам необходимо перевести время в секунды и минуты, разместите следующий код под includ’ами (в самом начале исходного кода):

#define MINUTE(ms) ((ms/1000)/60)
#define SECOND(ms) ((ms/1000)%60)

И сам код для показа общего времяни:

int Track; //Объявляем переменные и даем им значения:
int ms;
AnsiString st;
Track = MCI_TMSF_TRACK(Form1->MediaPlayer1->Position);
ms = Form1->MediaPlayer1->TrackLength[Track];
st = st + " "+ IntToStr(MINUTE(ms));
st = st + ":" + IntToStr(SECOND(ms));

Form1->Label1->Caption = st; //Укажите вместо Label1 – ваш компонент, куда выводить общее время трека.

Теперь сделаем вывод сколько прошло времяни, с запуска трека. Для этого нам придеться объявить две глобальные переменные :

int time_min;
int time_sec;


Алгоритм вывода будет наипростейшим – каждую секунду (нам в этом поможет Timer) переменная time_sec будет увеличиваться на один, и когда число станет равно 60, переменная time_min увеличиться на один, а time_sec преровняется к нулю и опять станет увеличиваться на один в секунду. Все гениальное просто. Правда на форме необходимо кинуть еще два компонента для отображения времяни (я использую Label) Давайте воплатим это в коде, не выходя из события OnTimer нашего Timer:

++ time_sec; // Плюс одна секунда )
Label5->Caption=time_sec; //Это мой label куда выводяться секунды

if (Label5->Caption == 60) // Если секунд уже 60
{
time_sec=0; // Делаем их равными нолю
++time_min; // но прибавляем минуту
Label3->Caption=time_min; //Это мой label куда выводяться минуты
}


Но перед нами новая проблема – при переходе на новую песню, выводимое нашми время не обнуляется, а продолжает возврастать с переодичностью в одну секунду. Надо бороться с этим! Возвращаемся к функции воспроизведения файлов (у меня это my_play), найдите строку, где мы активируем таймер и перед ней впишем:

time_sec=0;
time_min=0;


Да, мы просто обнулили значения переменных. Дальше передем к работе с плэйлистом.

Итак, первое это кнопка удалить:

ListBox1->Items->Delete(ListBox1->ItemIndex);

Кнопка удалить все:

ListBox1->Clear();

Ну, вот мы и подходим к самому интересному, а именно сохранение и загрузка плэй листов. Поскольку в качестве плэй листа у нас выступает ListBox, мы сможем хранить все песни в обычном текстовом файле, т.е сохраненный лист может имметь формат .txt, или другой – здесь я оставляю выбор за вами.

Для сохранения листа нам на форму надо кинуть еще компонент SaveDialog, и пишем событие для кнопки сохранить лист:

if (SaveDialog1->Execute()) //Если вызван диалог
{
ListBox1->Items->SaveToFile(SaveDialog1->FileName); // Сохраняем
}


Загружаем плэй лист:

if (OpenDialog1->Execute()) //Если вызван диалог
{
ListBox1->Clear();// Очищаем плэй лист и
ListBox1->Items->LoadFromFile(OpenDialog1->FileName); // и подгружаем новые песни
}

По-поводу интерфеса, хочу дать несколько советов. Во-первых плэер должен быть комактным и стандартным. Не надо прибегать к специфическим методам открытия файлов, простота – вот универсальная штука! Постарайтесь использвать подсказки для кнопок (Hint) это намного облегчит работу с проигрывателем. Вот что у меня получилось:


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




Комментарии

 Ваш комментарий к данному материалу будет интересен нам и нашим читателям!



Последние статьи: Программирование под ОС / C - C++ /

Пишем CD проигрыватель 2
28-05-2010   

Сейчас я покажу как можно написать простой проигрыватель CD дисков. Для начала разместим все нужные компоненты на форме (см. рисунок)... подробнее

Кол. просмотров: общее - 4164 сегодня - 0

Пишем браузер
28-05-2010   

Продолжаю тему клонирования программ darkamstera на Delphi в С++Builder. В этой статье я покажу, как с помощью стандартных компонентов, можно создать свой браузер. Браузер будет на движке всеми-любимого InternetExplorer. Наш зверь сможет ходить по URL... подробнее

Кол. просмотров: общее - 2935 сегодня - 0

Информация о системе
28-05-2010   

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

Кол. просмотров: общее - 2954 сегодня - 1

FTP клиент своими руками
28-05-2010   

Здраствуй, сечас я покажу, как в CBuilder можно создать свой простой FTP-клиент, похожий пример можно найти в документации C++Builder Developnets Guilde... подробнее

Кол. просмотров: общее - 3415 сегодня - 1

Работаем с POP-сервером
28-05-2010   

Здраствуй, в этой статье я расскажу про способы получения e-mail писем и их прочтения. Для начала давайте составим интерфейс будущей программы Вот, что у меня вышло... подробнее

Кол. просмотров: общее - 3005 сегодня - 1



  WWW.COMPROG.RU - 2009-2012 | Designed and Powered by Zaipov Renat | Projects