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安全错误
数据库的锁怎样保障安全
立善网络技术有限公司怎么样
ibm服务器的维护和管理
数据库加跳转
qq空间相册链接服务器错误
江苏软件开发技术前景
华为服务器管理口在哪
电脑服务器进程怎么查看
网络安全学校国家队
思科代理服务器
数据库系统软考
怎样使用第三方软件开发
数据库应用技术和dsp
城市住宅是什么数据库的
百度怎么关闭网络安全警告
计算机网络技术试题与答案
传奇数据库下载
sql 跨数据库查询
apache服务器的根目录在哪
nist数据库 matlab7
研究互联网科技公司的书籍
数据库的数据检索出来规定格式
深圳数据库怎么样
数据库缓存技术了解
国际邮件服务器软件大全
亳州市网络安全和信息化工作会议
唱吧软件开发
软件开发试用
浪潮数据库软件内容
我是网络安全宣传员手抄报一等奖
网络安全考试好考吗