我正在尝试仅使用glTexCoord2f()和glVertex2f()实现OpenGL中的图像缩放.
让我解释一下:在加载a QImage并将其发送到gpu后,glTexImage2D()我必须根据Qt的规范执行图像缩放操作.Qt定义了这3个操作(见下图):

我认为这是唯一的方法,因为我的应用程序是一个Qt插件,这个任务需要paint()在类的方法内完成.这项IgnoreAspectRatio操作非常简单,现在正在运作.在KeepAspectRatio最初给了我一些麻烦,但现在它也在努力.不幸的是,KeepAspectRatioByExpanding让我很头疼.
我正在分享到目前为止我所做的事情,感谢您对此问题的帮助:
main.cpp中:
#include "oglWindow.h"
#include <QtGui/QApplication>
int main(int argc, char *argv[])
{
QApplication a(argc, argv);
oglWindow w;
w.show();
return a.exec();
}
Run Code Online (Sandbox Code Playgroud)
oglWindow.cpp:
#include "oglWindow.h"
#include "glwidget.h"
#include <QGridLayout>
oglWindow::oglWindow(QWidget *parent, Qt::WFlags flags)
: QMainWindow(parent, flags)
{
ui.setupUi(this);
GLWidget *openGL = new GLWidget(this);
QGridLayout *layout = new QGridLayout;
setLayout(layout);
}
oglWindow::~oglWindow()
{
}
Run Code Online (Sandbox Code Playgroud)
oglWindow.h:
#ifndef oglWindow_H …Run Code Online (Sandbox Code Playgroud) 我正在寻找解码iPhone上本地mpeg-4视频帧的最快方法.我只是对每10帧中像素的亮度值感兴趣.我不需要在任何地方渲染视频.
我已经尝试过ffmpeg,AVAssetReader,ImageAssetGenerator,OpenCV和MPMoviePlayer,但它们都太慢了.我能得到的最快速度是2倍(一分钟内扫描2分钟).我想要接近10倍的东西.
假设我上面的尝试没有使用GPU,有没有办法用GPU上运行的东西来实现我的目标?OpenGL似乎主要用于渲染输出,但我已经看到它用作传入视频的过滤器.也许这是一个选择?
提前致谢!
在Ubuntu 10.10(Pentium 4 2.80GHz)上尝试使用QtMobility 1.2.0和Qt 4.7.4播放视频时,我看到了糟糕的表现.
有趣的是图腾(也使用gstreamer作为后端)和vlc能够在这台机器上播放这些视频,即使分辨率更高(全屏等).
根据顶部,我的应用程序消耗100%的CPU,而图腾和vlc仅消耗约40%.那真是怪了!所以我在下面分享了应用程序的源代码.它使用QMediaPlayer并QVideoWidget完成工作.
movie.cpp:
#include <QtGui/QMainWindow>
#include <QtGui>
#include <qmediaplayer.h>
#include <qvideowidget.h>
int main(int argc, char* argv[])
{
QApplication app(argc, argv);
QMainWindow mainWindow;
mainWindow.resize(QSize(1280, 500));
QMediaPlayer* mplayer = new QMediaPlayer;
QVideoWidget* vid_widget = new QVideoWidget(&mainWindow);
vid_widget->setAspectRatioMode(Qt::IgnoreAspectRatio);
mainWindow.setCentralWidget(vid_widget);
mplayer->setVideoOutput(vid_widget);
mplayer->setMedia(QUrl::fromLocalFile(argv[1]));
mplayer->setVolume(50);
mplayer->setPlaybackRate(1);
mplayer->play();
mainWindow.show();
return app.exec();
}
Run Code Online (Sandbox Code Playgroud)
movie.pro:
TEMPLATE = app
QT …Run Code Online (Sandbox Code Playgroud) 我正在尝试在Linux的私有视频播放器中进行一些优化以提高性能,因为在CPU上播放MP4文件很重,因为视频帧是用YV12编码的,而OpenGL不提供显示此格式的本机方式.现在有一个代码在CPU上运行,在将图像发送到GPU进行显示之前将YV12转换为RGB,这会消耗100%的CPU处理能力.
我正在研究如何解码YV12帧而无需编写着色器来进行YV12 - > RGB转换.据我所知,一种方法是通过GL_MESA_ycbcr_texture,显然由我的系统支持(报告glxinfo).
在这个Fedora Box中我有一个ATI Technologies Inc RV610视频设备[Radeon HD 2400 PRO],这是一个不错的视频卡.然后,我下载了yuvrect测试并进行了一些更改以替换GL_TEXTURE_RECTANGLE_NV此卡支持的纹理:GL_TEXTURE_RECTANGLE_ARB.
但是,当我执行此修改后的应用程序时,它输出:
The MESA driver reports *unsupported texture format in setup_hardware_state*
Run Code Online (Sandbox Code Playgroud)
我注意到glPopMatrix();从Display()回调执行时会出现此错误.现在,这似乎不是我的应用程序中的一个错误,因为我在另一个具有不同视频卡的Fedora盒(同一系统)上运行了完全相同的代码:英特尔公司Sandy Bridge集成图形控制器(rev 09),它的工作原理beatifully.
2个二进制文件之间唯一可见的区别是它们与之链接的库.关于(有问题的)ATI卡ldd报告:
linux-gate.so.1 => (0x00da3000)
libGL.so.1 => /usr/lib/libGL.so.1 (0x077bd000)
libGLU.so.1 => /usr/lib/libGLU.so.1 (0x0783b000)
libglut.so.3 => /usr/lib/libglut.so.3 (0x005a9000)
libGLEW.so.1.5 => /usr/lib/libGLEW.so.1.5 (0x00aa3000)
libstdc++.so.6 => /usr/lib/libstdc++.so.6 (0x057e2000)
libm.so.6 => …Run Code Online (Sandbox Code Playgroud)