• 18801阅读
  • 14回复

请教:想用Qt4做个媒体播放器/ Qt调用ffmpeg外部库问题. [复制链接]

上一主题 下一主题
离线shangyang
 
只看楼主 倒序阅读 楼主  发表于: 2008-04-03
— 本帖被 XChinux 执行加亮操作(2008-04-09) —

原来没接触过qt编成。 请大家给点思路,是需要用ActiveQt吗来做吗?
如果用open source 版的qt4怎么来做,因为看到只有商业版的qt4还有ActiveQt。

播放器只需要简单的功能,可以播放,mpeg, avi等。 


多谢大伙提供思路。
[ 此贴被shangyang在2008-04-12 11:18重新编辑 ]
离线tingxx

只看该作者 1楼 发表于: 2008-04-04
调用外部的dll?
跟kmplayer一样?
QT自带的文档真是个好东西
一定要好好看呀
离线shangyang
只看该作者 2楼 发表于: 2008-04-08
嗯,  好像要用外部dll. 例如:FFMpeg.  谁有用qt调用ffmpeg 编写媒体播放器的经验阿?
离线thetwo
只看该作者 3楼 发表于: 2008-04-09
要调用外部的音视频的codec,要有playback
我想大思路是这样的 main--> gui&user interface--> call A/V codec--> playback sync.

俺是新来的,最近也要搞个播放器的demo,不做实际应用
codec没有问题,但是想要跨平台的demo,playback部分不想各个平台再写了,
但找了一圈,只找到sdl作多媒体的播放显示,但似乎和QT的结合不是很容易,不知高手们有没有说法?
离线tingxx

只看该作者 4楼 发表于: 2008-04-09
要跨平台?
那你就在编译的时候根据平台不同采用不同的解决方法吧
win下用外部的dll
linux下可以使用xine lib
QT自带的文档真是个好东西
一定要好好看呀
离线shangyang
只看该作者 5楼 发表于: 2008-04-10
多谢楼上,我现在就是想用Visual Studio 2005 调用ffmpeg 的动态库来实现.avi 文件的解码。

我用的是ffmpeg full sdk v3.0 (里边有编译好的 .dll) ,不过以前做过这类的东西,到现在还没搞好。

那位有经验,多谢提供。
离线shangyang
只看该作者 6楼 发表于: 2008-04-10
简单点说:

我想播放一个Video(.avi, .mpeg)在一个QWidget (playerWidget)中,然后把这个QWidget(playerWidget) 放到一个QMainWindow(myMainWindow)里。

外边的myMainWindow基本写好,现在需要的就是怎么完成playerWidget. 其中里边的.avi 和 .mpeg 文件用ffmpeg 来解码。

谁能提供个例子吗?

多谢。
离线tingxx

只看该作者 7楼 发表于: 2008-04-10
我试验过一个用QT调动avicap.dll来获取摄像头的
不过好像和你的没有关系,呵呵
http://tingxx.ycool.com/post.2028303.html
QT自带的文档真是个好东西
一定要好好看呀
离线shangyang
只看该作者 8楼 发表于: 2008-04-12
多谢tingxx,还有thetwo.

tingxx我去你的主页看了,对我非常有帮助。都是要调用外部.dll 来实现附加功能。
我的是ffmpeg的动态库,你的是avicap.dll。 我现在遇到的问题是,不能正确resolve动态库里的函数。

按照你的例子”使用QLibrary来调动DLL“。
我是着调用ffmpeg的动态库。
第一步查看是否能成功load动态库:
环境: WindowsXp, Visual Stadio 2005, Qt4.3.4 (open source)

ffmpeg 库文件: include {*.h 文件} 
                        Libs {avcodec.dll, avformat.dll, avuitl.dll, avcodec.lib, avformat.lib,avuitl.lib }

ffmpeg 下载地址

avcodec.dll, avformat.dll, avuitl.dll 和 qtcn.cpp都放在同一个文件夹下。
(avcodec.lib, avformat.lib,avuitl.lib)应该用不到吧?

qtcn.cpp :


  1. #include <QApplication>
  2. #include <QLabel>
  3. #include <QLibrary>
  4. int main (int argc, char *argv[])
  5. {
  6.       QApplication app(argc, argv);
  7.       QLibrary myLib("avcodec"); 
  8. if(myLib.load())
  9.           {
  10.        QLabel *label = new QLabel("Hello Qt");
  11.        label->show();       
  12.     }
  13. return app.exec();
  14.    
  15. }


qtcn.cpp :可以正常编译,并运行处结果“Hello Qt”,load成功.
另: 如果只把 avcodec.dll和 qtcn.cpp都放在同一个文件夹下,编译成功,但不能成功运行出结果“Hello Qt”.


qtcn.cpp : 做修改为qt.cpp :, 用来查看是否能调用 avcodec.dll 里边的函数(void av_free(void *ptr))


  1. #include <QApplication>
  2. #include <QLabel>
  3. #include <QLibrary>
  4. int main (int argc, char *argv[])
  5. {
  6.       QApplication app(argc, argv);
  7.       QLibrary myLib("avcodec"); 
  8.         typedef void (*MyPrototype)(void *ptr);
  9.         MyPrototype myFunction = (MyPrototype) myLib.resolve("av_free");
  10. if (myFunction)
  11.          {
  12.         QLabel *label = new QLabel("Hello Qt");
  13.         label->show();
  14.            
  15.        }
  16. return app.exec();
  17.        
  18. }


