当前位置: 首页 > article >正文

ubuntu中 使用C++ FFmpeg拉取RTSP视频流

在C++中使用FFmpeg拉取RTSP视频流涉及多个步骤,包括初始化FFmpeg库、打开RTSP流、读取帧数据等。以下是一个简单的示例代码,展示如何使用FFmpeg库拉取RTSP视频流并解码视频帧。

1. 安装FFmpeg库

首先,确保你已经安装了FFmpeg库。你可以通过以下命令在Ubuntu上安装FFmpeg开发库:

sudo apt-get install libavformat-dev libavcodec-dev libavutil-dev libswscale-dev

2. 示例代码

extern "C" {
#include <libavformat/avformat.h>
#include <libavcodec/avcodec.h>
#include <libswscale/swscale.h>
}

#include <iostream>

int main() {
// 初始化FFmpeg库
av_register_all();
avformat_network_init();

AVFormatContext* formatContext = avformat_alloc_context();
if (!formatContext) {
std::cerr << "Could not allocate format context" << std::endl;
return -1;
}

// 打开RTSP流
const char* rtspUrl = "rtsp://your_rtsp_stream_url";
if (avformat_open_input(&formatContext, rtspUrl, nullptr, nullptr) != 0) {
std::cerr << "Could not open RTSP stream" << std::endl;
return -1;
}

// 获取流信息
if (avformat_find_stream_info(formatContext, nullptr) < 0) {
std::cerr << "Could not find stream information" << std::endl;
return -1;
}

// 查找视频流
int videoStreamIndex = -1;
for (unsigned int i = 0; i < formatContext->nb_streams; i++) {
if (formatContext->streams[i]->codecpar->codec_type == AVMEDIA_TYPE_VIDEO) {
videoStreamIndex = i;
break;
}
}

if (videoStreamIndex == -1) {
std::cerr << "Could not find video stream" << std::endl;
return -1;
}

// 获取视频流的编解码器参数
AVCodecParameters* codecParameters = formatContext->streams[videoStreamIndex]->codecpar;

// 查找解码器
AVCodec* codec = avcodec_find_decoder(codecParameters->codec_id);
if (!codec) {
std::cerr << "Unsupported codec" << std::endl;
return -1;
}

// 创建解码器上下文
AVCodecContext* codecContext = avcodec_alloc_context3(codec);
if (!codecContext) {
std::cerr << "Could not allocate codec context" << std::endl;
return -1;
}

// 将编解码器参数复制到解码器上下文
if (avcodec_parameters_to_context(codecContext, codecParameters) < 0) {
std::cerr << "Could not copy codec parameters to context" << std::endl;
return -1;
}

// 打开解码器
if (avcodec_open2(codecContext, codec, nullptr) < 0) {
std::cerr << "Could not open codec" << std::endl;
return -1;
}

// 分配帧和包
AVFrame* frame = av_frame_alloc();
AVPacket* packet = av_packet_alloc();
if (!frame || !packet) {
std::cerr << "Could not allocate frame or packet" << std::endl;
return -1;
}

// 读取帧
while (av_read_frame(formatContext, packet) >= 0) {
if (packet->stream_index == videoStreamIndex) {
// 解码视频帧
if (avcodec_send_packet(codecContext, packet) == 0) {
while (avcodec_receive_frame(codecContext, frame) == 0) {
// 在这里处理解码后的帧(frame)
std::cout << "Decoded frame: " << frame->pts << std::endl;
}
}
}
av_packet_unref(packet);
}

// 释放资源
av_frame_free(&frame);
av_packet_free(&packet);
avcodec_free_context(&codecContext);
avformat_close_input(&formatContext);
avformat_free_context(formatContext);

return 0;
}

3. 编译代码

使用以下命令编译代码:

g++ -o rtsp_stream rtsp_stream.cpp -lavformat -lavcodec -lavutil -lswscale

4. 运行程序

运行编译后的程序:

./rtsp_stream

5. 代码说明

  • avformat_open_input:打开RTSP流。
  • avformat_find_stream_info:获取流信息。
  • avcodec_find_decoder:查找解码器。
  • avcodec_open2:打开解码器。
  • av_read_frame:读取帧数据。
  • avcodec_send_packetavcodec_receive_frame:解码视频帧。

6. 注意事项

  • 确保RTSP URL正确。
  • 处理解码后的帧时,可以根据需要进行进一步处理,如显示、保存等。
  • 在实际应用中,可能需要处理更多的错误情况和资源管理。

通过以上步骤,你可以在C++中使用FFmpeg拉取RTSP视频流并解码视频帧。


http://www.kler.cn/a/536725.html

相关文章:

  • MYSQL索引与视图
  • 劳务报酬所得税
  • MySQL第四次实验
  • 结合深度学习、自然语言处理(NLP)与多准则决策的三阶段技术框架,旨在实现从消费者情感分析到个性化决策
  • [高等数学]曲率
  • 蓝桥杯之c++入门(六)【string(practice)】
  • mapbox进阶,添加绘图扩展插件,绘制圆形
  • spring boot接收请求常用注解
  • 【华为OD机考】华为OD笔试真题解析(1)--AI处理器组合
  • 音视频的文件封装——AVI、MP4、MKV
  • [深度学习]神经网络-回归项目
  • Unity游戏(Assault空对地打击)开发(7) 爆炸效果
  • 前沿型CLI库——Clipanion
  • Qt 获取鼠标所在点颜色的RGB值,考虑多屏幕情况
  • 机器学习 - 容易混淆的目标函数和损失函数
  • 借助 Cursor 快速实现小程序前端开发
  • 探秘数据结构之单链表:从原理到实战的深度解析
  • ​零技术开始,但想用 Next.js 基于 React 构建一个类似 18Touch 的网站​
  • 【开源项目】数字孪生武汉~超经典智慧城市CIM/BIM数字孪生可视化项目——开源工程及源码
  • (文末提供数据集下载)ML.NET库学习001:基于PCA的信用卡异常检查之样本处理与训练
  • 如何在Windows上使用Docker
  • OCR与多模态大模型的关系
  • PDF转图片及拼接- ImageMagick
  • 【学习笔记】OpenGL的基础纹理贴图相关知识
  • HarmonyOS 5.0应用开发——ContentSlot的使用
  • PyMysql 快速入门——Python 操作 MySQL 数据库的利器