查看完整版本: [-- QT编写的RTSP播放器,各QT版本可完整编译运行 --]

QTCN开发网 -> Qt 作品展 -> QT编写的RTSP播放器,各QT版本可完整编译运行 [打印本页] 登录 -> 注册 -> 回复主题 -> 发表主题

<<   1   2  >>  Pages: ( 2 total )

liudianwu 2014-05-02 10:29

QT编写的RTSP播放器,各QT版本可完整编译运行

最近项目用到播放RTSP视频流,研究了一阵子,初步写了个demo,放出源码,QT实现RTSP视频流播放这块例子比较少,而且大部分不可用,不是缺lib库就是缺运行库等,就算几个可用的VLC,QTAV,播放视频的速度及画面呈现质量实在不敢恭维,特意编写了此DEMO,全部放出代码以供学习。
qt+mingw32+windows+ffmpeg+rtsp保证编译可用
说明:
1:此示例只是用来显示视频流,并没有处理存储视频及回放视频功能.
2:在打开项目后务必将构建里面的影子构建(Shadow build)取消.
3:实时显示视频,视频响应速度比VLC,QTAV等播放器快很多倍.
4:精简代码,在windows下是可以完整编译通过并运行的.linux下要将对应ffmpeg库文件替换.
5:支持三通道同步显示一个视频流,可以单击截图按钮截图放在最后一个通道.
6: 支持单个通道双击最大化显示.
7:代码处理并不够完整,还有很多需要优化的地方.
8:代码注释不够详尽,但是简单易懂.
9:没有使用定时器,采用信号槽机制实现视频流播放.
10:处理全部放在QFFmpge类中,包括注释也才到100行代码左右.
11:使用示例简单方便.自带了一个珍藏多年的黑灰色主题样式表,锦上添花!
12:只用于播放RTSP视频流,不能用于播放本地文件。


liudianwu 2014-05-02 10:35
[attachment=12013][attachment=12014]
这里限制了上传文件大小,只好分开两个上传,解压到同一个目录即可.
下载完后将RTSPTool.z01.zip改为RTSPTool.z01,然后右键选择解压.貌似只能用好压解压.
2014-5-4更新后截图
[attachment=12021]

zjmmlab 2014-05-02 11:25
有没有用VC编译的版本,机器上没装Mingw32,试不了

sinoman 2014-05-03 09:05

枫界易城 2014-05-03 09:40
感谢楼主分享!

linwb 2014-05-03 20:35
感谢楼主分享

likezyp 2014-05-03 20:44
这个很赞

wangjiangliu 2014-05-03 23:20
不知道怎么回事 g++: error: ffmpeg/lib/libavfilter.dll.a: No such file or directory

jiwazii 2014-05-04 14:09
楼主您好,我有个问题,我自己也用qt做了一个播放器,但是放视频的时候,前几帧是绿屏的,后来就好正常了,这是什么情况。视频格式是mp4的。

liudianwu 2014-05-04 15:23
wangjiangliu:不知道怎么回事 g++: error: ffmpeg/lib/libavfilter.dll.a: No such file or directory  (2014-05-03 23:20) 

在打开项目后务必将构建里面的影子构建(Shadow build)取消.

liuyuanan 2014-05-04 15:25
楼主分享的东西永远都是那么高端大气!!

wangjiangliu 2014-05-04 22:28
谢谢啦,很好的东西  但是我运行 点打开时候进程就死了  还没仔细分析

内容来自[短消息]

foxgod 2014-05-05 09:33
liudianwu:[图片] 2014-5-4更新过
这里限制了上传文件大小,只好分开两个上传,解压到同一个目录即可.
下载完后将RTSPTool.z01.zip改为RTSPTool.z01,然后右键选择解压.
 (2014-05-02 10:35) 

下载后,用winrar无法解压呀,怎么回事

liudianwu 2014-05-05 10:29
foxgod:下载后,用winrar无法解压呀,怎么回事 (2014-05-05 09:33) 

用好压解压,我电脑上用的是好压进行分开压缩的

xuwei17385 2014-05-06 09:46
jiwazii:楼主您好,我有个问题,我自己也用qt做了一个播放器,但是放视频的时候,前几帧是绿屏的,后来就好正常了,这是什么情况。视频格式是mp4的。 (2014-05-04 14:09)

