ffmpeg把RTSP流分段录制成MP4,如果能把ffmpeg.exe改成ffmpeg.dll用,那音视频开发的难度直接就降一个维度啊
比如,原来我们要用ffmpeg录一段RTSP视频流转成MP4,我们有两种方案:
方案一:可以使用以下命令将rtsp流分段存储为mp4文件
ffmpeg -i rtsp://example.com/stream -vcodec copy -acodec aac -f segment -segment_time 3600 -reset_timestamps 1 -strftime 1 output_%Y-%m-%d_%H-%M-%S.mp4

方案二:可以直接调用ffmpeg库avcodec、avfilter代码,有门槛,要研究,用大模型生成一段代码看看:
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <unistd.h>
#include <sys/types.h>
#include <sys/wait.h>
#include <fcntl.h>
#include <errno.h>
#include <math.h>
#include <time.h>extern "C" {#include <libavcodec/avcodec.h>#include <libavformat/avformat.h>#include <libswscale/swscale.h>
}int main(int argc, char **argv) {AVFormatContext *pFormatCtx = NULL;int videoStream;AVCodecContext *pCodecCtx = NULL;AVCodec *pCodec = NULL;AVPacket packet;FILE *videoFile = NULL;struct SwsContext *img_convert_ctx;int64_t start_time, end_time, duration;double framerate = 25.0; // 帧率,需要根据实际情况调整int i, ret, got_output;uint8_t *outbuf[1024]; // 输出缓冲区大小,需要根据实际情况调整int outbuf_size; // 输出缓冲区大小,需要根据实际情况调整start_time = (int64_t)time(NULL); // 开始时间,单位为秒videoFile = fopen("output.ts", "wb"); // 输出文件名,需要根据实际情况调整if (!videoFile) {printf("Could not open output file for writing
");return -1;}outbuf_size = av_image_get_buffer_size((AVPixelFormat)AV_PIX_FMT_YUV420P, videoStream, 1920, 1080, 1); // 获取输出缓冲区大小,需要根据实际情况调整outbuf = (uint8_t*)av_malloc(outbuf_size); // 分配输出缓冲区,需要根据实际情况调整ret = avformat_new_stream(&pFormatCtx, NULL); // 创建视频流上下文,需要根据实际情况调整if (ret < 0) {printf("Error: could not create output format context
");exit(1);} else {ret = avcodec_parameters_to_context(pCodecCtx, pFormatCtx->streams[videoStream]->codecpar); // 设置解码器参数,需要根据实际情况调整if (ret < 0) {printf("Error: could not initialize the codec context
");exit(1);} else {ret = avcodec_open2(pCodecCtx, pCodec, NULL); // 打开解码器,需要根据实际情况调整if (ret < 0) {printf("Error: Could not open codec
");exit(1);} else {while (1) { // 循环处理视频流数据,需要根据实际情况调整ret = av_read_frame(pFormatCtx, &packet); // 读取视频帧数据,需要根据实际情况调整if (ret == 0) { // 如果读取到数据包,则进行处理,需要根据实际情况调整// ... 在这里添加你的代码来处理视频帧数据 ...} else if (ret < 0 && ret != AVERROR(EAGAIN)) { // 如果发生错误,则打印错误信息并退出程序,需要根据实际情况调整char errorbuf[1024];av_strerror(ret, errorbuf, sizeof(errorbuf));printf("%s
", errorbuf);exit(1);} else if (ret == AVERROR(EAGAIN)) { // 如果发生EAGAIN错误,则等待一段时间后继续读取数据包,需要根据实际情况调整usleep(200000); // 等待200ms,单位为微秒,需要根据实际情况调整} else if (ret == AVERROR_EOF) { // 如果发生EOF错误,则表示已经读取完所有数据包,需要根据实际情况调整break; // 结束循环,需要根据实际情况调整} else if (ret < 0 && ret != AVERROR(EAGAIN)) { // 如果发生其他错误,则打印错误信息并退出程序,需要根据实际情况调整char errorbuf[1024];av_strerror(ret, errorbuf, sizeof(errorbuf));printf("%s
", errorbuf);exit(1);} else if (ret >= 0) { // 如果成功读取到数据包,则进行处理,需要根据实际情况调整// ... 在这里添加你的代码来处理视频帧数据 ...} else { // 如果发生未知错误,则打印错误信息并退出程序,需要根据实际情况调整char errorbuf[1024];av_strerror(ret, errorbuf, sizeof(errorbuf));printf("%s
", errorbuf);exit(1);}} // while循环结束条件 ... 在这里添加你的代码 ... } } } } /* end of main() */
- 方案一通过exec调用,但是有一个弊端就是不好控制,不能自动重连,进程管理需要不断自己维护;
- 方案二就是开发成本较高,太复杂了,不同级别的开发写出来的效果参差不齐;
有没有一个能把方案一和方案二结合起来的方法?
有,他来了:EasyAVFilter!简单的几个接口,就能解决ffmpeg开发门槛的问题:
| 方法名称 | 说明 |
|---|---|
| EasyAVFilter_Create | 创建句柄,相当于创建了一个ffmpeg.exe |
| EasyAVFilter_Release | 释放句柄 |
| EasyAVFilter_SetCallback | 设置回调函数和自定义指针,回调过程中的各种媒体信息/连接信息/转码进度 |
| EasyAVFilter_AddInput | 添加输入参数(源地址) |
| EasyAVFilter_AddFilter | 添加中间参数,如:转码,兼容ffmpeg命令所有参数(例如-vcodec copy -acodec aac) |
| EasyAVFilter_SetOutput | 设置输出参数(目标地址) |
| EasyAVFilter_GetFilters | 获取所有参数(review参数输入是否正确) |
| EasyAVFilter_Start | 开始工作 |
| EasyAVFilter_Stop | 停止工作 |
详细信息可以直接看https://www.easydarwin.org/tools/153.html,具体用法和场景,后续逐步介绍;
相关文章:
ffmpeg把RTSP流分段录制成MP4,如果能把ffmpeg.exe改成ffmpeg.dll用,那音视频开发的难度直接就降一个维度啊
比如,原来我们要用ffmpeg录一段RTSP视频流转成MP4,我们有两种方案: 方案一:可以使用以下命令将rtsp流分段存储为mp4文件 ffmpeg -i rtsp://example.com/stream -vcodec copy -acodec aac -f segment -segment_time 3600 -reset_t…...
朝夕光年游戏自动化测试实践
朝夕光年是面向全球用户与开发者的游戏研发与发行业务品牌,致力于服务全球玩家,帮助玩家在令人惊叹的虚拟世界中一起玩耍与创造。 在游戏的研发过程中,游戏自动化一直是开展难度较大的工程,具体包括机房机架、设备调度、软件框架、…...
数据结构基本概念
一、数据 数据对象-数据元素-数据项(属性),前者由后者组成 二、数据结构 定义:按某种关系的数据元素的集合 三、数据类型 1、原子类型(例如整型) 2、结构类型(由原子类型组成,例如数组) 3、…...
【javaweb】学习日记Day9 - Mybatis 基础操作
目录 一、删除 (1)在mapper接口执行sql删除语句 ① 注解后sql语句没有提示怎么办? (2)测试层 (3)开启mybatis日志 (4)预编译SQL 二、新增 (1&#…...
Mybatis学习|Mybatis缓存:一级缓存、二级缓存
Mybatis缓存 MyBatis包含一个非常强大的查询缓存特性,它可以非常方便地定制和配置缓存。缓存可以极大的提升查询效率。 MyBatis系统中默认定义了两级缓存:一级缓存和二级缓存 默认情况下,只有一级缓存开启。(SqlSession级别的缓存,也称为本地…...
230903文本docx
处理文本 块级项目,每次文本超出右边界时都会添加一行.对段落,边界一般是页边距,但如果按列布局页,则也可是列边界,如果表格单元格内有段,则也可是单元格边界. 块级项属性指定其在页上的位置,如缩进项及段落前后间距.内联项属性一般指定显示内容的如字样,字体大小,粗体和斜体…...
Mysql-DML(数据处理语言)
-- 插入数据 insert into member values(1,张三,21,5000); insert into member(id,name) values(2,李四); insert into member values(3,王五,23,3000) ,(4,纪六,24,4000) ,(5,查七,25,5000); -- 更新(修改数据) 不加限制条件 该字段全部修改 update member set age…...
部署项目至服务器
安装conda https://zhuanlan.zhihu.com/p/489499097 个人租借的服务器如何进行端口的开放呢? 防火墙设置: 添加规则设置: 即可; 通常下租借的服务器没有防火墙设置 相关链接: https://blog.csdn.net/weixin_4520…...
OSI与TCP IP各层的结构与功能,都有哪些协议
分析&回答 OSI七层模型 层功能TCP/IP协议族应用层文件传输,电子邮件,文件服务,虚拟终端TFTP,HTTP,SNMP,FTP,SMTP,DNS,Telnet表示层数据格式化,代码转换…...
【2023年11月第四版教材】第10章《进度管理》(第三部分)
第10章《进度管理》(第三部分) 7 估算活动持续时间7.1 估算活动持续时间7.2 类比估算★★★7.3 参数估算★★★7.4 三点估算★★★7.5 数据分析★★★ 7 估算活动持续时间 组过程输入工具和技术输出计划4,估算活动持续时间1.项目管理计划(进…...
【Vuex状态管理】Vuex的基本使用;核心概念State、Getters、Mutations、Actions、Modules的基本使用
目录 1_应用状态管理1.1_状态管理1.2_复杂的状态管理1.3_Vuex的状态管理 2_Vuex的基本使用2.1_安装2.2_创建Store2.3_组件中使用store 3_核心概念State3.1_单一状态树3.2_组件获取状态3.3_在setup中使用mapState 4_核心概念Getters4.1_getters的基本使用4.2_getters第二个参数4…...
Linux centos7 bash编程(循环与条件判断)
在编程训练中,循环结构与条件判断十分重要。 根据条件为真为假确定是否执行循环。 有时,根据条件的真假结果,决定执行哪些语句,这就是分支语句。 为了训练分支语句与循环语句,我们设计一个案例: 求一组…...
设计模式-6--装饰者模式(Decorator Pattern)
一、什么是装饰者模式(Decorator Pattern) 装饰者模式(Decorator Pattern)是一种结构型设计模式,它允许你在不修改现有对象的情况下,动态地将新功能附加到对象上。这种模式通过创建一个包装类,…...
质量属性案例-架构真题(二十一)
试题一 某电子商务公司升级会员与促销管理系统,向用户提交个性化服务,提高用户粘性。在项目建立之初,公司领导人一致认为目标是提升会员管理方式的灵活性,由于当前用户规模不大,用户简单,系统方面不需要做…...
nacos Error to process server push response
nacos2.0.3报错: Error to process server push response 解决办法: 排查项目当中有没有直接或间接依赖reflections: <dependency><groupId>org.reflections</groupId><artifactId>reflections</artifactId>…...
神经网络NLP基础 循环神经网络 LSTM
用的时候,只关心token的输入,以及hidden state就好了 sequence的length是多少,lstm的cell的数量就是多少 LSTM BI-LSTM stacked lstm GRU 实现...
Oracle数据传输加密方法
服务器端“dbhome_1\NETWORK\ADMIN\”sqlnet.ora文件中添加 SQLNET.ENCRYPTION_SERVER requested SQLNET.ENCRYPTION_TYPES_SERVER (RC4_256) 添加后新的链接即刻生效,服务器无需重新启动。 也可以通过Net manager管理工具添加 各个参数含义如下: 是…...
Android列表片段
下面创建第二个片段WorkoutFragment,它包含不同训练项目构成的一个列表,用户可以从这个列表中选择训练项目。 列表视图是只包含一个列表的片段 列表片段是一种专门处理列表的片段,它会自动绑定到一个列表视图,所以不需要另外创建…...
【元宇宙】智能手机万岁
凭借出色的新设备,我们很快就能进人元字宙,想象这样的情景是很趣的。但是,至少到21世纪20年代,元宇宙时代的大多数设备很可能是我们已经在使用的设备。 AR 和 VR 设备不仅面临重大的技术、财务和体验障碍,而且它们在上…...
华为mate60的发布代表着什么?有什么意义?
华为Mate60的发布代表着华为在技术领域的持续突破和创新。该产品预计将引入更强大的处理器、更高分辨率的屏幕、更强大的摄像头等前沿技术,进一步巩固华为在技术领域的领先地位。 此外,华为Mate60的发布还具有重塑品牌形象的意义。在美国制裁下ÿ…...
调用支付宝接口响应40004 SYSTEM_ERROR问题排查
在对接支付宝API的时候,遇到了一些问题,记录一下排查过程。 Body:{"datadigital_fincloud_generalsaas_face_certify_initialize_response":{"msg":"Business Failed","code":"40004","sub_msg…...
通过Wrangler CLI在worker中创建数据库和表
官方使用文档:Getting started Cloudflare D1 docs 创建数据库 在命令行中执行完成之后,会在本地和远程创建数据库: npx wranglerlatest d1 create prod-d1-tutorial 在cf中就可以看到数据库: 现在,您的Cloudfla…...
深入浅出:JavaScript 中的 `window.crypto.getRandomValues()` 方法
深入浅出:JavaScript 中的 window.crypto.getRandomValues() 方法 在现代 Web 开发中,随机数的生成看似简单,却隐藏着许多玄机。无论是生成密码、加密密钥,还是创建安全令牌,随机数的质量直接关系到系统的安全性。Jav…...
基于Flask实现的医疗保险欺诈识别监测模型
基于Flask实现的医疗保险欺诈识别监测模型 项目截图 项目简介 社会医疗保险是国家通过立法形式强制实施,由雇主和个人按一定比例缴纳保险费,建立社会医疗保险基金,支付雇员医疗费用的一种医疗保险制度, 它是促进社会文明和进步的…...
UE5 学习系列(三)创建和移动物体
这篇博客是该系列的第三篇,是在之前两篇博客的基础上展开,主要介绍如何在操作界面中创建和拖动物体,这篇博客跟随的视频链接如下: B 站视频:s03-创建和移动物体 如果你不打算开之前的博客并且对UE5 比较熟的话按照以…...
在 Nginx Stream 层“改写”MQTT ngx_stream_mqtt_filter_module
1、为什么要修改 CONNECT 报文? 多租户隔离:自动为接入设备追加租户前缀,后端按 ClientID 拆分队列。零代码鉴权:将入站用户名替换为 OAuth Access-Token,后端 Broker 统一校验。灰度发布:根据 IP/地理位写…...
1.3 VSCode安装与环境配置
进入网址Visual Studio Code - Code Editing. Redefined下载.deb文件,然后打开终端,进入下载文件夹,键入命令 sudo dpkg -i code_1.100.3-1748872405_amd64.deb 在终端键入命令code即启动vscode 需要安装插件列表 1.Chinese简化 2.ros …...
【2025年】解决Burpsuite抓不到https包的问题
环境:windows11 burpsuite:2025.5 在抓取https网站时,burpsuite抓取不到https数据包,只显示: 解决该问题只需如下三个步骤: 1、浏览器中访问 http://burp 2、下载 CA certificate 证书 3、在设置--隐私与安全--…...
高危文件识别的常用算法:原理、应用与企业场景
高危文件识别的常用算法:原理、应用与企业场景 高危文件识别旨在检测可能导致安全威胁的文件,如包含恶意代码、敏感数据或欺诈内容的文档,在企业协同办公环境中(如Teams、Google Workspace)尤为重要。结合大模型技术&…...
三体问题详解
从物理学角度,三体问题之所以不稳定,是因为三个天体在万有引力作用下相互作用,形成一个非线性耦合系统。我们可以从牛顿经典力学出发,列出具体的运动方程,并说明为何这个系统本质上是混沌的,无法得到一般解…...
