功能简介:

使用QT+FFMPEG实现了RTSP视频流播放的基础操作,点击按钮后,将拉取指定地址的RTSP流,并在QT界面中通过Label显示

开发环境:

  • 系统环境:Ubuntu
  • QT:5.12.12
  • FFmpeg:4.4(当前最新)

完整工程:

https://github.com/harry19902002/ffmpeg-first-demo

参考代码:

FFMPEG官方示例:FFmpeg: decode_video.c

详细介绍:

(一)添加库文件

新建一个QT工程,在pro添加lib目录和include目录的路径。

##ffmpeg
FFMPEG_LIB = /usr/local/ffmpeg/lib
FFMPEG_INCLUDE = /usr/local/ffmpeg/includeINCLUDEPATH += $$FFMPEG_INCLUDE \LIBS += $$FFMPEG_LIB/libavcodec.so \$$FFMPEG_LIB/libavdevice.so \$$FFMPEG_LIB/libavfilter.so \$$FFMPEG_LIB/libavformat.so \$$FFMPEG_LIB/libavutil.so \$$FFMPEG_LIB/libswresample.so \$$FFMPEG_LIB/libswscale.so \

(二)界面配置

在MainWindow.ui中,添加一个QPushButton和QLabel控件,并添加“转到槽”,添加on_pushButton_clicked()。

(三)Delay函数

#include <QTime>
//以毫秒为单位设置延时
void Delay(int msec)
{QTime dieTime = QTime::currentTime().addMSecs(msec);while(QTime::currentTime() < dieTime){QCoreApplication::processEvents(QEventLoop::AllEvents,100);}
}

(四)FFmpeg视频解码

总体处理步骤有8步,如图所示

1.定义相关变量

    AVFormatContext *pFormatCtx = NULL;AVCodecContext *pCodecCtx = NULL;const AVCodec *pCodec = NULL;AVFrame *pFrame,*pFrameRGB;AVPacket *packet;struct SwsContext *img_convert_ctx;unsigned char *out_buffer;int i,videoIndex;int ret;char errors[1024] = "";//rtsp地址:char url[] = "rtsp://192.168.111.60:554/LiveMedia/ch1/Media1";

2.初始化相关模块

    //初始化FFMPEG  调用了这个才能正常适用编码器和解码器pFormatCtx = avformat_alloc_context();  //init FormatContext//初始化FFmpeg网络模块avformat_network_init();    //init FFmpeg network

3.打开视频文件并获取视频信息

    //open Media Fileret = avformat_open_input(&pFormatCtx,url,NULL,NULL);if(ret != 0){av_strerror(ret,errors,sizeof(errors));cout <<"Failed to open video: ["<< ret << "]"<< errors << endl;exit(ret);}//Get audio informationret = avformat_find_stream_info(pFormatCtx,NULL);if(ret != 0){av_strerror(ret,errors,sizeof(errors));cout <<"Failed to get audio info: ["<< ret << "]"<< errors << endl;exit(ret);}

4.查找视频中的流信息

    //循环查找视频中包含的流信息,直到找到视频类型的流//便将其记录下来 videoIndex//这里我们现在只处理视频流  音频流先不管他for (i = 0; i < pFormatCtx->nb_streams; i++) {if (pFormatCtx->streams[i]->codecpar->codec_type == AVMEDIA_TYPE_VIDEO) {videoIndex = i;}}//如果videoIndex为-1 说明没有找到视频流if (videoIndex == -1) {printf("Didn't find a video stream.\n");return;}

5.配置编码上下文,AVCodecContext内容

    //配置编码上下文,AVCodecContext内容//1.查找解码器pCodec = avcodec_find_decoder(pFormatCtx->streams[videoIndex]->codecpar->codec_id);//2.初始化上下文pCodecCtx = avcodec_alloc_context3(pCodec);//3.配置上下文相关参数avcodec_parameters_to_context(pCodecCtx,pFormatCtx->streams[videoIndex]->codecpar);//4.打开解码器ret = avcodec_open2(pCodecCtx, pCodec, NULL);if(ret != 0){av_strerror(ret,errors,sizeof(errors));cout <<"Failed to open Codec Context: ["<< ret << "]"<< errors << endl;exit(ret);}

