现在的位置: 首页 > 综合 > 正文

linux下QT开始使用ffmpeg和OpenGL

2012年09月09日 ⁄ 综合 ⁄ 共 3438字 ⁄ 字号 评论关闭

linux下QT开始使用ffmpeg和OpenGL

本文章只是对如何开始使用ffmpeg和OpenGL的记录,到通过调用的基本函数可以正常编译通过时为止。

本篇文章是继 http://blog.csdn.net/jszj/article/details/7589566 安装之后的开始使用文章,未来有可能还会有进一步的文章,但现在不确定。

2012.5.22
创建qt工程,发现其文件列表里有 xx.pro ,所以按照
http://blog.csdn.net/betty_ting/article/details/5769701
的说明,加入对ffmpeg库的支持也很简单,因为文件视图中双击这个这个文件就会打开,可以直接编辑。
由于ffmpeg的头文件已在系统的路径中,所以无需按这个上面把包含路径加入,直接加入lib的支持就行了:

LIBS     += -lavcodec -lavformat -lavutil

查看本行的写法,感觉有点奇怪,到/usr/local/lib目录中查看ffmpeg的库,都是以lib开头,以.a结尾,而这里只是这样写,然后我就把libavcodec.a改了个名字libavcodecN.a,结果再编译时就报找不到库文件,所以猜测这里的名称,是去掉了前面的lib和后面的.a后中间的那部分做为名称,后查验这个目录中的lib文件,发现全部以lib开头,所以它基本上验证了我的猜测。
搜索到一个文章:http://www.51099.com/comp/prcj/20101206/365613.html,对于qt的基本入门部分还是有点用的,说的比较好。
在源.h文件中添加对ffmpeg的包含:

#ifndef INT64_C
#define INT64_C(c) (c ## LL)
#define UINT64_C(c) (c ## ULL)
#endif
extern "C"
{
#include <libavformat/avformat.h>
}

前面的那些#define,用于解决ffmpeg里的一个bug,它导致无法正常编译,是从网上搜索到的解决办法。
为了验证,则在第一个类的构造函数中添加了对ffmpeg的调用:

avcodec_init();

然后编译,结果显示了很多错误:

/home/ligo/qttools/qt/ffmpeg_org/libavcodec/utils.c:225: 错误:undefined reference to `av_image_check_size'

加入 libavcore.a 的依赖,结果显示:
/home/ligo/qttools/qt/ffmpeg_org/libavcore/parseutils.c:320: 错误:undefined reference to `av_get_random_seed'
查了半天也没有找到原因,最后搜索到

http://hi.baidu.com/benbearlove/blog/item/92e6bb27a6af89098a82a1a7.html,说调整一下库的依赖顺序,想起早前在windows上使用ffmpeg时也要保证顺序,所以就按照上面给出的顺序调整:

LIBS     += -lavcodec -lavformat -lavcore -lavutil
果然编译通过。晕,这顺序太不爽了,晚了,明天继续。

5.23
为了解码视频文件,我把自己定义的几个头文件放到了 /usr/local/myinclude 目录中,然后把在.pro文件中加入了一行:
INCLUDEPATH += /usr/local/myinclude
另外,原来在windows下用过ffmpeg解码,写成了2个类(一个父类一个子类)共4个文件放到工程目录中,然后加入到工程中,结果提示:
无法用"System"-编码解码
无法编辑!我用root登录,权限方面肯定不成问题。再一看,发现后面有个改变编码的按钮,按它,然后选择了 windows-1258/CP1258 编码(windows列中的最后一个,我觉的可能是最新的,所以就选择了它),然后就能编辑了。
自己定义的那些头文件,由于是在windows下定义的,所以有很多比如ULONGLONG这样的东西没有定义,所以就在开头位置对没有定义的一一进行了定义加入对OpenGL的头文件包含,结果提示找不到,再查看usr目录中,也没有发现OpenGL的任何头文件和库文件,于是上网下载并安装,安装花了好大力气!参考网址:
http://www.linuxdiyf.com/blog/?135044/action_viewspace_itemid_3877.html
http://hi.baidu.com/pengnini_715/blog/item/a9cb713de48ee0ee3d6d9728.html (注意,这个网址中可能有个错误,OPENGL = usr/lib/libGLU.so,而不是OPENGL =usr/lib/libGLU.so)
在安装过程中,出现:
bash: ./mkmkfiles.imake: /bin/csh: bad interpreter: No such file or directory
先dos2unix不管用,再百度上搜索不到结果,到必应上搜索到:http://www.lemis.com/grog/diary-may2010.php?topics=c,有一小段如下:

So why didn't that message appear from make? It makes things very confusing. Installing csh (another indication of the age of this code) fixed that

其错误是一样的,只不过这个上面是cleandir报错。
由于使用了root登录,所以直接:
apt-get install csh
安装完成之后再make,结果提示(最后一行):
make: *** No rule to make target `depend'.  Stop.
也不知道成功了没有,继续安装,后面报错:
gcc: error: unrecognized command line option ‘-m486’
按照 http://www.howtoforge.com/forums/showpost.php?p=143108&postcount=8 所说,“edit Configure and Makefile and change all instances of -m486 to -mtune=i486 .”

,我这里只修改了lib/glut/makefile文件里的这个东西,继续make,结果还是出错:
../../include/GL/glut.h:58:19: fatal error: GL/gl.h: No such file or directory

5.24
网上找不到gl库,只好从另外一台上面拷贝了头文件和库过来,头文件放到 /usr/include/GL/ 中,库放到 /usr/lib/gl/ 中,并在/usr/lib/中建立了库的链接,库有2个,分别是 libGL.so.1.2、libglut.so.3.8.0,其中libglut.so.3.8.0建立了两个连接,不过,libGL.so.1.2的库好像已经有链接了,这个有点糊涂了。libglut.so.3.8.0建立的两个链接,其中的libglut.so用于编译,libglut.so.3用于运行时加载,同时修改工程中包含的go头文件为
"GL/glut.h"
编译并运行,成功。

 

5.28补充

经过实际运行,发现问题。正常调用如下:

 glutInit(&argc, argv);
 glutInitDisplayMode(GLUT_RGB);
 glutInitWindowPosition(100, 100);
 glutInitWindowSize(lw, lh);
 glutCreateWindow("a");
 glutDisplayFunc(&display);
 glutMainLoop();

但是我在调用glutCreateWindow()时,会卡住不走了,而且显示“正在设置断点...”,一直这样。又过几天了,汗,网上也没有找到有这种问题。

本来是想把图像渲染到一个指定的窗口上(对话框上的一个控件上),这下根本没法运行,而且网上也没有找到好的直接在非OpenGL窗口上渲染的说明和demo什么的,哎,太困难了,看来是OpenGL无缘了

【上篇】
【下篇】

抱歉!评论已关闭.