• 17508阅读
  • 7回复

试用qt-gstreamer(2) [复制链接]

上一主题 下一主题
离线cycloneii
 

只看楼主 倒序阅读 楼主  发表于: 2013-01-30
— 本帖被 XChinux 设置为精华(2013-07-12) —
        一年多以前写过《使用qt-gstreamer(1)》,惭愧当时对qt和gstreamer的理解不太深入,所以帖子有不少错误,后来因为工作原因,放弃了这方面的尝试。直到最近,因为在做一个视频会议终端软件,才不得不又捡起来,积累了一点心得,在这里分享给大家。
       在编译qtgstreamer的时候,我很奇怪编译出来的player例子非要打开一个命令行窗口,而且qml插件都不能正常运行,其实,这是因为cmake的原因。在编译player的时候,链接了windows的console子系统,类似于在pro文件里面加上CONFIG+=console,所以会先打开一个命令行窗口,再显示GUI,使用qmake就不存在这个问题了。qml插件总是在运行时报告插件编译的类型是windows debug版本,这个也是cmake的问题,我使用qtcreator创建了一个qml插件工程。然后将qtgstreamer里面代码段复制过来,结果编译出来的插件是能够运行。估计是qtgstreamer 0.10.2的cmake工程文件还存在bug吧。
      因为是在做视频会议终端软件,视频方面不外乎以下几点1)camera设备枚举、设备属性查询和设置、视频预览、非压缩数据获取;2)视频编码控制,编码码流RTP打包、发送;3)RTP包解析,解码,解压后的图片处理、混合、叠加字幕、剪切、显示
      我知道的Qt的多媒体库,主要有QtGStreamer、vlc-qt、qt-mobility中的qtmulimediakit和Qt5的multimedia模块。首先就视频采集这块来讲,无疑都能够满足需求,但是QtGStreamer的dshow封装还不太完善,获取图像没有问题,但是不能像v4l2src那样能够调节亮度、色度、对比度等图像参数,需要在pipeline中插入软件处理阶段来完成,问题是比较画质,后端软件处理肯定不如直接修改硬件的采集参数来得好,而且CPU占用率会高一点点。vlc-qt的控制功能但是比较完善,但是文档不如gstreamer完善,限于开发时间没有做进一步的了解。qtmultimediakit、qt5 multimedia模块和QtGStreamer有同样的问题,我没有找到修改camera参数的地方,也找不到这方便的例子。
    视频编码、RTP打包方面,QtGStreamer和vlc-qt都能够比较好的做到,qtmultimediakit、qt5 multimedia模块这方面要差一点,视频编码可以修改的参数较少,而且没有RTP打包功能,需要再用其他库完成。
    视频解码,qtmultimediakit、qt5 multimedia模块这方面还是要差不少,主要是它只接受文件和网络源,问题是在视频通信软件中,由于信令和NAT需求,几乎不可能由qt来处理rtp流,一般是应用程序通过通信协议获得了压缩数据保存在内存之后再来解码、显示。QtGStreamer能通过Appsrc和appsink来处理内存数据,vlc-qt似乎也可以(因为vlc强大的媒体播放功能,所以我猜可以,可惜做项目不能同时深入学习两种库)。
    视频显示方面,Qt-mobility的multimediakit无法渲染内存数据,qt5做了改进,如果是qml程序,可以简单的通过videoout元素来完成视频显示,在qtmultimedia 5.0 video overview文档中描述了如何通过QAbstractVideoSurface类的帮助显示内存中封装为QVideoFrame的数据。当然用Qpainter的drawImage能够非常简单的实现内存数据显示,但是考虑到颜色空间转换(一般视频解码后是YUV空间的,而GUi需要RGB空间的数据)、缩放、软件绘图的开销太大,对于1080P 30fps来说几乎不能接受。QtGStreamer可以通过dshowvideosink或者xvimagesink之类的overlay在某个窗口,或者用qtgstreamerqml插件,通过opengl加速输出合适大小和颜色格式的图片到内存,然后在videoitem元素上显示出来。vlc-qt也提供了视频播放qml插件,能以文件或者网络流(比如RTSP或者rtp流)作为源,但是能否用于显示内存数据还未知。
        因此,如果配合ptlib/opal协议栈,它自带了ffmpeg/x264的音视频编解码插件,还有第三方提供的intel ipp音视频编解码插件,有封装了dshow和v4l2的视频采集插件,提供了采集控制接口,可惜视频显示插件只有SDL和VFW的,有点弱,SDL 1.2只能有一个显示窗口,1.3或者2.0的据说能够开多个,但是还没有release版本的,VFW的似乎只能另外开独立的一个视频显示窗口,无法显示在制定控件上,用qtgstreamer或者qt5开发qml的程序应该都很合适,可惜我开发的时候qt5还未release,基于qt4开发qml界面的视频会议终端似乎只能选择qtgstreamer了,当然写一个封装了dshow显示接口的qml插件似乎更轻量级,但是对于之前都是搞嵌入式linux开发的我来说,qtgstreamer远远比dshow更好懂好用。
        啰嗦了半天,还没有进入正题,这样干巴巴的流水账帖子我都不好意思再写下去了。呵呵,下一篇里面一定多写点有技术含量的。
离线XChinux

只看该作者 1楼 发表于: 2013-01-31
楼主辛苦啊。
二笔 openSUSE Vim N9 BB10 XChinux@163.com 网易博客 腾讯微博
承接C++/Qt、Qt UI界面、PHP及预算报销系统开发业务
离线whquan123
只看该作者 2楼 发表于: 2013-05-03
楼主  你好  请问在windows下怎么安装qtgstreamer
离线彩阳

只看该作者 3楼 发表于: 2013-05-03
有不依赖dshow来实现windows下视频渲染的方案吗?
上海Qt开发联盟,热忱地欢迎你的加入!
离线cycloneii

只看该作者 4楼 发表于: 2013-07-09
引用第3楼彩阳于2013-05-03 20:57发表的  :
有不依赖dshow来实现windows下视频渲染的方案吗?

有的,比如qtgstreamer的qml插件和vlc-qt的qml插件都是用opengl绘图的。
gstreamer本身也有opengl插件。类似于qt demo里面的2D painter例子
离线cycloneii

只看该作者 5楼 发表于: 2013-07-26
引用第4楼cycloneii于2013-07-09 09:24发表的  :
有的,比如qtgstreamer的qml插件和vlc-qt的qml插件都是用opengl绘图的。
gstreamer本身也有opengl插件。类似于qt demo里面的2D painter例子


最近发现了一个QtAv库中,它是ffmpeg的qt封装,似乎只实现了解码功能。实现了4种windows下的绘图方式,Widget、dshow、opengl和GDI+
离线hare1102

只看该作者 6楼 发表于: 2013-10-21
楼主,想请教下linux下用QtGStreamer来取得动画缩略图的大致思路,或者是动画的第一帧画像如何提取出来。
QtGStreamer虽然配了,但是没接触过真不知道如何开始。。。
离线csklw_6931
只看该作者 7楼 发表于: 2013-10-22
楼主请问在linux上用Qt5的Media Player Example运行起来为什么不能播视频呢?只能播mp3.
但是我用系统安装的其他播放器是可以看各种视频的,比如mkv,mp4。系统我是用的centos6.3。
想学习……
快速回复
限100 字节
 
上一个 下一个