第24节 实例-读取mp4视频当纹理

本节功能

本节我们将使用Mp4当纹理,贴在一个面上,不断的播放它。如下图:
在这里插入图片描述

本节资源

本文集包括本节所有资源包括模型代码都在此下载,按节的序号有文件或文件夹。

注意: 务必使用浏览器打开:
【击此打开网盘资源链接】

具体实现

第23节 编译-《OSG&OE编译一本通》永久性解决编译问题中讲解了如何编译ffmpeg插件,其实实现起来就很方便了,ffmpeg插件可以读取几乎所有的视频格式,直接将mp4文件当成一个图片读进来就可以。

在读取前,我们要指定使用ffmpeg插件来读取mp4格式,使用如下语句:

    osgDB::Registry::instance()->addFileExtensionAlias("mp4", "ffmpeg");

然后我们可以直接进行读取,并控制:

    osgDB::Registry::instance()->addFileExtensionAlias("mp4", "ffmpeg");
    osg::Image* image = osgDB::readImageFile("1.mp4");

    //转换成图片流,然后播放
    osg::ImageStream* imagestream = dynamic_cast<osg::ImageStream*>(image);
    if (imagestream)
    {
        imagestream->play();
    }

此时image就是一个正常的图片,当传入纹理使用即可。

另外

mp4除了图像外,还有声音,当然这个mp4录的时候就没有声音,如果想了解关于声音控制等更多内容,可以参考osg自带的例子:osgmovie

本节全部代码

#include <osgViewer/Viewer>
#include <osgDB/ReadFile>
#include <osg/Geode>
#include <osg/ImageStream>
#include <osg/Texture2D>

osg::Node* createAPlane()
{
    osg::Geode* gnode = new osg::Geode;
    gnode->getOrCreateStateSet()->setMode(GL_LIGHTING, osg::StateAttribute::OFF|osg::StateAttribute::OVERRIDE);

    osg::Geometry* geom = new osg::Geometry;
    gnode->addDrawable(geom);

    //顶点
    osg::Vec3Array* vertex = new osg::Vec3Array;
    geom->setVertexArray(vertex);

    //纹理
    osg::Vec2Array* coord = new osg::Vec2Array;
    geom->setTexCoordArray(0, coord);

    //压入四个顶点构成一个面,我这个视频是1260x788的,比例很奇葩
    vertex->push_back(osg::Vec3(0.0, 0.0, 0.0));
    coord->push_back(osg::Vec2(0.0, 0.0));

    vertex->push_back(osg::Vec3(1260.0, 0.0, 0.0));
    coord->push_back(osg::Vec2(1.0, 0.0));

    vertex->push_back(osg::Vec3(1260.0, 0.0, 788.0));
    coord->push_back(osg::Vec2(1.0, 1.0));

    vertex->push_back(osg::Vec3(0.0, 0.0, 788.0));
    coord->push_back(osg::Vec2(0.0, 1.0));

    geom->addPrimitiveSet(new osg::DrawArrays(GL_QUADS, 0, 4));

    //读取纹理
    osgDB::Registry::instance()->addFileExtensionAlias("mp4", "ffmpeg");
    osg::Image* image = osgDB::readImageFile("1.mp4");

    //转换成图片流,然后播放
    osg::ImageStream* imagestream = dynamic_cast<osg::ImageStream*>(image);
    if (imagestream)
    {
        imagestream->play();
    }

    osg::Texture2D* texture = new osg::Texture2D(image);
    texture->setResizeNonPowerOfTwoHint(false);
    texture->setFilter(osg::Texture::MIN_FILTER, osg::Texture::LINEAR);
    texture->setWrap(osg::Texture::WRAP_S, osg::Texture::CLAMP_TO_EDGE);
    texture->setWrap(osg::Texture::WRAP_T, osg::Texture::CLAMP_TO_EDGE);

    geom->getOrCreateStateSet()->setTextureAttributeAndModes(0,
        texture,
        osg::StateAttribute::ON);

    return gnode;
}

int main()
{
    osgViewer::Viewer viewer;
    viewer.setSceneData(createAPlane());
    return viewer.run();
}

© 版权声明
THE END
喜欢就支持一下吧
点赞0 分享
评论 抢沙发
头像
欢迎您留下宝贵的见解!
提交
头像

昵称

取消
昵称表情代码图片