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

【FFmpeg】拉流

概述

项目实践中涉及到使用ffmpeg进行推流和拉流操作,本文主要对一些基本操作做一个学习总结,后续再学习其源码架构;总结方法遵循实现功能配合函数具体实现

基本使用

拉流

    avformat_network_init();//日志输出等级set_ffmpeg_log_level();AVFormatContext *fmt_ctx = NULL;AVPacket *pkt = av_packet_alloc();if (avformat_open_input(&fmt_ctx, "rtsp://127.0.0.1/live/test", NULL, NULL) < 0) {fprintf(stderr, "无法打开输入文件\n");return -1;}if (avformat_find_stream_info(fmt_ctx, NULL) < 0) {fprintf(stderr, "无法获取流信息\n");return -1;}int video_stream_idx = -1;for (int i = 0; i < fmt_ctx->nb_streams; i++) {if (fmt_ctx->streams[i]->codecpar->codec_type == AVMEDIA_TYPE_VIDEO) {video_stream_idx = i;break;}}if (video_stream_idx == -1) {fprintf(stderr, "未找到视频流\n");return -1;}while (av_read_frame(fmt_ctx, pkt) >= 0) {if (pkt->stream_index == video_stream_idx) {process_packet(pkt);}av_packet_unref(pkt);}av_packet_free(&pkt);avformat_close_input(&fmt_ctx);

avformat_open_input

主要就是打开一个流,一般用到的是RTSP流地址 

int avformat_open_input(AVFormatContext **ps, const char *url, AVInputFormat *fmt, AVDictionary **options);

参数说明:

  • ps:指向 AVFormatContext 指针的指针,AVFormatContext 是 FFmpeg 用来保存流媒体格式信息的结构体,包含了与流格式相关的详细信息,比如流的类型、码流、解码器、流的数量等。在函数调用后,这个指针会指向包含所有文件格式信息的上下文。
  • url:输入流的 URL 或路径。对于 RTSP 流,它可能是一个 RTSP 地址,如 rtsp://example.com/stream
  • fmt:输入格式,通常是 NULL,FFmpeg 会自动选择合适的格式。如果指定了格式,FFmpeg 将强制使用这个格式
  • options:一个可选的字典,用来设置额外的选项。可以设置输入流的一些参数,如缓冲区大小、最大延迟等

返回值:

  • 0:成功打开输入流
  • 负值:失败,返回错误代码

avformat_find_stream_info

解析流的内容,主要用于后续的解码播放操作。

int avformat_find_stream_info(AVFormatContext *ic, AVDictionary **options);

参数说明:

  • ic:指向 AVFormatContext 结构体的指针,包含了与媒体文件或流的格式相关的信息。这个结构体通常在调用 avformat_open_input 时已经创建并初始化。
  • options:一个可选的字典,包含额外的选项,例如超时、缓冲区大小等参数,通常为 NULL

返回值:

  • 0:成功提取流信息。
  • 负值:失败,返回错误代码

av_read_frame

从RTSP流中读取数据包,一般该数据包中都是压缩了数据,其中包含音视频等数据

  • 输入参数:AVFormatContext *fmt_ctx,媒体流的上下文。
  • 输出:返回值是一个整数,成功时返回 0,失败时返回负值。数据包会存储在 AVPacket *pkt 中,pkt 包含读取到的音视频数据

 AVFormatContext

该结构体中主要用于存储流媒体格式信息

typedef struct AVFormatContext {const AVClass *av_class;unsigned int flags;AVInputFormat *iformat;AVOutputFormat *oformat;int nb_streams;AVStream **streams;AVCodecContext *codec;// 其他字段...
} AVFormatContext;
  • av_class:FFmpeg 的类系统用于描述 AVFormatContext 的类信息。
  • flags:流的标志位,通常是 0 或其他标志。
  • iformat:指向输入流格式的指针。
  • oformat:指向输出流格式的指针。
  • nb_streams:流的数量,通常是音频和视频流的总数。
  • streams:指向 AVStream 结构体数组的指针,每个 AVStream 对应一个音频或视频流。
  • codec:指向解码器上下文的指针,包含解码器的设置和状态。
http://www.lryc.cn/news/543548.html

相关文章:

  • LangChain构建行业知识库实践:从架构设计到生产部署全指南
  • 解决jupyter notebook不是内部或外部命令问题
  • MySQL----case的用法
  • Unity XR-XR Interaction Toolkit开发使用方法(十)组件介绍(XR Interaction Group)
  • 深入理解 并查集LRUCaChe
  • 详解 c++ 中的 namespage
  • 50周学习go语言:第五周 复合类型与词频统计
  • HTTP非流式请求 vs HTTP流式请求
  • 深圳南柯电子|医疗设备EMC测试整改检测:零到一,保障医疗安全
  • 详解:事务注解 @Transactional
  • 【虚拟仪器技术】labview操作指南和虚拟仪器技术习题答案(一)
  • 在Linux桌面上创建Idea启动快捷方式
  • 渗透测试(WAF过滤information_schema库的绕过,sqllib-46关,海洋cms9版本的注入)
  • Unity基础——资源导出分享为Unity Package
  • C语言【指针篇】(三)
  • DevSecOps普及:安全与开发运维的深度融合
  • 【JAVA-数据结构】Map和Set
  • 从 0 到 1,用 Python 构建超实用 Web 实时聊天应用
  • 轻松搭建:使用Anaconda创建虚拟环境并在PyCharm中配置
  • 【新人系列】Python 入门专栏合集
  • linux ununtu安装mysql 怎么在my.cnf文件里临时配置 无密码登录
  • git,bash - 从一个远端git库只下载一个文件的方法
  • python生成的exe文件防止反编译(pyinstaller加密)
  • Android移动应用开发实践-1-下载安装和简单使用Android Studio 3.5.2版本(频频出错)
  • Android Audio实战——音频相关基础概念(附)
  • 5分钟使用Docker部署Paint Board快速打造专属在线画板应用
  • vue实现根据点击或滑动展示对应高亮
  • java练习(41)
  • 【二分查找 图论】P8794 [蓝桥杯 2022 国 A] 环境治理|普及
  • Docker镜像面试题及参考答案