Visual Basic, .NET, ASP, VBScript
 

   
   
     

Форум - Общий форум

Страница: 1 |

 

  Вопрос: 2 вопроса: Трехполосный эквалайзер и видео Добавлено: 30.04.07 12:13  

Автор вопроса:  april
1) подскажите, где на каких сайтах можно найти исходники по созданию эквалайзера простейшего трехполосного? Без использования посторонних библиотек типа FMOD.

2) я пишу медиаплеер с использованием библиот-ки quartz.dll. Видео открывается через окно ActiveMovie Window. Можно ли как-то перенести содержимое этого окна (т.е. само видео) на форму, а при открытии видеофайла не показывать ActiveMovie? Или как написать код, для развертыванияч\свертывания окна ActiveMovie, развертывания видео во весь экран и т.д?

Ответить

  Ответы Всего ответов: 6  

Номер ответа: 1
Автор ответа:
 Sharp


Лидер форума

ICQ: 216865379 

Вопросов: 106
Ответов: 9979
 Web-сайт: sharpc.livejournal.com
 Профиль | | #1
Добавлено: 30.04.07 15:25
1) Изучай быстрое преобразование Фурье (БПФ, FFT) - оно раскладывает звук на спектр частот. Проходишь по частотам, умножаешь их на коэффициенты, взятые из эквалайзера, делаешь обратное БПФ, полученный звук выдаешь.

2) Используй интерфейс IVideoWindow и свойство Owner - с его помощью можно указать родительское окно для воспроизведения видео.

Ответить

Номер ответа: 2
Автор ответа:
 april



Вопросов: 5
Ответов: 7
 Профиль | | #2 Добавлено: 01.05.07 21:56
спасибо, буду пробовать хотя исходников по этим вопросам так и не нашел.
а по 2 вопросу можно чуть подробнее (типа какой-нибудь код)?

Ответить

Номер ответа: 3
Автор ответа:
 Sharp


Лидер форума

ICQ: 216865379 

Вопросов: 106
Ответов: 9979
 Web-сайт: sharpc.livejournal.com
 Профиль | | #3
Добавлено: 01.05.07 22:15
#define _WIN32_DCOM
#ifndef UNICODE
#define UNICODE
#endif

#ifndef _UNICODE
#define _UNICODE
#endif

#include <windows.h>
#include <tchar.h>
#include <atlbase.h>
#include <objbase.h>
#include <dmo.h>
#include <dshow.h>

#include <strmif.h>
#include <control.h>

#include "wmcodecconst.h"

#include <iostream>
#include <vector>
#include <string>
#include <sstream>

using namespace std;

HINSTANCE hInstance;

#ifdef UNICODE
#define cout wcout
#define string wstring
#define stringstream wstringstream
#endif

#define WM_GRAPHNOTIFY  WM_APP + 1


#include "WqLib.h"

#pragma comment (lib, ";Dmoguids.lib";)
#pragma comment (lib, "Msdmo.lib";)
#pragma comment (lib, "strmiids.lib";)



class ShowVideo {
private:
IGraphBuilder  * m_pGB;

IMediaControl  * m_pMC;
IMediaEventEx *pIMEE;
IVideoWindow   * m_pVW;
//IBasicAudio    * m_pBA;
//IBasicVideo    * m_pBV;
//IMediaSeeking  * m_pMS;
//IVideoFrameStep* m_pFS;

public:
ShowVideo(){
m_pGB = NULL;
m_pMC = NULL;
pIMEE = NULL;
m_pVW = NULL;
if(FAILED(CoCreateInstance(CLSID_FilterGraph, NULL, CLSCTX_INPROC_SERVER, IID_IGraphBuilder, (void**)&m_pGB))) throw;
}

~ShowVideo(){
m_pVW->put_Visible(FALSE);
//m_pVW->put_Owner(NULL);

m_pMC->Stop();

long evcode;
pIMEE->WaitForCompletion(INFINITE, &evcode);

if(m_pGB) m_pGB->Release();
if(m_pMC) m_pMC->Release();
if(pIMEE) pIMEE->Release();
if(m_pVW) m_pVW->Release();
}

HRESULT RenderFile(string file){
return m_pGB->RenderFile(file.c_str(), 0);
}

void VideoToWindow(HWND hwnd){
//CoCreateInstance(CLSID_VideoRenderer, NULL, CLSCTX_INPROC_SERVER, IID_IVideoWindow, (void **)&m_pVW);
m_pGB->QueryInterface(IID_IVideoWindow, (void **)&m_pVW);

//зарегистрировать родительское окно для video window
m_pVW->put_Owner((OAHWND)hwnd);
//установить стили для video window
m_pVW->put_WindowStyle(WS_CHILD | WS_CLIPSIBLINGS);


RECT r;
GetClientRect(hwnd, &r);
m_pVW->SetWindowPosition(r.left + 8, r.top + 8, r.right - r.left - 16, r.bottom - r.top - 16);
m_pVW->SetWindowForeground(OATRUE);
//m_pVW->HideCursor(OATRUE);

//установить окно получающее события уведомления
m_pGB->QueryInterface(IID_IMediaEventEx, (void **)&pIMEE);

pIMEE->SetNotifyWindow((OAHWND)hwnd, WM_GRAPHNOTIFY, /*(long)m_pGB*/ 0);
}

void Resize(int left, int top, int width, int height){
m_pVW->SetWindowPosition(left, top, width, height);
}

void RunVideo(){
m_pGB->QueryInterface(IID_IMediaControl, (void **)&m_pMC);
//запустить процесс преобразования медиа потока через цепь фильтров
HRESULT _hres = m_pMC->Run();
}

vector<string> EnumFilters(){
vector<string> res;
DWORD lNum;
IEnumFilters *m_pEF;
IBaseFilter *pIBF;
FILTER_INFO fi;

m_pGB->EnumFilters(&m_pEF);
while(SUCCEEDED(m_pEF->Next(1, &pIBF, &lNum))){
if(lNum == 0) break;
pIBF->QueryFilterInfo(&fi);
res.push_back(string(fi.achName));
pIBF->Release();
}
m_pEF->Release();
return res;
}
};