嘿嘿,你的解码输出缓冲区全是0,视频输出基本上都是YUV数据,全0就是绿色(如果是rgb当然是黑的),刚开始几帧可能并没有解码出图像,然后你就拿全0的YUV去显示了,就一片绿了,你初始化视频输出内存的时候初始化填充下YUV数据就好。
/**
*  @brief     I420图像类
*  @details   I420图像存储,初始化,更新类
*  @author    xuwei
*  @version   1.0.x
*  @date      2011-2012
*/
#ifndef AVENGINE_COMMOM_VIDEO_FRAME_I420_H_
#define AVENGINE_COMMOM_VIDEO_FRAME_I420_H_

namespace utils {
/**
* @class   VideoFrameI420 video_frame_i420.h 
* @brief I420图像类
*/
class VideoFrameI420 {
public:
  VideoFrameI420(long width, long height)
    : image_width_(width)
    , image_height_(height)
    , image_(NULL)
    , image_size_(0)
    , image_pts_(0)
    , plane_y_(NULL)
    , plane_u_(NULL)
    , plane_v_(NULL)
    , has_video_set_(false)
      , new_video_stream_(true){
  }
  ~VideoFrameI420(void) {
    if (image_) {
      free(image_);
    }
  }
  /*分配图像空间*/
  long AllocMemory() {
    if (0 >= image_width_ || 0 >= image_height_)
    {
      /*kErrorCommonInvalidParameter*/
      return 0x90500001;
    }
    /*确保偶数宽高的内存分配*/
    long width_adjust = image_width_ % 2 ? image_width_ + 1 : image_width_;
    long height_adjust = image_height_ % 2 ? image_height_ + 1 : image_height_;
    image_size_ = width_adjust * height_adjust * 3 / 2;

    if (NULL != image_) {
      free(image_);
    }

    try {
      /*为SSE,MMX指令集多分配32字节*/
      image_ = reinterpret_cast<unsigned char*>(malloc(image_size_ + 32));
    }
    catch (...) {
      image_ = NULL;
      /*kErrorCommonCreateObjectException*/
      return 0x90500005;
    }

    /*获取三个平面的位置*/
    long size_y  = image_width_ * image_height_;
    long size_uv = size_y / 4;
    plane_y_ = image_;
    plane_u_ = plane_y_ + size_y;
    plane_v_ = plane_u_ + size_uv;
    has_video_set_ = false;
    /*初始化图像,使其为黑色画面*/
    memset(plane_y_, 0, size_y);
    memset(plane_u_, 128, size_y / 2);
    return 0;
  }
  /*更新图像*/
  long Updata(const unsigned char* frame) {
    if (NULL == image_)
    {
      /*kErrorCommonNeverInitialize*/
      return 0x90500004;
    }
    if (frame) {
      /*非空为复制图像*/
      memcpy(image_, frame, image_size_);
    }
    else {
      /*为空为清空图像*/
      long size_y  = image_width_ * image_height_;
      memset(plane_y_, 0, size_y);
      memset(plane_u_, 128, size_y / 2);
    }
    has_video_set_ = true;
    return 0;
  }
public:
  /*图像宽*/
  long            image_width_;
  /*图像高*/
  long            image_height_;
  /*图像大小*/
  long            image_size_;
  /*呈现时间*/
  __int64        image_pts_;
  /*图像数据*/
  unsigned char* image_;
  /*Y平面*/
  unsigned char* plane_y_;
  /*U平面*/
  unsigned char* plane_u_;
  /*V平面*/
  unsigned char* plane_v_;
  /*图像被设置过*/
  bool           has_video_set_;
  /*新画面标识*/
  bool                     new_video_stream_;
};
}

#endif AVENGINE_COMMOM_VIDEO_FRAME_I420_H_

foxgod 2014-05-07 12:36
liudianwu:[图片]
这里限制了上传文件大小,只好分开两个上传,解压到同一个目录即可.
下载完后将RTSPTool.z01.zip改为RTSPTool.z01,然后右键选择解压.貌似只能用好压解压.
2014-5-4更新后截图
[图片]
....... (2014-05-02 10:35) 

提个意见,没有声音,播放太快,没考虑到帧率

mxcai2005 2014-05-07 14:20
mark    

foxgod 2014-05-07 16:00
为啥我按照你的程序写,一写av_register_all()。程序就起不来了呢?

foxgod 2014-05-07 16:03
liudianwu:
用好压解压,我电脑上用的是好压进行分开压缩的

