ffmpeg把RTSP流分段录制成MP4,如果能把ffmpeg.exe改成ffmpeg.dll用,那音视频开发的难度直接就降一个维度啊

news2024/10/6 12:35:34

比如,原来我们要用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将RTSP录像成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,具体用法和场景,后续逐步介绍;

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/954311.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

ubuntu20.04+ROS noetic在线运行单USB双目ORB_SLAM

双目摄像头主要有以下几种&#xff0c;各有优缺点。 1.单USB插口&#xff0c;左右图像单独输出2.双USB插口&#xff0c;左右图像单独输出&#xff08;可能存在同步性问题&#xff09;3.双USB插口&#xff0c;左右图像合成输出4.单USB插口&#xff0c;左右图像合成输出 官方版…

【C++】线程安全问题

原子类型非线程安全 #include <iostream> #include <thread>int main() {int num 0;int count 100000;std::thread thread1([&](){for(int i 0; i < count; i){num;}});std::thread thread2([&](){for(int i 0; i < count; i){num;}});std::thr…

jsp+servlet零食商城java网上购物超市Mysql源代码

本项目为前几天收费帮学妹做的一个项目&#xff0c;Java EE JSP项目&#xff0c;在工作环境中基本使用不到&#xff0c;但是很多学校把这个当作编程入门的项目来做&#xff0c;故分享出本项目供初学者参考。 一、项目介绍 项目名:网上零食商城 技术栈 jspservlet 系统有3权限…

动静分红,循环购模式:微三云门门

动静分红&#xff0c;循环购模式&#xff1a;微三云门门 商业模式概述&#xff1a; 动静分红&#xff0c;循环购模式是一种创新商业模式&#xff0c;旨在解决平台用户复购率和C端裂变的难题。该模式以能量值和贡献值为核心资产&#xff0c;结合动态和静态奖金池&#xff0c;为…

产品展示视频拍摄制作流程

通过精心策划和制作的产品展示视频&#xff0c;展示产品的独特魅力和卓越功能。激发受众对产品的兴趣和购买欲望。为了确保产品展示视频的制作质量和效果&#xff0c;需要团队一起探讨具体的拍摄制作流程。深圳产品活动视频制作公司老友记小编为您分析产品展示视频的拍摄制作过…

中国人民大学与加拿大女王金融硕士——为什么读金融硕士,这些理由够不够?

金融硕士要不要读&#xff1f;身在金融行业的我们拥有的本科学历还够用吗&#xff1f;随着教育的发展&#xff0c;高学历的人才越来越多。金融行业好多职位的招聘门槛已经提升到硕士学历了。面对职场高学历人才的涌入&#xff0c;对于在职的我们来说&#xff0c;是一种潜在的压…

【STM32】IIC的初步使用

IIC简介 物理层 连接多个devices 它是一个支持设备的总线。“总线”指多个设备共用的信号线。在一个 I2C 通讯总线中&#xff0c;可连接多个 I2C 通讯设备&#xff0c;支持多个通讯主机及多个通讯从机。 两根线 一个 I2C 总线只使用两条总线线路&#xff0c;一条双向串行数…

linux————pxe网络批量装机

目录 一、概述 什么是pxe pxe组件 二、搭建交互式pxe装机 一、配置基础环境 二、配置vsftpd 三、配置tftp 四、准备pxelinx.0文件、引导文件、内核文件 一、准备pxelinux.0 二、准备引导文件、内核文件 五、配置dhcp 一、安装dhcp 二、配置dhcp 六、创建default文…

要用linux,不会shell 基本语法搞不来~

