• 49863阅读
  • 95回复

QT编写的RTSP播放器,各QT版本可完整编译运行 [复制链接]

上一主题 下一主题
离线liudianwu
 

只看楼主 倒序阅读 楼主  发表于: 2014-05-02
— 本帖被 XChinux 执行加亮操作(2016-05-30) —
最近项目用到播放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视频流,不能用于播放本地文件。

25条评分好评度+6贡献值+6金钱+7威望+6
wilbur 好评度 +1 - 2020-10-27
wilbur 贡献值 +1 - 2020-10-27
wilbur 威望 +1 - 2020-10-27
wilbur 金钱 +1 - 2020-10-27
hzw123 好评度 +1 - 2020-09-16
hzw123 贡献值 +1 - 2020-09-16
hzw123 威望 +1 - 2020-09-16
hzw123 金钱 +1 - 2020-09-16
leidadian 好评度 +1 - 2020-09-14
leidadian 贡献值 +1 - 2020-09-14
专业各种自定义控件编写+UI定制+输入法定制+视频监控+工业控制+仪器仪表+嵌入式linux+各种串口网络通信,童叟无欺,量大从优,欢迎咨询购买定制!你正好需要,我正好专业!QQ:517216493 微信:feiyangqingyun Email:feiyangqingyun@163.com
群号:853086607(Qt交流大会,雨田哥群,不定期上传作品,解答作品中相关问题!) 312125701(QtQML多多指教群) 46679801(Qt开发技术交流群-5000人大群)
离线liudianwu

只看该作者 1楼 发表于: 2014-05-02
RTSPTool.z01.zip (6144 K) 下载次数:3591 RTSPTool.zip (5715 K) 下载次数:3015
这里限制了上传文件大小,只好分开两个上传,解压到同一个目录即可.
下载完后将RTSPTool.z01.zip改为RTSPTool.z01,然后右键选择解压.貌似只能用好压解压.
2014-5-4更新后截图

1条评分好评度+1
zqw3156 好评度 +1 - 2019-06-30
专业各种自定义控件编写+UI定制+输入法定制+视频监控+工业控制+仪器仪表+嵌入式linux+各种串口网络通信,童叟无欺,量大从优,欢迎咨询购买定制!你正好需要,我正好专业!QQ:517216493 微信:feiyangqingyun Email:feiyangqingyun@163.com
群号:853086607(Qt交流大会,雨田哥群,不定期上传作品,解答作品中相关问题!) 312125701(QtQML多多指教群) 46679801(Qt开发技术交流群-5000人大群)
离线zjmmlab

只看该作者 2楼 发表于: 2014-05-02
有没有用VC编译的版本,机器上没装Mingw32,试不了
离线sinoman

只看该作者 3楼 发表于: 2014-05-03
我学习,我快乐
离线枫界易城

只看该作者 4楼 发表于: 2014-05-03
感谢楼主分享!
离线linwb

只看该作者 5楼 发表于: 2014-05-03
感谢楼主分享
离线likezyp

只看该作者 6楼 发表于: 2014-05-03
这个很赞
离线wangjiangliu

只看该作者 7楼 发表于: 2014-05-03
不知道怎么回事 g++: error: ffmpeg/lib/libavfilter.dll.a: No such file or directory
离线jiwazii

只看该作者 8楼 发表于: 2014-05-04
楼主您好,我有个问题,我自己也用qt做了一个播放器,但是放视频的时候,前几帧是绿屏的,后来就好正常了,这是什么情况。视频格式是mp4的。
离线liudianwu

只看该作者 9楼 发表于: 2014-05-04
回 wangjiangliu 的帖子
wangjiangliu:不知道怎么回事 g++: error: ffmpeg/lib/libavfilter.dll.a: No such file or directory  (2014-05-03 23:20) 

在打开项目后务必将构建里面的影子构建(Shadow build)取消.
专业各种自定义控件编写+UI定制+输入法定制+视频监控+工业控制+仪器仪表+嵌入式linux+各种串口网络通信,童叟无欺,量大从优,欢迎咨询购买定制!你正好需要,我正好专业!QQ:517216493 微信:feiyangqingyun Email:feiyangqingyun@163.com
群号:853086607(Qt交流大会,雨田哥群,不定期上传作品,解答作品中相关问题!) 312125701(QtQML多多指教群) 46679801(Qt开发技术交流群-5000人大群)
离线liuyuanan

只看该作者 10楼 发表于: 2014-05-04
楼主分享的东西永远都是那么高端大气!!
离线wangjiangliu

