• 11697阅读
  • 4回复

关于qt 和ffmpeg [复制链接]

上一主题 下一主题
离线n1wer
 
只看楼主 倒序阅读 楼主  发表于: 2009-04-22
最近想做个播放器,调用ffmpeg来做解码库!然后视频在qt上显示出来!
想到了两种方法:
(1),先通过SDL来显示画面然后,再用SDL和qt的进行联系,
但是我这样做的时候,不知道怎么才能把ffmpeg编译进qt,
我是这样做的,在 .pro文件中添加LIBS += -lavformat  -lavcodec -lavutil lz -lavutil -lm `sdl-config --cflags --libs`
但是编译总通不过,报错就是找不到ffmpeg里面的函数,
但是我直接编译我写的ffmpeg程序时:gcc -o mytes mytest.c -lavformat  -lavcodec -lavutil lz -lavutil -lm `sdl-config --cflags --libs`
程序是可以编译成功的。
(2),是通过ffmpeg解码出来的视频流,不用SDL来显示,而是直接用qt里面的Qlabel,或是其他显示,但是我查qlabel,不能显示yuv格式,后来有人说opengl可以显示yuv格式,谁做过这个方面的工作吗!

上面两个问题,希望大家多多帮忙。
离线n1wer
只看该作者 1楼 发表于: 2009-04-28
对于第一个问题,现在找到了一点原因,
因为ffmpeg是c程序,所以在编译的时候需要在头文件中加入
extern "c" {
#include <ffmpeg/avcodec.h>
#include <ffmpeg/avformat.h>
}
这样就可以编译过了,但是又有一个新问题,就是关于SDL,现在程序虽然可以运行,但是,SDL还是不能嵌入到一个Qt的widget中,
我是先继承一个qwidget类,然后在这个类的构造函数里面来对sdl进行设置,最后调用ffmpeg的函数来解码视频流,最后把视频通过sdl的SDL_DisplayYUVOverlay()函数来显示画面,接下来按照网上有人说的,
char variable[64];
  sprintf(variable, "SDL_WINDOWID=0x%lx",QWidget::winId());
  putenv(variable);
来进行qt和sdl的联系,但是运行是好像没什么用。
谁知道怎么才能把SDL可以嵌入式到widget中吗?谢谢!!
离线gvim
只看该作者 2楼 发表于: 2009-04-28
SDL 和 Qt 都有自己的事件处理系统。 不容易整合到一起

还是推荐你用第二种方法,你可以实现一个支持YUV的QImageCodec。 然后用QImage去调用它。

另:ffmpeg的解码可以输出RGB格式的。
[ 此帖被gvim在2009-06-18 10:03重新编辑 ]
Qt,Qt! 分享Cute之Qt体验
欢迎访问 http://www.cuteqt.com
欢迎订阅 http://www.cuteqt.com/?feed=rss2

离线n1wer
只看该作者 3楼 发表于: 2009-05-05
谢谢,我QImage来做了,但是有个问题:把解码出来的frame转换成rgb格式,但是我不能动态的来显示显示:
label->setPixmap(QPixmap(image));
后来我想用一个文件来作为一个缓冲区,就是先把转换好的数据写入一个文件,当写入文件后, 然后通知QImage,最后通过label->setPixmap(QPixmap(image));
但是这样效率很低!
后来我看见有人说,用X11,因为qt也是基于X11的,通过X11下面的Xv来显示yuv,
XvcreateImage()和XvutImage()来显示画面,但是我在头文件中加入了Xvlib.h,Xv.h,但是编译通不过,出现下面的错误:
undefined reference to `XvcreateImage`,等找不到Xv函数的错误。
不知道怎么回事!我在Vxli.h里面可以找到XvcreateImage等函数的定义,我在想是不是没有找到XvcreateImage的实现函数,才报上面的函数,但是我不知道这些函数放在哪里!
谁知道呀!
告诉我一下!!
离线voidbroken

只看该作者 4楼 发表于: 2011-03-10
OPENGL
快速回复
限100 字节
 
上一个 下一个