Воспоминание мультимедия 18.02.2025
Всем привет! Хочу вспомнить про мультимедию. Будет от низкого уровня, до высокого уровня.
Будем сначало вспоминать на Си. на Embarcadero Dev-C++:
main.c:
#include <stdio.h> #include <windows.h> int main(int argc, char *argv[]) { /* Проигрывает аудиофайл с именем файла a_ja_pam_pam.wav синхронно, т.е. будет программа "висеть" пока не проиграет аудиофайл a_ja_pam_pam.wav */ sndPlaySound("a_ja_pam_pam.wav", SND_FILENAME | SND_SYNC); return 0; }
Но компилятор ошибку даст. Нужно добавить библиотеку libwinmm.a в проект, т.е. так: ../../Program Files (x86)/Embarcadero/Dev-Cpp/TDM-GCC-64/x86_64-w64-mingw32/lib/libwinmm.a
Теперь компилируем, и слышно как программа проигрывает аудиофайл a_ja_pam_pam.wav. После того как аудиофайл проиграет, наша программа завершается.
Если нужно чтобы проигралось ассинхронно, надо сделать вот так, вместо SND_SYNC заменим на SND_ASYNC:
main.c:
#include <stdio.h> #include <windows.h> int main(int argc, char *argv[]) { /* Проигрывает аудиофайл с именем файла a_ja_pam_pam.wav ассинхронно, т.е. будет программа "висеть" пока не проиграет аудиофайл a_ja_pam_pam.wav */ sndPlaySound("a_ja_pam_pam.wav", SND_FILENAME | SND_ASYNC); /* Специально нужна пауза, а то если выйдет из программы, звук перестанет проигрывать */ system("pause"); return 0; }
Теперь запустив, слышим как проигрывается аудиофайл a_ja_pam_pam.wav, если нажать любую клавишу, то программа выйдет, и звук перестанет проигрываться.
Продолжим вспоминать мультимедия.
Короче если нужно из ресурсов проиграть звуковой файл то нужно указать флаг SND_RESOURCE, вот пример:
#include <stdio.h> #include <windows.h> #include "resource.h" int main(int argc, char *argv[]) { /* Загружаем файл из ресурса IDR_WAVE1 */ PlaySound(MAKEINTRESOURCE(IDR_WAVE1),GetModuleHandle(NULL), SND_RESOURCE | SND_ASYNC); /* Специально нужна пауза, а то если выйдет из программы, звук перестанет проигрывать */ system("pause"); return 0; }
В низкий уровень программирования я ещё вернусь. А теперь речь пойдёт о высоком уровне. Для этого буду использовать функцию mciSendString. Эта функция т.е. mciSendString может не только звуковые файлы проигрывать но и аудио CD, видео, и даже DVD видео.
1. Создадим в Embarcadero Dev-C++ новый проект Windows Application и язык выберем C (т.е. Си).
2. Добавим в проект библиотеку ../../Program Files (x86)/Embarcadero/Dev-Cpp/TDM-GCC-64/x86_64-w64-mingw32/lib/libwinmm.a.
3. Вот код main.c:
#define VIDEO_ID "my_video" #include <windows.h> HWND hwndButton; HWND hwndStatic; char buf[1000]; LRESULT CALLBACK WndProc(HWND hwnd, UINT Message, WPARAM wParam, LPARAM lParam) { switch(Message) { case WM_COMMAND: sprintf(buf, "play %s", VIDEO_ID); mciSendString(buf, NULL, 0, 0); break; case WM_CREATE: hwndButton = CreateWindow("BUTTON", "Play", WS_CHILD | WS_VISIBLE, 10, 10, 100, 20, hwnd, (HMENU)NULL, NULL, lParam); hwndStatic = CreateWindow("STATIC", "", WS_CHILD | WS_VISIBLE, 10, 40, 800, 600, hwnd, (HMENU)NULL, NULL, lParam); sprintf(buf, "open \"movie.avi\" type MPEGVideo alias %s parent %ld style child", VIDEO_ID, (long)hwndStatic); mciSendString(buf, NULL, 0, 0); sprintf(buf, "put %s window at 10 10 320 240 225", VIDEO_ID); mciSendString(buf, NULL, 0, 0); break; case WM_DESTROY: { PostQuitMessage(0); break; } default: return DefWindowProc(hwnd, Message, wParam, lParam); } return 0; } int WINAPI WinMain(HINSTANCE hInstance, HINSTANCE hPrevInstance, LPSTR lpCmdLine, int nCmdShow) { WNDCLASSEX wc; HWND hwnd; MSG msg; memset(&wc,0,sizeof(wc)); wc.cbSize = sizeof(WNDCLASSEX); wc.lpfnWndProc = WndProc; wc.hInstance = hInstance; wc.hCursor = LoadCursor(NULL, IDC_ARROW); wc.hbrBackground = (HBRUSH)(COLOR_WINDOW+1); wc.lpszClassName = "usw82_simple_media_player"; wc.hIcon = LoadIcon(NULL, IDI_APPLICATION); wc.hIconSm = LoadIcon(NULL, IDI_APPLICATION); if(!RegisterClassEx(&wc)) { MessageBox(NULL, "Window Registration Failed!","Error!", MB_ICONEXCLAMATION | MB_OK); return 0; } hwnd = CreateWindowEx(WS_EX_CLIENTEDGE,"usw82_simple_media_player", "Simple Media Player", WS_VISIBLE | WS_OVERLAPPEDWINDOW, CW_USEDEFAULT, CW_USEDEFAULT, 840, 698, NULL, NULL, hInstance, NULL); if(hwnd == NULL) { MessageBox(NULL, "Window Creation Failed!","Error!", MB_ICONEXCLAMATION | MB_OK); return 0; } while(GetMessage(&msg, NULL, 0, 0) > 0) { TranslateMessage(&msg); DispatchMessage(&msg); } return msg.wParam; }
4. Вуаля! Вот наш проигрыватель, он проигрывает видео т.е. avi-файл. Это видео я сам делал в программе Blender 2.79.
Продолжим вспоминать. Вспоминать будем на Borland C++ Builder 4
Короче я за 2 минуты сделал простенький видео медиа плеер. В Borland C++ Builder 4 есть компонент MediaPlayer:
Видео где будет отображаться у меня называется Panel1, а компонент, который проигрывает видео называется MediaPlayer1:
Нужно сделать следующее - AutoEnable = true, AutoOpen = true, Display = Panel1, FileName=C:\Windows\Clock.avi, VisibleButtons - btRecord = false, btEject = false:
Вуаля! А вот и наш простенький медиа плеер, который может проигрывать видео файлы:
Марк Цукерберг когда ещё учился вроде бы создал музыкальный проигрыватель на обычном Visual Basic, назывался Synapse Media Player, вот так выглядкл этот медиаплеер - https://windows-cdn.softpedia.com/screenshots/Synapse-Medi.... Я когда был школьником тоже пытался создать свой медиа плеер, и даже свой кодек см. Воспоминания свой кодек на VB6, 15.05.2024. Сегодня или завтра попробую создать на Visual Basic DivX проигрыватель.
Я буду делать на каком-то из этих Visual Basic-ов. У меня тут Visual Basic 4 Enterprise Edition, Visual Basic 5 Enterprise Edition, Visual Basic 6 Professional Edition:
Предумываем свой скрипт. Короче в Visual Basic и VBA есть функция split. Эта функция расщепляет строку на массив, спомощью конкретного делителя. Допустим в нашем скрипте алгоритм такой КОМАНДА потом пробел и парметры, например INTRO startup.avi.
Команда |
Параметры |
Пример |
Описание |
INTRO |
имя_файла.avi |
INTRO startup.avi |
Запускается видео в самом начале |
MENU_BG |
имя_файла.jpeg |
MENU_BG mainmenu.jpeg |
Отображает картинку, которая служит менюшкой. |
MENU_AU |
имя_файла.mp3 |
MENU_AU mainmenu.mp3 |
Проигрывает аудио, пока находишься в меню. |
MOVIE |
имя_файла.avi |
MOVIE gladiator.avi |
Загружает видео, когда пользователь нажмёт на проигрывание, фильм запустится |
HOTSPOTS |
X, y, pos, x, y, pos, … |
HOTSPOTS 10 10 0, 10 40, 500 |
При нажатие на видео, загружается позиция видео |