6.建立视频帧,并对相关参数进行配置

    //初始化视频帧pFrame = av_frame_alloc();pFrameRGB = av_frame_alloc();//为out_buffer申请一段存储图像的内存空间out_buffer = (unsigned char*)av_malloc(av_image_get_buffer_size(AV_PIX_FMT_RGB32,pCodecCtx->width,pCodecCtx->height,1));//实现AVFrame中像素数据和Bitmap像素数据的关联av_image_fill_arrays(pFrameRGB->data,pFrameRGB->linesize, out_buffer,AV_PIX_FMT_RGB32,pCodecCtx->width, pCodecCtx->height,1);//为AVPacket申请内存packet = (AVPacket *)av_malloc(sizeof(AVPacket));//打印媒体信息av_dump_format(pFormatCtx,0,url,0);//初始化一个SwsContextimg_convert_ctx = sws_getContext(pCodecCtx->width, pCodecCtx->height,pCodecCtx->pix_fmt, pCodecCtx->width, pCodecCtx->height,AV_PIX_FMT_RGB32, SWS_BICUBIC, NULL, NULL, NULL);

7.通过while循环,处理每一个视频帧,并渲染到Label上

    //读取帧数据,并通过av_read_frame的返回值确认是不是还有视频帧while(av_read_frame(pFormatCtx,packet) >=0){//判断视频帧if(packet->stream_index == videoIndex){//解码视频帧ret = avcodec_send_packet(pCodecCtx, packet);ret = avcodec_receive_frame(pCodecCtx, pFrame);if(ret != 0){av_strerror(ret,errors,sizeof(errors));cout <<"Failed to decode video frame: ["<< ret << "]"<< errors << endl;}if (ret == 0) {//处理图像数据sws_scale(img_convert_ctx,(const unsigned char* const*) pFrame->data,pFrame->linesize, 0, pCodecCtx->height, pFrameRGB->data,pFrameRGB->linesize);QImage img((uchar*)pFrameRGB->data[0],pCodecCtx->width,pCodecCtx->height,QImage::Format_RGB32);ui->label->setPixmap(QPixmap::fromImage(img));//释放前需要一个延时Delay(1);}}//释放packet空间av_packet_unref(packet);}

8.结束后释放资源

    //close and release resourceav_free(out_buffer);av_free(pFrameRGB);sws_freeContext(img_convert_ctx);avcodec_close(pCodecCtx);avcodec_free_context(&pCodecCtx);avformat_close_input(&pFormatCtx);exit(0);

