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

QtCreator引入FFmpeg库

本文讲解使用Qt和FFmpeg播放Rtsp H264视频的过程,Rtsp H264视频流从Ipcamera设备获取。最终效果如下图所示:
Qt + FFmpeg播放RTSP H264

下载FFmpeg库

FFmpeg库可以使用源码编译也可以从网上下载已经编译好的库文件,这里使用从网上下载编译好的库文件。
从网站:https://ffmpeg.zeranoe.com/builds/ 下载编译好的FFmpeg库。我选择下载32位的库。
FFmpeg下载选择Windows 32-bit 版本,Static,Share,Dev三个都下载,下载好的三个文件分别为:
下载已编译好的ffmpeg库

添加FFmpeg库到Qt项目

使用QtCreator创建一个Qt gui项目,创建完项目后:

  1. 在项目根目录下创建ffmpeg文件夹,在ffmpeg文件夹中创建include和lib文件夹
  2. 解压ffmpeg-20190628-098ab93-win32-dev.zip压缩文件
  3. 将解压后ffmpeg-20190628-098ab93-win32-dev文件夹下include目录中所有头文件拷贝到新建的ffmpeg目录下的include文件夹中
  4. 将解压后ffmpeg-20190628-098ab93-win32-dev文件夹下lib目录中的所有dll.a结尾的文件拷贝到ffmpeg的lib文件夹中
  5. 修改项目pro文件,在pro文件中增加如下内容:
INCLUDEPATH += $$PWD/ffmpeg/include
LIBS += $$PWD/ffmpeg/lib/libavcodec.dll.a \
             $$PWD/ffmpeg/lib/libavfilter.dll.a \
             $$PWD/ffmpeg/lib/libavformat.dll.a \
             $$PWD/ffmpeg/lib/libavutil.dll.a \
             $$PWD/ffmpeg/lib/libswscale.dll.a

   
   
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6

FFmpeg库测试Qt项目

测试FFmpeg库是否能正常使用

  1. 在项目中FFmpegLibTestFrm.cpp文件中添加FFmpeg头文件
extern "C"
{
#include <libavcodec/avcodec.h>
#include <libavformat/avformat.h>
#include <libswscale/swscale.h>
#include <libavdevice/avdevice.h>
#include <libavformat/version.h>
#include <libavutil/time.h>
#include <libavutil/mathematics.h>
}

   
   
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  1. 在FFmpegLibTestFrm构造函数中增加如下代码
qDebug("------------------------------------------------------------------------");
qDebug("%s", avcodec_configuration());
qDebug("version: %d", avcodec_version());
qDebug("------------------------------------------------------------------------");

   
   
  • 1
  • 2
  • 3
  • 4

添加FFmpeg库测试代码

  1. 编译运行程序,编译成功,运行时如下报错:
Starting E:\code\qt\build-FFmpegLibTest-Desktop_Qt_5_9_2_MinGW_static_32bit-Release\release\FFmpegLibTest.exe...
Cannot retrieve debugging output.
程序异常结束。
The process was ended forcefully.
E:\code\qt\build-FFmpegLibTest-Desktop_Qt_5_9_2_MinGW_static_32bit-Release\release\FFmpegLibTest.exe crashed.

   
   
  • 1
  • 2
  • 3
  • 4
  • 5

报这个错是因为缺少FFmpeg动态库
解压ffmpeg-20190628-098ab93-win32-shared.zip,将bin目录下的所有dll文件拷贝到编译后的release目录中。注意:如果使用的Qt动态库编译,则还需要加入Qt相关的dll文件后,程序才能跑起来。我用的Qt静态库
将FFmpeg dll文件添加到可执行程序目录重新编译运行程序,程序正常运行,并在QtCreator控制台输出如下内容:

------------------------------------------------------------------------
--disable-static --enable-shared --enable-gpl --enable-version3 --enable-sdl2 --enable-fontconfig --enable-gnutls --enable-iconv --enable-libass --enable-libdav1d --enable-libbluray --enable-libfreetype --enable-libmp3lame --enable-libopencore-amrnb --enable-libopencore-amrwb --enable-libopenjpeg --enable-libopus --enable-libshine --enable-libsnappy --enable-libsoxr --enable-libtheora --enable-libtwolame --enable-libvpx --enable-libwavpack --enable-libwebp --enable-libx264 --enable-libx265 --enable-libxml2 --enable-libzimg --enable-lzma --enable-zlib --enable-gmp --enable-libvidstab --enable-libvorbis --enable-libvo-amrwbenc --enable-libmysofa --enable-libspeex --enable-libxvid --enable-libaom --enable-libmfx --enable-amf --enable-ffnvcodec --enable-cuvid --enable-d3d11va --enable-nvenc --enable-nvdec --enable-dxva2 --enable-avisynth --enable-libopenmpt
version: 3814756
------------------------------------------------------------------------

   
   
  • 1
  • 2
  • 3
  • 4

