服务器之家:专注于VPS、云服务器配置技术及软件下载分享
分类导航

PHP教程|ASP.NET教程|Java教程|ASP教程|编程技术|正则表达式|C/C++|IOS|C#|Swift|Android|VB|R语言|JavaScript|易语言|vb.net|

服务器之家 - 编程语言 - C/C++ - C++使用ffmpeg实现rtsp取流的代码

C++使用ffmpeg实现rtsp取流的代码

2022-11-13 14:25TheOldManAndTheSea C/C++

这篇文章主要介绍了C++使用ffmpeg实现rtsp取流,文章介绍了ffmepg采用rtsp取流流程图,CMakeLists.txt编写方法,通过示例代码给大家介绍的非常详细,需要的朋友可以参考下

C++ 使用ffmpeg实现rtsp取流

flyfish

环境

Ubuntu 18.04
Qt 5.14.2
FFmpeg-n5.0.1

下载

https://git.ffmpeg.org/ffmpeg.git
https://github.com/FFmpeg/FFmpeg

这里选择n5.0.1版本

安装编译依赖

sudo apt-get install nasm

配置

生成包括静态和动态库
头文件和库都在当前的install文件夹中

FFmpeg-n5.0.1$  ./configure --prefix="./install"  --enable-shared

再执行

make
make install

在install文件夹中的include

C++使用ffmpeg实现rtsp取流的代码

在install文件夹中的lib

C++使用ffmpeg实现rtsp取流的代码

ffmepg采用rtsp取流流程图

C++使用ffmpeg实现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.cpp
target_link_libraries(rtsp avcodec avformat avfilter avutil swresample swscale swscale )

实现代码

#include <iostream>

extern "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++使用ffmpeg实现rtsp取流的文章就介绍到这了,更多相关C++ rtsp取流内容请搜索服务器之家以前的文章或继续浏览下面的相关文章希望大家以后多多支持服务器之家!

原文链接:https://blog.csdn.net/flyfish1986/article/details/124298473

延伸 · 阅读

精彩推荐
  • C/C++浅谈C结构和C++结构之间的区别

    浅谈C结构和C++结构之间的区别

    这篇文章主要介绍了浅谈C结构和C++结构之间的区别,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下...

    一起学编程11632021-11-02
  • C/C++C语言开发之归并排序详解及实例

    C语言开发之归并排序详解及实例

    这篇文章主要介绍了 C语言开发之归并排序详解及实例的相关资料,需要的朋友可以参考下...

    morixinguan7992021-05-05
  • C/C++C语言实现去除字符串中空格的简单实例

    C语言实现去除字符串中空格的简单实例

    下面小编就为大家带来一篇C语言实现去除字符串中空格的简单实例。小编觉得挺不错的,现在分享给大家,也给大家做个参考。一起跟随小编过来看看吧...

    C语言教程网5792021-04-02
  • C/C++C语言链表完整操作演示

    C语言链表完整操作演示

    这篇文章主要为大家详细介绍了C语言链表的完整操作演示,具有一定的参考价值,感兴趣的小伙伴们可以参考一下...

    chulijun31078532021-06-25
  • C/C++C++ 内存管理原理分析

    C++ 内存管理原理分析

    本章主要介绍C++的内存管理,以C++的内存分布作为引入,介绍C++不同于C语言的内存管理方式(new delete对比 malloc free),最后为了加深读者的理解,会介绍...

    林慢慢脑瓜子嗡嗡的8992022-02-28
  • C/C++C++时间戳转化操作实例分析【涉及GMT与CST时区转化】

    C++时间戳转化操作实例分析【涉及GMT与CST时区转化】

    这篇文章主要介绍了C++时间戳转化操作,结合实例形式分析了C++时间戳转换与显示操作的原理与具体实现技巧,涉及GMT与CST时区转化,需要的朋友可以参考下...

    jihite7972021-05-13
  • C/C++C语言实现酒店客房管理系统课程设计

    C语言实现酒店客房管理系统课程设计

    这篇文章主要为大家详细介绍了C语言实现酒店客房管理系统课程设计,文中示例代码介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们可以参考一...

    N J H7692022-10-21
  • C/C++C语言实现纸牌游戏(小猫钓鱼)

    C语言实现纸牌游戏(小猫钓鱼)

    这篇文章主要为大家详细介绍了C语言实现纸牌游戏,小猫钓鱼游戏,文中示例代码介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们可以参考一下...

    齐1234032021-09-29