class MyWqWindow : public WqWindow {
private:
ShowVideo *sv;

public:
void OnCreate(HWND hwnd){
//ShowVideo(hWnd);
//MessageBox(hWnd, _T("Hello!";), _T("I'm was created";), MB_ICONASTERISK);
sv = new ShowVideo;
sv->RenderFile(_T("k:\\My Downloads\\Harry Potter\\4\\Harry Potter And The Goblet Of Fire CD1.avi";));
sv->VideoToWindow(hwnd);
sv->RunVideo();
}

void OnDestroy(){
delete sv;
}

void OnResize(){
RECT r;
GetClientRect(hWnd, &r);
sv->Resize(r.left + 8, r.top + 8, r.right - r.left - 16, r.bottom - r.top - 16);
}
};


int WINAPI WinMain(HINSTANCE hInst, HINSTANCE hPrevInst, LPSTR CmdLine, int CmdShow){
hInstance = hInst;
CoInitializeEx(NULL, COINIT_MULTITHREADED);

InitializeCriticalSection(&WqWindow_mmi_cs);

MyWqWindow *win = new MyWqWindow();
win->setCaption(string(_T("Small Video Player";)));
win->RegClass();
win->Create();
win->MainLoop();

DeleteCriticalSection(&WqWindow_mmi_cs);
CoUninitialize();
return 0;
}

Ответить

Номер ответа: 4
Автор ответа:
 april



Вопросов: 5
Ответов: 7
 Профиль | | #4 Добавлено: 02.05.07 12:45
чтой то непонятно... Это Си кажись? Но все равно еще раз спасибо

Ответить

Номер ответа: 5
Автор ответа:
 Sharp


Лидер форума

ICQ: 216865379 

Вопросов: 106
Ответов: 9979
 Web-сайт: sharpc.livejournal.com
 Профиль | | #5
Добавлено: 02.05.07 14:53
Это C++, основной код по воспроизведению видео в классе ShowVideo. Вкратце вот последовательность действий:
1) Создать объект FilterGraph и получить указатель на интерфейс IGraphBuilder
2) Вызвать IGraphBuilder::RenderFile для рендеринга видео
3) Для привязки видео к своему окну сделать следующее:
а) Запросит через полученный указатель QueryInterface указатель на IVideoWindow
б) Назначить родительское окно IVideoWindow::put_Owner
в) Установить стили для него IVideoWindow::put_WindowStyle
г) Установить позицию видео в окне IVideoWindow::SetWindowPosition
д) Установить фон окна IVideoWindow::SetWindowForeground
е) Можно спрятать курсор IVideoWindow::HideCursor
ж) Запросить интерфейс IMediaEventEx, через который можно будет получать события
з) Установить окно и сообщение для событий вывода видео IMediaEventEx::SetNotifyWindow
4) Запустить воспроизведение видео
а) Получить указатель на интерфейс
IMediaControl
б) Запустить им видео через IMediaControl::Run
5) При ресайзе окошка ресайзить видео IVideoWindow::SetWindowPosition
6) После окончания воспроизведения или по закрытию программы всех убить
а) Сделать видео невидимым IVideoWindow::put_Visible
б) Остановить воспроизведение IMediaControl::Stop
в) Дождать завершения операции IMediaEventEx::WaitForCompletion
г) Зарелизить все интерфейсы

Ответить

Номер ответа: 6
Автор ответа:
 Sur



ICQ: 1249088 

Вопросов: 10
Ответов: 304
 Web-сайт: sur.hotbox.ru/
 Профиль | | #6
Добавлено: 02.05.07 15:49
По второму, примеры вызова mciSendString для игры в любом окне и фулскрине:

mciSendString("open " & Filename & " type mpegvideo alias movie parent " & hWnd & " style " & WindowStyle & " ", 0, 0, 0)

mciSendString("play movie fullscreen", 0, 0, 0)

Ответить

Страница: 1 |

Поиск по форуму



© Copyright 2002-2011 VBNet.RU | Пишите нам