Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате
Форум программистов > C/C++: Мультимедия, OpenGL/DirectX > как проиграть mpeg4


Автор: cipher 21.9.2005, 09:42
Господа есть вопрос на засыпку - надо взять avi пожатый divx, xvid либо mpeg-2(любым из них) и распаковать, а каждый кадр натянуть как текстуру на некую поверхность. Как это провернуть? У Nehe есть пример(за номером 35), но там avi не сжат и нет звука. А может кто подскажет где взять бесплатную компонету для VisualC++ чтобы распаковывать любой из этих форматов?

Автор: empter 21.9.2005, 17:21
DitectX SDK9.0.
После установки заходи в папку Samples там куча проигырывателей всего что тольно можно на C++, C#, VB.
Одно НО в коде можно разобраться, если есть опыт работы с DirectX.

Другой вариант - поискать ActiveX компонент, но тогда фишка:

Цитата(cipher @ 21.9.2005, 09:42)
каждый кадр натянуть как текстуру на некую поверхность

не получится.

Автор: Guest 22.9.2005, 03:08
А с использованием Video for Windows можно как нибудь провернуть такой фокус?

Автор: cipher 23.9.2005, 04:31
Я думаю что надо всё-таки юзать video for windows в связке с Video Compression Manager. Но у меня что-то не выходит ничего
Код

    AVISTREAMINFO streamInfo;
    PAVISTREAM aviStream;
    PGETFRAME pFrame;

...
Код

    AVIFileInit();
    AVIStreamOpenFromFile(&aviStream, aviFile, streamtypeVIDEO, 0, OF_READ, 0);
    AVIStreamInfo(aviStream, &streamInfo, sizeof(streamInfo));
...
    pFrame = AVIStreamGetFrameOpen(aviStream, 0);

Код

[color=red]    LPBITMAPINFOHEADER lpbiIn, lpbiOut;
    LPVOID lpIn, lpOut;
    HIC hIC;

    hIC = ICLocate(ICTYPE_VIDEO, 0, lpbiIn, lpbiOut, ICMODE_DECOMPRESS);
    lpbiIn = (LPBITMAPINFOHEADER)AVIStreamGetFrame(pFrame, frame);

    ICDecompressBegin(hIC, lpbiIn, lpbiOut);
    ICDecompress(hIC, 0, lpbiIn, lpIn, lpbiOut, lpOut);
    ICDecompressEnd(hIC);

    image.data = (unsigned char *)lpbiOut + lpbiOut -> biSize;
    bgr2rgb(image.data);
[/color]


без сжатия всё нормально играется, а вот как распаковать не пойму. Кодеки в системе стоят, crystal player играет эту авиху.

Автор: cipher 26.9.2005, 04:19
Я что-то не пойму неужели никто ни разу не юзал Video for Windows, что никто не пытался проиграть XviD или DivX? Большая прозьба откликнуться господа программеры!

Автор: p0s0l 26.9.2005, 11:41
Сейчас точно сказать не могу, но насколько я помню, если в AVIStreamGetFrameOpen указать формат битмапа, то распаковывать вручную ничего не надо будет - фреймы будешь получать распакованными...
И имхо стоит порыть DirectShow, там скорее всего должна быть такая фишка, как рендеринг в текстуру или поверхность, тогда будет всё очень просто... Но я этого не делал...

Автор: cipher 27.9.2005, 03:08
p0s0l наконец-то хоть кто-то понимает про чё речь идёт. А по подробнее можно про LPBITMAPINFOHEADER(ведь речь про него верно?). Надо юзать ICCompressGetFormat()? Я блин всё знаю, но никак не могу сложить этот пазл. Не получается в правильной последовательности применить операторы. Может кто поможет примером? smile

Что касается этого треклятого DirectX - ну не использую я его, ну вот такой я баран, все в OGL хочу реализовать

