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

目录
  • 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

在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.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++ rtsp取流内容请搜索我们以前的文章或继续浏览下面的相关文章希望大家以后多多支持我们!

(0)

相关推荐

  • 如何基于C++解决RTSP取流报错问题

    使用g++ opencv_demo.cpp -o test 会报以下错误 这是我的代码: #include <string> #include <iostream> #include <time.h> #include <opencv2/highgui/highgui.hpp> #include <opencv2/opencv.hpp> #include <opencv2/core.hpp> #include <opencv2/

  • C++ opencv ffmpeg图片序列化实现代码解析

    0.如果路径中存在空格,用""把路径包括起来 1.使用ffmpeg命令 ffmpeg -y -framerate 10 -start_number 1 -i E:\Image\Image_%d.bmp E:\test.mp4 -y 表示输出时覆盖输出目录已存在的同名文件 -framerate 10 表示视频帧率 -start_number 1 表示图片序号从1开始 -i E:\Image\Image_%d.bmp 表示图片输入流格式 2.c++ 实现 ffmpeg命令 2.1.syst

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

    目录 C++ 使用ffmpeg实现rtsp取流 环境 下载 安装编译依赖 配置 ffmepg采用rtsp取流流程图 CMakeLists.txt编写方法 实现代码 C++ 使用ffmpeg实现rtsp取流 flyfish 环境 Ubuntu 18.04Qt 5.14.2FFmpeg-n5.0.1 下载 https://git.ffmpeg.org/ffmpeg.githttps://github.com/FFmpeg/FFmpeg 这里选择n5.0.1版本 安装编译依赖 sudo apt-get

  • asp下实现记录集内随机取记录的代码

    记录集内随机取记录的代码 <%  ' Moving to random record - Steven Jones' Extension If Not(记录集名称.bof and 记录集名称.eof) Then ' reset the cursor to the beginning If (记录集名称.CursorType > 0) Then 记录集名称.MoveFirst Else 记录集名称.Requery End If 记录集名称_totalrn = -1 记录集名称_totalrn =

  • scrapy spider的几种爬取方式实例代码

    本节课介绍了scrapy的爬虫框架,重点说了scrapy组件spider. spider的几种爬取方式: 爬取1页内容 按照给定列表拼出链接爬取多页 找到'下一页'标签进行爬取 进入链接,按照链接进行爬取 下面分别给出了示例 1.爬取1页内容 #by 寒小阳(hanxiaoyang.ml@gmail.com) import scrapy class JulyeduSpider(scrapy.Spider): name = "julyedu" start_urls = [ 'https:

  • Java对象流实例代码

    将日期对象和向量对象写入文件,然后从文件中读出并输出到屏幕上 package objstream; import java.io.File; import java.io.FileInputStream; import java.io.FileNotFoundException; import java.io.FileOutputStream; import java.io.IOException; import java.io.ObjectInputStream; import java.io

  • Node.js实现简单的爬取的示例代码

    学习[node.js]也有几天时间了,所以打算写着练练手:索然我作为一个后端的选手,写起来还有那么一丝熟悉的感觉.emmm~~ '货'不多讲 ,开搞........ 首先是依赖选择: 代码块如下: //引入依赖 //https请求 const https = require('https'); //简称node版的jquery const cheerio = require('cheerio'); //解决防止出现乱码 const iconv = require('iconv-lite') //

  • 通过vue写一个瀑布流插件代码实例

    这篇文章主要介绍了通过vue写一个瀑布流插件代码实例,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友可以参考下 效果如图所示: 采用了预先加载图片,再计算高度的办法..网络差的情况下,可能有点卡 新建 vue-water-easy.vue 组件文件 <template> <div class="vue-water-easy" ref="waterWrap"> <div v-for="(i

  • C# 标准事件流实例代码

    服装价格变动,触发淘宝发布活动和消费者购买衣服事件流 public class EventStandard { public class Clothes { /// <summary> /// 服装编码 /// </summary> public string Id { get; set; } /// <summary> /// 服装名称 /// </summary> public string Name { get; set; } /// <summ

  • Python 微信公众号文章爬取的示例代码

    一.思路 我们通过网页版的微信公众平台的图文消息中的超链接获取到我们需要的接口 从接口中我们可以得到对应的微信公众号和对应的所有微信公众号文章. 二.接口分析 获取微信公众号的接口: https://mp.weixin.qq.com/cgi-bin/searchbiz? 参数: action=search_biz begin=0 count=5 query=公众号名称 token=每个账号对应的token值 lang=zh_CN f=json ajax=1 请求方式: GET 所以这个接口中我们

  • redis zset实现滑动窗口限流的代码

    目录 限流 rediszset特性 滑动窗口算法 java代码实现 补充:RediszSet实现滑动窗口对短信进行防刷限流 前言 示例代码 限流 需求背景:同一用户1分钟内登录失败次数超过3次,页面添加验证码登录验证,也即是限流的思想. 常见的限流算法:固定窗口计数器:滑动窗口计数器:漏桶:令牌桶.本篇选择的滑动窗口计数器 redis zset特性 Redis 有序集合(sorted set)和集合(set)一样也是 string 类型元素的集合,且不允许重复的成员.不同的是每个元素都会关联一个

随机推荐