只看该作者 11楼 发表于: 2014-05-04
谢谢啦,很好的东西  但是我运行 点打开时候进程就死了  还没仔细分析

内容来自[短消息]
离线foxgod

只看该作者 12楼 发表于: 2014-05-05
回 liudianwu 的帖子
liudianwu:[图片] 2014-5-4更新过
这里限制了上传文件大小,只好分开两个上传,解压到同一个目录即可.
下载完后将RTSPTool.z01.zip改为RTSPTool.z01,然后右键选择解压.
 (2014-05-02 10:35) 

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

只看该作者 13楼 发表于: 2014-05-05
回 foxgod 的帖子
foxgod:下载后,用winrar无法解压呀,怎么回事 (2014-05-05 09:33) 

用好压解压,我电脑上用的是好压进行分开压缩的
专业各种自定义控件编写+UI定制+输入法定制+视频监控+工业控制+仪器仪表+嵌入式linux+各种串口网络通信,童叟无欺,量大从优,欢迎咨询购买定制!你正好需要,我正好专业!QQ:517216493 微信:feiyangqingyun Email:feiyangqingyun@163.com
群号:853086607(Qt交流大会,雨田哥群,不定期上传作品,解答作品中相关问题!) 312125701(QtQML多多指教群) 46679801(Qt开发技术交流群-5000人大群)
离线xuwei17385

只看该作者 14楼 发表于: 2014-05-06
回 jiwazii 的帖子
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_
本帖提到的人: @class @copyright
离线foxgod

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

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

只看该作者 16楼 发表于: 2014-05-07
mark    
离线foxgod

只看该作者 17楼 发表于: 2014-05-07
为啥我按照你的程序写,一写av_register_all()。程序就起不来了呢?
离线foxgod

只看该作者 18楼 发表于: 2014-05-07
回 liudianwu 的帖子
liudianwu:
用好压解压,我电脑上用的是好压进行分开压缩的

为啥我按照你的代码,想改写下,已加入ffmpeg的代码,程序就起不来了呢 Litter-qi.rar (775 K) 下载次数:50
离线liudianwu

只看该作者 19楼 发表于: 2014-05-07
回 foxgod 的帖子
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 \

选项里面影子构建不要选择
专业各种自定义控件编写+UI定制+输入法定制+视频监控+工业控制+仪器仪表+嵌入式linux+各种串口网络通信,童叟无欺,量大从优,欢迎咨询购买定制!你正好需要,我正好专业!QQ:517216493 微信:feiyangqingyun Email:feiyangqingyun@163.com
群号:853086607(Qt交流大会,雨田哥群,不定期上传作品,解答作品中相关问题!) 312125701(QtQML多多指教群) 46679801(Qt开发技术交流群-5000人大群)
离线jiwazii

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

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

只看该作者 21楼 发表于: 2014-05-08
不知道为什么,我带界面的代码,不写av_register_all();,程序能起来,一些av_register_all();程序就异常退出,这是静态库没加载进来造成的吗??
离线czy455475537

只看该作者 22楼 发表于: 2014-05-08
回 wangjiangliu 的帖子
wangjiangliu:谢谢啦,很好的东西[表情]  但是我运行 点打开时候进程就死了  还没仔细分析
内容来自[短消息]  (2014-05-04 22:28) 

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

只看该作者 23楼 发表于: 2014-05-11
回 czy455475537 的帖子
czy455475537:我也是呢,打开进程就死了 (2014-05-08 19:12) 

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

只看该作者 24楼 发表于: 2014-05-11
回 wangjiangliu 的帖子
wangjiangliu:rtsp://218.204.223.237:554/live/1/66251FC11353191F/e7ooqwcfbqjoo80j.sdp
你用这个地址试下 必须要有效的rtsp地址 (2014-05-11 16:04) 

这个可以说是很多例子中的例子了,很好很强大!!!
专业各种自定义控件编写+UI定制+输入法定制+视频监控+工业控制+仪器仪表+嵌入式linux+各种串口网络通信,童叟无欺,量大从优,欢迎咨询购买定制!你正好需要,我正好专业!QQ:517216493 微信:feiyangqingyun Email:feiyangqingyun@163.com
群号:853086607(Qt交流大会,雨田哥群,不定期上传作品,解答作品中相关问题!) 312125701(QtQML多多指教群) 46679801(Qt开发技术交流群-5000人大群)
离线czy455475537

只看该作者 25楼 发表于: 2014-05-11
太神奇了,有点不会用呢,一共4个界面,只有3个界面能显示吗,能有声音吗
离线liudianwu

