Deutsch

Воспоминание мультимедия 18.02.2025

67  
uscheswoi_82 патриот2 дня назад, 15:06
NEW 2 дня назад, 15:06 

Всем привет! Хочу вспомнить про мультимедию. Будет от низкого уровня, до высокого уровня.

Если я кому-то отвечаю, это не значит что я ему симпатизирую, каждый остаётся при своём мнение
#1 
uscheswoi_82 патриот2 дня назад, 16:02
NEW 2 дня назад, 16:02 
в ответ uscheswoi_82 2 дня назад, 15:06

Будем сначало вспоминать на Си. на 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. После того как аудиофайл проиграет, наша программа завершается.

Если я кому-то отвечаю, это не значит что я ему симпатизирую, каждый остаётся при своём мнение
#2 
uscheswoi_82 патриот2 дня назад, 16:10
2 дня назад, 16:10 
в ответ uscheswoi_82 2 дня назад, 16:02

Если нужно чтобы проигралось ассинхронно, надо сделать вот так, вместо 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, если нажать любую клавишу, то программа выйдет, и звук перестанет проигрываться.

Если я кому-то отвечаю, это не значит что я ему симпатизирую, каждый остаётся при своём мнение
#3 
uscheswoi_82 патриот2 дня назад, 16:55
NEW 2 дня назад, 16:55 
в ответ uscheswoi_82 2 дня назад, 16:10

Параметр SND_ASYNC подходит если Windows приложение постоянно запущенное, самое то подходит для компьютерных игр каких-нибудь например.

Если я кому-то отвечаю, это не значит что я ему симпатизирую, каждый остаётся при своём мнение
#4 
uscheswoi_82 патриотВчера, 11:55
NEW Вчера, 11:55 
в ответ uscheswoi_82 2 дня назад, 16:55

Продолжим вспоминать мультимедия.

Короче если нужно из ресурсов проиграть звуковой файл то нужно указать флаг 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;
}
Если я кому-то отвечаю, это не значит что я ему симпатизирую, каждый остаётся при своём мнение
#5 
uscheswoi_82 патриотВчера, 12:17
NEW Вчера, 12:17 
в ответ uscheswoi_82 Вчера, 11:55

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

Если я кому-то отвечаю, это не значит что я ему симпатизирую, каждый остаётся при своём мнение
#6 
uscheswoi_82 патриотВчера, 13:03
NEW Вчера, 13:03 
в ответ uscheswoi_82 Вчера, 12:17

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.



Если я кому-то отвечаю, это не значит что я ему симпатизирую, каждый остаётся при своём мнение
#7 
uscheswoi_82 патриотСегодня, 07:49
NEW Сегодня, 07:49 
в ответ uscheswoi_82 Вчера, 13:03

Продолжим вспоминать. Вспоминать будем на 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:



Вуаля! А вот и наш простенький медиа плеер, который может проигрывать видео файлы:


Если я кому-то отвечаю, это не значит что я ему симпатизирую, каждый остаётся при своём мнение
#8 
uscheswoi_82 патриотСегодня, 09:49
NEW Сегодня, 09:49 
в ответ uscheswoi_82 Сегодня, 07:49

Марк Цукерберг когда ещё учился вроде бы создал музыкальный проигрыватель на обычном Visual Basic, назывался Synapse Media Player, вот так выглядкл этот медиаплеер - https://windows-cdn.softpedia.com/screenshots/Synapse-Medi.... Я когда был школьником тоже пытался создать свой медиа плеер, и даже свой кодек см. Воспоминания свой кодек на VB6, 15.05.2024. Сегодня или завтра попробую создать на Visual Basic DivX проигрыватель.

Если я кому-то отвечаю, это не значит что я ему симпатизирую, каждый остаётся при своём мнение
#9 
uscheswoi_82 патриотСегодня, 10:00
NEW Сегодня, 10:00 
в ответ uscheswoi_82 Сегодня, 09:49

Я буду делать на каком-то из этих Visual Basic-ов. У меня тут Visual Basic 4 Enterprise Edition, Visual Basic 5 Enterprise Edition, Visual Basic 6 Professional Edition:


Если я кому-то отвечаю, это не значит что я ему симпатизирую, каждый остаётся при своём мнение
#10 
uscheswoi_82 патриотСегодня, 10:12
NEW Сегодня, 10:12 
в ответ uscheswoi_82 Сегодня, 10:00

Предумываем свой скрипт. Короче в 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

При нажатие на видео, загружается позиция видео

Если я кому-то отвечаю, это не значит что я ему симпатизирую, каждый остаётся при своём мнение
#11