C++怎么使用ffmpeg实现rtsp取流
发表于:2024-11-24 作者:千家信息网编辑
千家信息网最后更新 2024年11月24日,今天小编给大家分享一下C++怎么使用ffmpeg实现rtsp取流的相关知识点,内容详细,逻辑清晰,相信大部分人都还太了解这方面的知识,所以分享这篇文章给大家参考一下,希望大家阅读完这篇文章后有所收获,
千家信息网最后更新 2024年11月24日C++怎么使用ffmpeg实现rtsp取流
今天小编给大家分享一下C++怎么使用ffmpeg实现rtsp取流的相关知识点,内容详细,逻辑清晰,相信大部分人都还太了解这方面的知识,所以分享这篇文章给大家参考一下,希望大家阅读完这篇文章后有所收获,下面我们一起来了解一下吧。
C++ 使用ffmpeg实现rtsp取流
flyfish
环境
Ubuntu 18.04
Qt 5.14.2
FFmpeg-n5.0.1
下载
这里选择n5.0.1版本
安装编译依赖
sudo apt-get install nasm
配置
生成包括静态和动态库
头文件和库都在当前的install文件夹中
FFmpeg-n5.0.1$ ./configure --prefix="./install" --enable-shared
再执行
makemake install
在install文件夹中的include
在install文件夹中的lib
ffmepg采用rtsp取流流程图
CMakeLists.txt编写方法
cmake_minimum_required(VERSION 3.5)project(rtsp LANGUAGES CXX)set(CMAKE_INCLUDE_CURRENT_DIR ON)set(CMAKE_AUTOUIC ON)set(CMAKE_AUTOMOC ON)set(CMAKE_AUTORCC ON)set(CMAKE_CXX_STANDARD 11)set(CMAKE_CXX_STANDARD_REQUIRED ON)find_package(Qt5Core)set(FFMPEG_PREFIX_PATH /path/to/FFmpeg-n5.0.1/install)include_directories( ${FFMPEG_PREFIX_PATH}/include/)link_directories( ${FFMPEG_PREFIX_PATH}/lib/ )add_executable(rtsp main.cpptarget_link_libraries(rtsp avcodec avformat avfilter avutil swresample swscale swscale )
实现代码
#includeextern "C" {#include "libavcodec/avcodec.h"#include "libavformat/avformat.h"#include "libavutil/avutil.h"}int main(int argc, char *argv[]){ int status_error_=-1; std::string videourl= "rtsp://admin:Admin12345@192.168.3.64:554/Streaming/Channels/1"; AVFormatContext *pFormatCtx = NULL; AVDictionary *options = NULL; AVPacket *av_packet = NULL; // AVPacket暂存解码之前的媒体数据 avformat_network_init(); //执行网络库的全局初始化。 //此函数仅用于解决旧版GNUTLS或OpenSSL库的线程安全问题。 //一旦删除对较旧的GNUTLS和OpenSSL库的支持,此函数将被弃用,并且此函数将不再有任何用途。 av_dict_set(&options, "buffer_size", "4096000", 0); //设置缓存大小 av_dict_set(&options, "rtsp_transport", "tcp", 0); //以tcp的方式打开, av_dict_set(&options, "stimeout", "5000000", 0); //设置超时断开链接时间,单位us, 5s av_dict_set(&options, "max_delay", "500000", 0); //设置最大时延 pFormatCtx = avformat_alloc_context(); //用来申请AVFormatContext类型变量并初始化默认参数,申请的空间 //打开网络流或文件流 if (avformat_open_input(&pFormatCtx, videourl.c_str(), NULL, &options) != 0) { std::cout << "Couldn't open input stream.\n" << std::endl; return status_error_; } //获取视频文件信息 if (avformat_find_stream_info(pFormatCtx, NULL) < 0) std::cout << "Couldn't find stream information."<< std::endl; std::cout << "av_dict_get:" << std::endl; AVDictionaryEntry *tag = NULL; //av_dict_set(&pFormatCtx->metadata, "rotate", "0", 0);这里可以设置一些属性 while ((tag = av_dict_get(pFormatCtx->metadata, "", tag, AV_DICT_IGNORE_SUFFIX))) std::string key = tag->key; std::string value = tag->value; std::cout << "av_dict_get:" << key << ":" << value << std::endl; //查找码流中是否有视频流 int videoindex = -1; unsigned i = 0; for (i = 0; i < pFormatCtx->nb_streams; i++) if (pFormatCtx->streams[i]->codecpar->codec_type == AVMEDIA_TYPE_VIDEO) { videoindex = i; break; } if (videoindex == -1) std::cout << "Didn't find a video stream.\n" av_packet = (AVPacket *)av_malloc(sizeof(AVPacket)); while (true) if (av_read_frame(pFormatCtx, av_packet) >= 0) if (av_packet->stream_index == videoindex) { std::cout << "\ndata size is:" << av_packet->size; //这里就是接收到的未解码之前的数据 } if (av_packet != NULL) av_packet_unref(av_packet); av_free(av_packet); avformat_close_input(&pFormatCtx); return 0;
运行可执行文件前,可设置从当前文件夹查找so动态库
export LD_LIBRARY_PATH=./
结果
以上就是"C++怎么使用ffmpeg实现rtsp取流"这篇文章的所有内容,感谢各位的阅读!相信大家阅读完这篇文章都有很大的收获,小编每天都会为大家更新不同的知识,如果还想学习更多的知识,请关注行业资讯频道。
文件
文件夹
知识
篇文章
C++
函数
内容
动态
就是
数据
网络
视频
不同
很大
代码
全局
单位
参数
变量
大小
数据库的安全要保护哪些东西
数据库安全各自的含义是什么
生产安全数据库录入
数据库的安全性及管理
数据库安全策略包含哪些
海淀数据库安全审计系统
建立农村房屋安全信息数据库
易用的数据库客户端支持安全管理
连接数据库失败ssl安全错误
数据库的锁怎样保障安全
服务器多重跨域
网络安全感手抄报内容
每一个软件都有自己的服务器吗
mac 设置代理服务器
双路tesla p40服务器
河南播梦网络技术有限公司
我的世界服务器每隔2小时重启
dns服务器全球
vba中创建数据库
福州锐思软件开发有限公司
什么是数据库的对象
云南服务器机柜品牌云空间
高铁列车内部网络技术
如何建立文档数据库
nacos 修改数据库连接
服务器可以使用长波模块吗
网站代理服务器
长宁区网络营销软件开发经验丰富
广州市乐游互联网科技有限公司
有关数据库的常用面试题
如何通过ip登录服务器管理网口
数据库安全模型包括哪些
幼儿园国家网络安全宣传周美篇
广州正规软件开发价格
数据库的session什么意思
信息时代网络安全手抄报内容
计算机网络技术打代码
大学生网络安全片
重橙提升网络安全性
网络安全竞争态势分析