qt.cpp : 编译无错误,但是运行不出去结果“Hello Qt”,我想函数:av_free没有能成功resolve。

问: 怎么才能正确的调用ffmpeg动态库里的函数,从而能做个媒体播放器。

另: QLibrary myLib("avcodec"); //因为我不清楚av_free是否一定是avcodec.dll里的函数
所以我用avformat.dll, avuitl.dll分别试了,结果和avcodec.dll一样。

初学者,希望大家多帮助,谢谢。
离线shangyang
只看该作者 9楼 发表于: 2008-04-12
按照你的程序稍作修改,写的一个测试是否能成功调用avicap.dll 里函数:capCreateCaptureWindowA 的程序。
编译成功,并能成功输出结果”Hellp Qt“.
所以我想是不是我的ffmpeg 的 .dll 库的问题,或是我落下什么东西没做。

  1. #include <QApplication>
  2. #include <QLabel>
  3. #include <QLibrary>
  4. int main (int argc, char *argv[])
  5. {
  6.     QApplication app(argc, argv);
  7.     QLibrary myLib("avicap");
  8.       if(myLib.load())
  9.       {
  10.         typedef HWND(* capCreateFunc)(char *lpszWindowName,long int swStyle,
  11.                 int x,int y,int nWidth,int nHeight,HWND parentWin,int nID);
  12.         capCreateFunc capCreate=(capCreateFunc)myLib.resolve("capCreateCaptureWindowA");
  13.         if(capCreate)
  14.            {
  15.            
  16.                QLabel *label = new QLabel("Hello Qt");
  17.                label->show();
  18.      }
  19.     }
  20. return app.exec();
  21. }
离线tingxx

只看该作者 10楼 发表于: 2008-04-12
说一下,如果你只有dll的话,没有h文件,你只能使用QLibrary来调用
但是你用的那个sdk好像提供h文件了吧?如果有h文件,那就不用QLibrary了,直接在qmake文件中加入
INCLUDE PATH和LIBS
在编译时链接dll,免得在运行地加载dll来resolv
QT自带的文档真是个好东西
一定要好好看呀
离线shangyang
只看该作者 11楼 发表于: 2008-04-12
对我的ffmpeg动态库包含:
include文件夹(里边是*.h文件)D:\qtcn\include
Libs文件夹(里边是*.lib 和 *.dll文件)D:\qtcn\Libs
qtcn.cpp存放在:D:\qtcn

你说的 “qmake文件”,是指 *.pro 文件吧?
原qtcn.pro文件的内容:
-----------------
######################################################################
# Automatically generated by qmake (2.01a) ??? ?? 10 10:20:51 2008
######################################################################

TEMPLATE = app
TARGET =
DEPENDPATH += .
INCLUDEPATH += .

# Input
SOURCES += qtcn.cpp

-----------------------------------


--------------------------------

修改后的qtcn.pro文件的内容:
-----------------
######################################################################
# Automatically generated by qmake (2.01a) ??? ?? 10 10:20:51 2008
######################################################################

TEMPLATE = app
TARGET =
DEPENDPATH +=./Libs
INCLUDEPATH += ./include

# Input
SOURCES += qtcn.cpp

-----------------------------------
是这样修改吗?

你能帮我举个不用QLibiray 调用ffmpeg库里函数的例子吗?

还有我可以想调用avicap.dll 那样调用ffmpeg库里边的函数吗?
[ 此贴被shangyang在2008-04-12 20:44重新编辑 ]
离线creatory
只看该作者 12楼 发表于: 2008-04-13
哪位牛人能开个源看看具体如何做?
努力学习QT
离线hdavs
只看该作者 13楼 发表于: 2008-04-22
FFMpeg不是这么用的。呵呵。
首先 avcodec.dll avformat.dll avutil.dll是编译好的运行库。运行的时候需要的。avcodec.lib avformat.lib avutil.lib 是用来链接.dll的。
其次 要打开一个视频文件,需要做如下操作
1.av_register_all 初始化ffmpeg
2.AVFormatContext *pFormatCtx;
const char *filename="myvideo.mpg"; // 打开视频文件
if(av_open_input_file(&pFormatCtx, filename, NULL, 0, NULL)!=0)
...
3.int i, videoStream; AVCodecContext *pCodecCtx; // 寻找第一个视频流
videoStream=-1;
for(i=0; i<pFormatCtx->nb_streams; i++)
4  if(pFormatCtx->streams->codec.codec_type==CODEC_TYPE_VIDEO)
  {
      videoStream=i;
      break;
  }
5 // 得到视频流编码上下文的指针 pCodecCtx=&pFormatCtx->streams[videoStream]->codec;

好了,我们已经得到了一个指向视频流的称之为上下文的指针。但是我们仍然需要找到真正的编码器打开它。

AVCodec *pCodec;

// 寻找视频流的解码器 pCodec=avcodec_find_decoder(pCodecCtx->codec_id); if(pCodec==NULL)

去看看ffmpeg吧
http://www.ffmpeg.com.cn/index.php/Ffmpeg%E5%BF%AB%E9%80%9F%E5%BA%94%E7%94%A8%E5%BC%80%E5%8F%91
离线lbwave
只看该作者 14楼 发表于: 2010-11-02
快速回复
限100 字节
 
上一个 下一个