01.变量 1、环境变量 echo $PATH 2、自定义变量 hello"hello_world" echo $hello 3、存储 Linux 命令执行结果作为变量 (2 种方式&#xff0c;推荐使用第二中&#xff0c;第一种是 ~键上面的斜点比较难识别) filesls -al path(pwd)注意点定义变量号两边不能有空…

koa路由自动注册

安装 pnpm install require-directory 路由加载 static initRouters() {// 绝对路径const apiDir ${process.cwd()}/router;// 自动加载路由requireDirectory(module, apiDir, {visit: whenLoadModule});// 判断加载模块是否是路由function whenLoadModule(obj) {if (obj i…

小白带你学习linux的ELK日志收集系统

目录 目录 一、概述 1、ELK由三个组件构成 2、作用 3、为什么使用&#xff1f; 二、组件 1、elasticsearch 2、logstash 3、kibana 三、架构类型 1、ELK 2、ELKK 3、ELFK 4、ELFKK 四、ELK日志收集系统集群实验 1、实验拓扑 2、环境配置 3、 安装node1与node2…

算法设计 || 第12题:12皇后回溯算法(C语言代码)

之前关于8皇后更详细总结&#xff1a; 算法设计 || 实验四 回溯算法-八皇后问题&#xff08;纯手敲保姆级详细讲解小白适用头歌解析&#xff09;_MSY&#xff5e;学习日记分享的博客-CSDN博客 学习的功夫一定要在平时&#xff0c;这样你考试前不必慌张&#xff0c;不用着急&a…

Leetcode54螺旋矩阵

思路&#xff1a;用set记录走过的地方&#xff0c;记下走的方向&#xff0c;根据方向碰壁变换 class Solution:def spiralOrder(self, matrix: list[list[int]]) -> list[int]:max_rows len(matrix)max_cols len(matrix[0])block_nums max_cols * max_rowscount 1i 0j…

这个 web 自动化测试框架真香 ,selenium进阶pro plus版

在 web 自动化测试当中&#xff0c; selenium 架构应该是很难绕过的&#xff0c;很多宣称要超 selenium 的下一代 web 自动化测试框架最终都败下阵来。 不过&#xff0c; selenium 的 api 确实比较复杂&#xff0c;所以也有很多库尝试对他进行上层封装&#xff0c;splinter 是其…

Ubuntu18.04安装cuDNN

注册账号 https://developer.nvidia.com/rdp/cudnn-archive 该网站下载安装包需要先进行注册。登录成功后&#xff0c;找到与CUDA对应的版本。 选择Linux版本进行下载。 下载后的格式为.tar.xz 解压 tar xvJf cudnn-linux-x86_64-8.9.3.28_cuda12-archive.tar.xz配置环境 su…

全新配色 smart 精灵#1 BRABUS性能版于成都车展正式上市

新奢智能纯电汽车品牌smart携旗下全系车型&#xff0c;盛大亮相第二十六届成都国际汽车展览会&#xff08;4号馆H402展台&#xff09;。此次车展上&#xff0c;smart首次公开披露智能驾驶技术迭代战略路线、“南拓西进”全球化市场布局策略&#xff0c;加速成为全球领先的智能纯…

运动耳机怎么选、运动耳机排行榜前十名推荐

对于热爱跑步和运动的人来说&#xff0c;音乐是最好的伴侣&#xff0c;可以消除孤独感和乏味。随着蓝牙无线耳机的出现&#xff0c;耳机的无线化给我们的生活带来了巨大改变&#xff0c;特别是在运动场景下&#xff0c;蓝牙无线耳机的优势更加明显。然而&#xff0c;在选择适合…

网工内推 | 信息安全工程师,五险一金,技术氛围浓厚

01 正佳科技 招聘岗位&#xff1a;信息安全工程师 职责描述&#xff1a; 1、负责运维管理IT基础设施&#xff0c;包括数据中心、网络、安全等&#xff1b; 2、负责公司内外网络的策略调整&#xff0c;安全策略、网络准入等的推进及优化&#xff1b; 3、负责建设、完善公司信息…

python购物程序

本文主要内容&#xff1a;用python实现一个购物程序 功能介绍&#xff1a; 1、显示商品列表 2、根据输入的工资判断是否能买得起选择的商品 3、购物车存放已经购买的商品 #1.购物车程序 # 输入工资 while True:wage input("请输入您的工资:")if not wage.isdigit()…

语音专线如何接入呼叫中心系统

想要了解语音专线是否可以接入呼叫中心系统&#xff0c;首先要分别了解什么是语音专线和什么是呼叫中心系统。语音专线接入呼叫中心系统想要实现什么功能&#xff0c;下面小易就来科普一下。 什么是语音专线&#xff1f;语音专线可以理解为联通、电信、移动运营商提供的一种语音…