FFMPEG 播放 RTSP视频流相关推荐

  1. Qt+FFmpeg播放RTSP H264视频流(1)- 在Qt项目加入FFmpeg库

    Qt FFmpeg播放RTSP H264视频流(1) QtCreator引入FFmpeg库 下载FFmpeg库 添加FFmpeg库到Qt项目 测试FFmpeg库是否能正常使用 QtCreator引入F ...

  2. ffmpeg获取rtsp h265_用FFmpeg将rtsp视频流保存成H264、h265文件

    ffmpeg:FFmpeg的名称来自MPEG视频编码标准,前面的"FF"代表"Fast Forward,是一套可以用来记录.转换数字音频.视频,并能将其转化为流的开源计算 ...

  3. 轻松实现在web页面中直接播放rtsp视频流

    轻松实现在web页面中直接播放rtsp视频流 写在前面 实现 介绍 如何使用 准备ffmpeg 运行rtsp2web 参数说明(在 `new RTSP2web` 时,可配置的参数如下): 前端代码 参 ...

  4. PHP如何调取vlc播放rtsp,H5+VLC播放RTSP视频流

    最新项目涉及到摄像头,这篇文章记录一下在VUE中播放RTSP视频流. 这篇文章主要介绍使用VLC插件播放RTSP视频流,目前支持的浏览器有 360浏览器.2345浏览器,可用于一些对播放器要求不高的项 ...

  5. 网页播放rtsp视频流

    https://github.com/vbence/stream-m https://github.com/131/h264-live-player 网页播放rtsp视频流 原文:https://bl ...

  6. Python Gstreamer播放rtsp视频流(海康IPCAM)

    Python Gstreamer播放rtsp视频流(海康IPCAM) 播放思路: 图解: 1.首先通过IPCAM的ip与用户等信息获得rtsp码:   海康新版IPCAM的rtsp地址规则为:rtsp ...

  7. H5无插件播放rtsp视频流

    基于WebSocket的HTML5 RTSP流媒体视频播放器 Streamedian能让浏览器免插件播放rtsp视频流 Streamedian管网: https://streamedian.com/ ...

  8. 浏览器播放rtsp视频流:3、rtsp转webrtc播放

    浏览器播放rtsp视频流:3.rtsp转webrtc播放 文章目录 浏览器播放rtsp视频流:3.rtsp转webrtc播放 1. 前言 2. rtsp转webRTC 3. 初步测试结果 4. 结合我 ...

  9. 使用ffmpeg+nginx+flvjs实现web播放rtsp视频流

    文章目录 1. 简介 2. 安装ffmpeg 3. 安装nginx 3.1 安装nginx依赖 3.1.1 pcre 3.1.2 zlib 3.1.3 openssl 3.2 编译nginx 3.2. ...

最新文章

  1. 云为 | 提供海外 IT 人才派遣、猎头、人力资源外包服务
  2. matlab频域怎么提取特征值,补充:频域特征值提取的MATLAB代码实现(小波分析)...
  3. 日志规范之slf4j整合JDK14以及Simple的使用
  4. web服务器的基本应用
  5. 【srcipt】python运行cmd命令
  6. 【Flink】 producer attempted to use a producer id which is not currently assigned to its transaction
  7. ToolTip特效 JavaScript 盗取厦门人才网的特效
  8. 计算机网络应用基础试卷B,计算机网络应用基础试卷
  9. Windows10安装Vmware12
  10. 惠普计算机电源怎么设置充电,HP笔记本的三芯电源怎么改二芯实现充电?
  11. 跟我一起学习ZeroMQ(7):发布订阅模式(Publish-subscribe pattern)ZMQ_XPUB和ZMQ_XSUB
  12. 进阶阿里巴巴之路——招聘要求汇总
  13. 关于OSPF中初始化、发现LSDB、交换LSA的描述
  14. 网络分层(7层)以及每层的设备和协议
  15. 搜索引擎技术Lucene
  16. java 变量类型_Java 变量类型
  17. 数字信号处理--加窗
  18. 渭南师范计算机学院男女比例,全国高校男女比例大揭秘!去这些大学怕是要单身四年了...
  19. 44.Isaac教程--姿态估计
  20. 高级人像调色效果Lr预设

热门文章

  1. 苹果5概念机_iPhone x Fold概念机曝光,搭配A13处理器,还支持5G,价格多少合适?...
  2. 如何优雅的使用C语言绘制一只小猪佩奇
  3. Codeforces Round #176 (Div. 2) D. Shifting(模拟,STLdeque应用)
  4. 对计算机的磁盘进行维护,电脑硬盘如何进行维护?
  5. 想知道如何将PDF合并成一个?这里有三个简单的方法分享
  6. 啥?Grafana 还能为日志添加告警?
  7. 给一个字符类型的数组chas和一个整数size,请把大小为size的左半区整体右移到右半区,右半区整体移动到左边。
  8. python数据分析算法调用_python数据分析算法(决策树2)CART算法
  9. 谷歌平庸、百度僵化、联想掉队?
  10. (实测可用)STM32CubeMX教程-STM32L431RCT6开发板研究串口通信(RS485)