C++怎么使用ffmpeg实现rtsp取流
发表于:2025-02-19 作者:千家信息网编辑
千家信息网最后更新 2025年02月19日,今天小编给大家分享一下C++怎么使用ffmpeg实现rtsp取流的相关知识点,内容详细,逻辑清晰,相信大部分人都还太了解这方面的知识,所以分享这篇文章给大家参考一下,希望大家阅读完这篇文章后有所收获,
千家信息网最后更新 2025年02月19日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安全错误
数据库的锁怎样保障安全
2020年网络安全行业业绩
做软件开发的怎么获客
抽奖视频服务器
网络技术标号法例题
数据库大数据量存储
澳大利亚大学网络安全排名
如何在内网访问服务器
华为手机网络安全官
计算机网络技术 高职
移动集客网络技术支撑干什么的
一珊网络技术
大庆广电大厦网络技术员
全球软件开发中的scrum
数据库安全性实验报告结论
excel服务器应用
河南果蔬软件开发
中小学学生网络安全教育
管理信息系统文件服务器模式
诺基亚windows系统服务器
法宣网络安全法答案
考研 数据库技术与应用
qt数据库选中
上海大学生网络安全wp
05数据库服务无法启动
近五年软件开发领域失败案例
万方数据库如何看外文
全球软件开发中的scrum
软件开发本几年一换
数据库TRG
超市的信息服务器特别慢怎么回事