测试结果
至此,FFmpeg库已经能在Qt项目中正常使用了。

  • 2
    点赞
  • 14
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
Qt中使用FFmpeg播放RTSP H264视频流的方法如下[^1][^2]: 1. 首先,确保你已经安装了QtFFmpeg,并且已经将FFmpeg文件添加到Qt项目中。 2. 创建一个Qt项目,并在项目文件中添加FFmpeg的头文件和文件的路径。 3. 在Qt的代码中,使用FFmpeg的API来实现视频流播放。以下是一个简单的示例代码: ```cpp #include <QCoreApplication> #include <QDebug> #include <QThread> extern "C" { #include <libavformat/avformat.h> #include <libavcodec/avcodec.h> #include <libswscale/swscale.h> } int main(int argc, char *argv[]) { QCoreApplication a(argc, argv); // 初始化FFmpeg av_register_all(); // 创建AVFormatContext对象 AVFormatContext *formatContext = avformat_alloc_context(); // 打开视频流 if (avformat_open_input(&formatContext, "rtsp://your_rtsp_url", nullptr, nullptr) != 0) { qDebug() << "无法打开视频流"; return -1; } // 查找视频流信息 if (avformat_find_stream_info(formatContext, nullptr) < 0) { qDebug() << "无法获取视频流信息"; return -1; } // 查找视频流索引 int videoStreamIndex = -1; for (int i = 0; i < formatContext->nb_streams; i++) { if (formatContext->streams[i]->codecpar->codec_type == AVMEDIA_TYPE_VIDEO) { videoStreamIndex = i; break; } } // 如果找不到视频流索引,退出程序 if (videoStreamIndex == -1) { qDebug() << "找不到视频流"; return -1; } // 获取视频解码器参数 AVCodecParameters *codecParameters = formatContext->streams[videoStreamIndex]->codecpar; // 查找视频解码器 AVCodec *codec = avcodec_find_decoder(codecParameters->codec_id); if (codec == nullptr) { qDebug() << "找不到视频解码器"; return -1; } // 创建解码器上下文 AVCodecContext *codecContext = avcodec_alloc_context3(codec); if (avcodec_parameters_to_context(codecContext, codecParameters) < 0) { qDebug() << "无法创建解码器上下文"; return -1; } // 打开解码器 if (avcodec_open2(codecContext, codec, nullptr) < 0) { qDebug() << "无法打开解码器"; return -1; } // 创建帧对象 AVFrame *frame = av_frame_alloc(); // 创建解码后的帧对象 AVFrame *decodedFrame = av_frame_alloc(); // 创建解码后的帧的缓冲区 uint8_t *buffer = nullptr; int bufferSize = av_image_get_buffer_size(AV_PIX_FMT_RGB24, codecContext->width, codecContext->height, 1); buffer = (uint8_t *)av_malloc(bufferSize * sizeof(uint8_t)); av_image_fill_arrays(decodedFrame->data, decodedFrame->linesize, buffer, AV_PIX_FMT_RGB24, codecContext->width, codecContext->height, 1); // 创建视频转换上下文 SwsContext *swsContext = sws_getContext(codecContext->width, codecContext->height, codecContext->pix_fmt, codecContext->width, codecContext->height, AV_PIX_FMT_RGB24, SWS_BILINEAR, nullptr, nullptr, nullptr); // 读取视频帧 AVPacket packet; while (av_read_frame(formatContext, &packet) >= 0) { if (packet.stream_index == videoStreamIndex) { // 解码视频帧 avcodec_send_packet(codecContext, &packet); avcodec_receive_frame(codecContext, frame); // 转换视频帧格式 sws_scale(swsContext, frame->data, frame->linesize, 0, codecContext->height, decodedFrame->data, decodedFrame->linesize); // 在这里可以将解码后的帧显示到界面上 // 延时一段时间,模拟视频播放 QThread::msleep(40); } av_packet_unref(&packet); } // 释放资源 av_frame_free(&frame); av_frame_free(&decodedFrame); avcodec_free_context(&codecContext); avformat_close_input(&formatContext); avformat_free_context(formatContext); return a.exec(); } ``` 请注意,上述代码只是一个简单的示例,实际的视频播放功能可能需要更多的处理和错误处理。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值