为啥我按照你的代码,想改写下,已加入ffmpeg的代码,程序就起不来了呢[attachment=12027]

liudianwu 2014-05-07 17:37
foxgod:为啥我按照你的代码,想改写下,已加入ffmpeg的代码,程序就起不来了呢[图片] (2014-05-07 16:03) 

pro文件这样写
INCLUDEPATH +=  ffmpeg/include
LIBS += ffmpeg/lib/libavcodec.dll.a \
        ffmpeg/lib/libavfilter.dll.a \
        ffmpeg/lib/libavformat.dll.a \
        ffmpeg/lib/libswscale.dll.a \
        ffmpeg/lib/libavutil.dll.a \

选项里面影子构建不要选择

jiwazii 2014-05-07 17:59
xuwei17385:嘿嘿,你的解码输出缓冲区全是0,视频输出基本上都是YUV数据,全0就是绿色(如果是rgb当然是黑的),刚开始几帧可能并没有解码出图像,然后你就拿全0的YUV去显示了,就一片绿了,你初始化视频输出内存的时候初始化填充下YUV数据就好。
/**
*  @brief    .. (2014-05-06 09:46) 

不好意思这两天比较忙啊,现在才回你。谢谢你回答了这个问题。但是我朋友是拿 qt5.2 做的,没有 用 phonon 库。如果是在qt5.2  做的话,该怎么解决呢?

foxgod 2014-05-08 16:44
不知道为什么,我带界面的代码,不写av_register_all();,程序能起来,一些av_register_all();程序就异常退出,这是静态库没加载进来造成的吗??

czy455475537 2014-05-08 19:12
wangjiangliu:谢谢啦,很好的东西[表情]  但是我运行 点打开时候进程就死了  还没仔细分析
内容来自[短消息]  (2014-05-04 22:28) 

我也是呢,打开进程就死了

wangjiangliu 2014-05-11 16:04
czy455475537:我也是呢,打开进程就死了 (2014-05-08 19:12) 

rtsp://218.204.223.237:554/live/1/66251FC11353191F/e7ooqwcfbqjoo80j.sdp
你用这个地址试下 必须要有效的rtsp地址

liudianwu 2014-05-11 19:33
wangjiangliu:rtsp://218.204.223.237:554/live/1/66251FC11353191F/e7ooqwcfbqjoo80j.sdp
你用这个地址试下 必须要有效的rtsp地址 (2014-05-11 16:04) 

这个可以说是很多例子中的例子了,很好很强大!!!

czy455475537 2014-05-11 20:16
太神奇了,有点不会用呢,一共4个界面,只有3个界面能显示吗,能有声音吗

liudianwu 2014-05-12 11:26
czy455475537:太神奇了,有点不会用呢,一共4个界面,只有3个界面能显示吗,能有声音吗 (2014-05-11 20:16) 

其实暴风影音、QQ影音等各大播放器及大部分视频格式转换工具都使用了ffmpeg!

wangjiangliu 2014-05-12 16:18
liudianwu:其实暴风影音、QQ影音等各大播放器及大部分视频格式转换工具都使用了ffmpeg! (2014-05-12 11:26) 

基于这个例子都可拿来做个本科毕设了,当时没选这个题目,过阵子好好研究研究

mxcai2005 2014-05-14 10:58
mark            

gph1991 2014-05-15 09:07
大神,可以交我在linux下跑多媒体播放机吗?采用phonon框架

自强不吸 2014-05-15 11:21
永远这么高端

xuwei17385 2014-05-15 23:23
jiwazii:不好意思这两天比较忙啊,现在才回你。谢谢你回答了这个问题。但是我朋友是拿 qt5.2 做的,没有 用 phonon 库。如果是在qt5.2  做的话,该怎么解决呢?
 (2014-05-07 17:59) 

不需要,  我贴的YUV图像类没有用QT,单纯的C++代码,把解码输出的内存区域初始化为黑色,避免起始几包数据没有解码出图像渲染成绿色就好,Y平面式亮度 初始化为0,UV两个平面是蓝色和红色色差,将其初始化为128,看看我贴的代码就OK了,很简单

foxgod 2014-05-16 08:47
czy455475537:太神奇了,有点不会用呢,一共4个界面,只有3个界面能显示吗,能有声音吗 (2014-05-11 20:16) 

你点运行可以显示界面吗,我点运行就死了,把静态库放在exe一起的目录下,还是起不来

czy455475537 2014-05-16 09:16
foxgod:你点运行可以显示界面吗,我点运行就死了,把静态库放在exe一起的目录下,还是起不来 (2014-05-16 08:47) 

我用的是qt4.8.1编译的,如果编译通过了,程序界面起来了
:rtsp://218.204.223.237:554/live/1/66251FC11353191F/e7ooqwcfbqjoo80j.sdp
你用这个地址试下 必须要有效的rtsp地址

lch922 2014-05-16 11:15
绘图那边,效率跟得上吗?可以试试用directShow。或者重载paintEvent,在里面绘,效率应该比        
QPixmap::fromImage(image.scaled(tempWidth,tempHeight));
        setPixmap(pix);
高。

wuquan-1230 2014-06-01 20:17
容易卡,不过还要谢谢楼主分享!

alexmayer 2014-06-10 20:01
liudianwu:[图片]
这里限制了上传文件大小,只好分开两个上传,解压到同一个目录即可.
下载完后将RTSPTool.z01.zip改为RTSPTool.z01,然后右键选择解压.貌似只能用好压解压.
2014-5-4更新后截图
[图片]
....... (2014-05-02 10:35) 

链接失效了?怎么下载不了?

daybreakboy 2014-06-27 16:10
我的电脑运行不起来,说什么C1083:无法打开包含文件:"inttypes.h":No such file or directory.   说帮帮忙解决一下。谢谢。

liudianwu 2014-06-27 16:49
daybreakboy:我的电脑运行不起来,说什么C1083:无法打开包含文件:"inttypes.h":No such file or directory.   说帮帮忙解决一下。谢谢。 (2014-06-27 16:10) 

你用的什么编译器?要用MINGW编译器

liudianwu 2014-06-27 16:50
daybreakboy:我的电脑运行不起来,说什么C1083:无法打开包含文件:"inttypes.h":No such file or directory.   说帮帮忙解决一下。谢谢。 (2014-06-27 16:10) 

VC编译器貌似不支持C99标准

daybreakboy 2014-06-27 17:21
liudianwu:VC编译器貌似不支持C99标准 (2014-06-27 16:50) 

我用的是QT+VS2012.

daybreakboy 2014-06-27 18:30
g++: error: ffmpeg/lib/libavutil.dll.a: No such file or directory  这个是怎么回事? 谢谢。

liudianwu 2014-06-28 14:20
daybreakboy:我用的是QT+VS2012.  (2014-06-27 17:21) 

兄弟,QT+VS2012就是用的VC编译器,你以为VC6.0才使用VC编译器?

鱼肉烧 2014-08-08 10:20
为什么要取消影子构建,这是什么原理啊?

helong0058 2014-08-25 18:16
liudianwu:在打开项目后务必将构建里面的影子构建(Shadow build)取消. (2014-05-04 15:23) 

楼主 我没找到影子构建的选项啊!

wayblue 2014-08-27 15:35
楼主你好

        我在编译的时候出现 无法解析的外部符号  都是 ffmpeg的接口, 如何解决?

llpin 2014-10-15 20:59
非常刚写楼主

yanhanfu 2014-10-31 10:56
用FFMPEG捕获一般的视频流可以,但如果是加了认证的视频流就得用LIVE555。LIVE555中的testrtspclient DEMO基本是用回调函数来实现的视频获取,这样的结构不太好用QT来实现,不知liudianwu兄是否有好的建议?

liudianwu 2014-10-31 12:56
yanhanfu:
用FFMPEG捕获一般的视频流可以,但如果是加了认证的视频流就得用LIVE555。LIVE555中的testrtspclient DEMO基本是用回调函数来实现的视频获取,这样的结构不太好用QT来实现,不知liudianwu兄是否有好的建议?

我现在换成了VLC,感觉还不错!
[attachment=12796]

duxiaodong 2014-10-31 16:21
再ubuntu上面编译了ffmpeg,程序可以正常运行,但是解析的视频数据,不是很清晰,虽说内存占用不大,但是cpu占到接近%50,还有就是好像没有声音。


查看完整版本: [-- QT编写的RTSP播放器,各QT版本可完整编译运行 --] [-- top --]



Powered by phpwind v8.7 Code ©2003-2011 phpwind
Gzip disabled