光之使者 发表于 2025-4-10 19:28:30

C++调用ffmpeg库来实现将rtsp流服务器上的视频流拉取下来,并保存成MP4格式

1. 引入ffmpeg的Lib和头文件

https://i-blog.csdnimg.cn/direct/fea0102f08de4985b3db5423afa214fe.png
https://i-blog.csdnimg.cn/direct/ab7092fc6ba8405abcb5ba69cda7035b.png
https://i-blog.csdnimg.cn/direct/bca95ca8c05042df83b24eac47bd298c.png
2. 将步伐运行情况放入ffmpeg动态库

https://i-blog.csdnimg.cn/direct/95e18212a2ca4a53947f019f1b39bb2b.png
2.代码实现

2.1 引入头文件

```bash
#include <iostream>
#include <string>
#include <cstring>

extern "C" {
   
#include <libavformat/avformat.h>
#include <libavcodec/avcodec.h>
#include <libavutil/avutil.h>
#include <libavutil/imgutils.h>
#include <libavutil/error.h>
#include <libswscale/swscale.h>
}
2.2 按步骤分解实现

av_log_set_level(AV_LOG_DEBUG); // 开启FFmpeg日志
av_log_set_level 是 FFmpeg 库中的一个紧张函数,用于设置日记输出的级别。

level:这是一个整数类型的参数,用于指定日志的输出级别。FFmpeg 定义了多个日志级别常量,常见的级别及其含义如下:
AV_LOG_QUIET(值为 -8):不输出任何日志信息。
AV_LOG_PANIC(值为 0):输出非常严重的错误信息,程序可能无法继续运行。
AV_LOG_FATAL(值为 8):输出致命错误信息,程序可能会终止。
AV_LOG_ERROR(值为 16):输出普通错误信息。
AV_LOG_WARNING(值为 24):输出警告信息,提示可能存在的问题。
AV_LOG_INFO(值为 32):输出一般的信息,如编码器参数、文件信息等。
AV_LOG_VERBOSE(值为 40):输出详细的信息。
AV_LOG_DEBUG(值为 48):输出调试信息,包含大量的详细内容,通常用于开发和调试阶段。
AV_LOG_TRACE(值为 56):输出最详细的跟踪信息。
AVFormatContext* input_ctx = nullptr;
AVFormatContext* output_ctx = nullptr;
// 1. 初始化网络协议(必须!否则无法处理rtsp)
        avformat_network_init();
avformat_network_init 是 FFmpeg 库中的一个紧张函数,主要用于初始化网络相关的组件,以支持网络协议的利用,比如 RTSP、HTTP 等。

返回值:


[*]成功:返回值为 0,表示网络初始化成功。
[*]失败:返回一个负的错误码,指示初始化过程中出现了题目。
功能用途
在利用 FFmpeg 处理网络相关的音视频流时,比方从 RTSP 服务器拉取流、通过 HTTP 下载视频文件等,需要先调用 avformat_network_init 函数来初始化网络情况。它会初始化底层的网络库(如 socket 库等),确保后续的网络操作可以或许正常进行。
// 2. 打开输入流(RTSP)
        AVDictionary* options = nullptr;
        av_dict_set(&options, "rtsp_transport", "tcp", 0); // 强制使用TCP传输
        av_dict_set(&options, "stimeout", "5000000", 0);   // 设置超时5秒(单位微秒)

        const char* input_url = "rtsp://127.0.0.1:554/your_stream_key";
        int ret = avformat_open_input(&input_ctx, input_url, nullptr, &options);
        if (ret < 0) {
   
                //std::cerr << "无法打开输入流: " << av_err2str(ret) << std::endl;
                return -1;
        }
avformat_open_input 是 FFmpeg 库中一个非常关键的函数,主要用于打开输入的音视频文件或者网络流,为后续的音视频数据读取和处理做准备。

参数表明


[*]AVFormatContext **ps:
这是一个指向 AVFormatContext 指针的指针。AVFormatContext 是 FFmpeg 中一个非常紧张的布局体,它包含了输入文件或流的全局信息,如文件格式、流信息等。函数会分配并初始化一个 AVFormatContext 布局体,并将其指针存储在 *ps 中。
[*]const char *url:
输入文件或流的路径或 URL。如果是当地文件,就是文件的路径;如果是网络流,就是对应的网络地点,如 RTSP、HTTP 等协议的 URL。
[*]ff_const59 AVInputFormat *fmt:
指定输入文件的格式。一般设置为 NULL,如许 FFmpeg 会自动探测输入文件的格式。如果你明确知道输入文件的格式,也可以传入对应的 AVInputFormat 指针。
[*]AVDictionary **options:
一个指向 AVDictionary 指针的指针,用于通报一些额外的选项参数。比方,在打开 RTSP 流时,可以设置一些网络相关的参数。如果不需要额外的选项,可以设置为 NULL。
返回值


[*]成功:返回值为 0,表示输入文件或流成功打开。
[*]失败:返回一个负的错误码,指示打开过程中出现了题目。可以利用 av_err2str 函数将错误码转换为可读的错误信息。
// 3. 获取流信息
        if (avformat_find_stream_info(input_ctx, nullptr) < 0) {
   
                std::cerr << "无法获取流信息" << std::endl;
                avformat_close_input(&input_ctx);
                return -1;
        }
avformat_find_stream_info 是 FFmpeg 库中一个用于获取输入文件或流详细信息的紧张函数

参数表明


[*]AVFormatContext *ic:
指向 AVFormatContext 布局体的指针。AVFormatContext 包含了输入文件或流的全局信息,通常是在调用 avformat_open_input 函数成功打开输入文件或流后得到的。此函数会基于该上下文去分析流的详细信息。
[*]AVDictionary **options:
一个指向 AVDictionary 指针的指针,用于通报额外的选项参数。这些选项可以影响信息查找的举动。若不需要额外选项,可将其设置为 NULL。
返回值


[*]成功:返回值大于即是 0,表示成功获取到输入流的信息。
[*]失败:返回一个负的错误码,代表在查找流信息过程中出现了题目。可以利用 av_err2str 函数将错误码转换为可读的错误信息。
[*]
功能
avformat_find_stream_info 函数的主要功能是读取输入文件或流的数据包,分析此中的信息,从而填充 AVFormatContext 布局体中关于流的详细信息。这些信息包罗但不限于:
每个流的编解码器信息(如视频的 H.264、音频的 AAC 等)。
视频流的分辨率、帧率。
音频流的采样率、声道数等。
avformat_close_input 是 FFmpeg 库中用于关闭已打开的输入文件或流,并开释相关资源的紧张函数。

// 4. 创建输出文件(MP4)
        const char* output_filename = "output.mp4";
        avformat_alloc_output_context2(&output_ctx, nullptr, nullptr, output_filename);
        if (!output_ctx) {
   
                std::cerr << "无法创建输出上下文" << std::endl;
                avformat_close_input(&input_ctx);
                return -1;
        }
a


免责声明:如果侵犯了您的权益,请联系站长,我们会及时删除侵权内容,谢谢合作!更多信息从访问主页:qidao123.com:ToB企服之家,中国第一个企服评测及商务社交产业平台。
页: [1]
查看完整版本: C++调用ffmpeg库来实现将rtsp流服务器上的视频流拉取下来,并保存成MP4格式