Страница: 1 |
Страница: 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-сайт:
Профиль | | #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-сайт:
Профиль | | #3
Добавлено: 01.05.07 22:15
#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, "moguids.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-сайт:
Профиль | | #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-сайт:
Профиль | | #6
Добавлено: 02.05.07 15:49
По второму, примеры вызова mciSendString для игры в любом окне и фулскрине:
mciSendString("play movie fullscreen", 0, 0, 0)