Автор: p0s0l 28.9.2005, 07:58
Суть такова: в AVIStreamGetFrameOpen нужно указать формат, в котором ты хочешь получать кадры с помощью последующих вызовов AVIStreamGetFrame... Никаких ICCompressGetFormat использовать не надо...

Примерно как-то так должно быть:
Код

PAVISTREAM s;
AVISTREAMINFO info;
BITMAPINFOHEADER bih;
PGETFRAME gf;
PVOID dib;

AVIFileInit;

AVIStreamOpenFromFile(&s, 'DivX.avi', streamtypeVIDEO, 0, 0, NULL);

ZeroMemory (&info, sizeof(info));
AVIStreamInfo(s, &info, sizeof(info));

ZeroMemory (&bih, sizeof(bih));
bih.biSize = sizeof(bih);
bih.biWidth = info.rcFrame.Right - info.rcFrame.Left;
bih.biHeight = info.rcFrame.Bottom - info.rcFrame.Top;
bih.biPlanes = 1;
bih.biBitCount = 24;
bih.biSizeImage = (((bih.biWidth*bih.biBitCount / 8) + 3) & 0xFFFFFFFC) * bih.biHeight;

gf = AVIStreamGetFrameOpen(s, &bih);

dib = AVIStreamGetFrame(gf, 1000);

// в dib теперь распакованный тысячный кадр...


Автор: cipher 6.10.2005, 03:51
p0s0l огромное мерси, немного поморочил и всё вышло именно так как ты и говоришь

Автор: Guest 11.10.2005, 04:37
Встала другая проблема, а как проиграть аудио поток из этой avi? Статейку как выдернуть данные аудио потока я нашел, но автор не говорит чем потом всё это богатство проиграть(http://www.gamedev.net/reference/articles/article840.asp). Попробовал MCI'ные sendCommand и sendString ничего не выходит.

Автор: chaos 11.10.2005, 06:15
смотри макросы начинающиеся на MCIWnd

Автор: cipher 12.10.2005, 06:23
Код

    long result;
    HWND m_hPlayer;

    m_hPlayer = MCIWndCreate(0, 0,
                            WS_CHILD|MCIWNDF_NOMENU|MCIWNDF_NOTIFYALL|MCIWNDF_NOPLAYBAR,
                            0);
    result = MCIWndOpen(m_hPlayer, "data/zp.wav", 0);
    result = MCIWndPlay(m_hPlayer);

    return 0;


Поробовал налабать консольку с таким кодом. m_hPlayer равен 0, а result во всех случаях 0. Звук не проигрывается это раз. Два, мне интересно будет ли он проигрываться отдельным потоком, поскольку мне надо и видео параллельно выводить?(аудио можно и из wav читать, а не совать потоком в avi).

Автор: chaos 12.10.2005, 06:40
Цитата(cipher @ 12.10.2005, 06:23)
Код

    long result;
    HWND m_hPlayer;

    m_hPlayer = MCIWndCreate(0, 0,
                            WS_CHILD|MCIWNDF_NOMENU|MCIWNDF_NOTIFYALL|MCIWNDF_NOPLAYBAR,
                            0);
    result = MCIWndOpen(m_hPlayer, "data/zp.wav", 0);
    result = MCIWndPlay(m_hPlayer);

    return 0;


Поробовал налабать консольку с таким кодом. m_hPlayer равен 0, а result во всех случаях 0. Звук не проигрывается это раз. Два, мне интересно будет ли он проигрываться отдельным потоком, поскольку мне надо и видео параллельно выводить?(аудио можно и из wav читать, а не совать потоком в avi).

MCIWndCreate создает контрол, так что консоль не подойдет, необходимо оконное приложение

Автор: cipher 12.10.2005, 06:52
Попробовал воткнуть в WinApi тоже ничего не проигрывает. В MCIWndCreate() указал HWND и HINSTANCE

Powered by Invision Power Board (http://www.invisionboard.com)
© Invision Power Services (http://www.invisionpower.com)