只看该作者 26楼 发表于: 2014-05-12
回 czy455475537 的帖子
czy455475537:太神奇了,有点不会用呢,一共4个界面,只有3个界面能显示吗,能有声音吗 (2014-05-11 20:16) 

其实暴风影音、QQ影音等各大播放器及大部分视频格式转换工具都使用了ffmpeg!
专业各种自定义控件编写+UI定制+输入法定制+视频监控+工业控制+仪器仪表+嵌入式linux+各种串口网络通信,童叟无欺,量大从优,欢迎咨询购买定制!你正好需要,我正好专业!QQ:517216493 微信:feiyangqingyun Email:feiyangqingyun@163.com
群号:853086607(Qt交流大会,雨田哥群,不定期上传作品,解答作品中相关问题!) 312125701(QtQML多多指教群) 46679801(Qt开发技术交流群-5000人大群)
离线wangjiangliu

只看该作者 27楼 发表于: 2014-05-12
回 liudianwu 的帖子
liudianwu:其实暴风影音、QQ影音等各大播放器及大部分视频格式转换工具都使用了ffmpeg! (2014-05-12 11:26) 

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

只看该作者 28楼 发表于: 2014-05-14
mark            
离线gph1991

只看该作者 29楼 发表于: 2014-05-15
大神,可以交我在linux下跑多媒体播放机吗?采用phonon框架
离线自强不吸

只看该作者 30楼 发表于: 2014-05-15
永远这么高端
自强不吸!
离线xuwei17385

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

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

只看该作者 32楼 发表于: 2014-05-16
回 czy455475537 的帖子
czy455475537:太神奇了,有点不会用呢,一共4个界面,只有3个界面能显示吗,能有声音吗 (2014-05-11 20:16) 

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

只看该作者 33楼 发表于: 2014-05-16
回 foxgod 的帖子
foxgod:你点运行可以显示界面吗,我点运行就死了,把静态库放在exe一起的目录下,还是起不来 (2014-05-16 08:47) 

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

只看该作者 34楼 发表于: 2014-05-16
绘图那边,效率跟得上吗?可以试试用directShow。或者重载paintEvent,在里面绘,效率应该比        
QPixmap::fromImage(image.scaled(tempWidth,tempHeight));
        setPixmap(pix);
高。
给我一片天空,还你一道彩虹。
离线wuquan-1230

只看该作者 35楼 发表于: 2014-06-01
容易卡,不过还要谢谢楼主分享!
改变自己……
离线alexmayer

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

链接失效了?怎么下载不了?
离线daybreakboy

只看该作者 37楼 发表于: 2014-06-27
我的电脑运行不起来,说什么C1083:无法打开包含文件:"inttypes.h":No such file or directory.   说帮帮忙解决一下。谢谢。
离线liudianwu

只看该作者 38楼 发表于: 2014-06-27
回 daybreakboy 的帖子
daybreakboy:我的电脑运行不起来,说什么C1083:无法打开包含文件:"inttypes.h":No such file or directory.   说帮帮忙解决一下。谢谢。 (2014-06-27 16:10) 

你用的什么编译器?要用MINGW编译器
专业各种自定义控件编写+UI定制+输入法定制+视频监控+工业控制+仪器仪表+嵌入式linux+各种串口网络通信,童叟无欺,量大从优,欢迎咨询购买定制!你正好需要,我正好专业!QQ:517216493 微信:feiyangqingyun Email:feiyangqingyun@163.com
群号:853086607(Qt交流大会,雨田哥群,不定期上传作品,解答作品中相关问题!) 312125701(QtQML多多指教群) 46679801(Qt开发技术交流群-5000人大群)
离线liudianwu

只看该作者 39楼 发表于: 2014-06-27
回 daybreakboy 的帖子
daybreakboy:我的电脑运行不起来,说什么C1083:无法打开包含文件:"inttypes.h":No such file or directory.   说帮帮忙解决一下。谢谢。 (2014-06-27 16:10) 

VC编译器貌似不支持C99标准
专业各种自定义控件编写+UI定制+输入法定制+视频监控+工业控制+仪器仪表+嵌入式linux+各种串口网络通信,童叟无欺,量大从优,欢迎咨询购买定制!你正好需要,我正好专业!QQ:517216493 微信:feiyangqingyun Email:feiyangqingyun@163.com
群号:853086607(Qt交流大会,雨田哥群,不定期上传作品,解答作品中相关问题!) 312125701(QtQML多多指教群) 46679801(Qt开发技术交流群-5000人大群)
快速回复
限100 字节
 
上一个 下一个