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

这篇具有很好参考价值的文章主要介绍了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把RTSP流分段录制成MP4,如果能把ffmpeg.exe改成ffmpeg.dll用,那音视频开发的难度直接就降一个维度啊,ffmpeg,ffmpeg,EasyAVFilter,RTSP转MP4,RTSP转RTMP,RTSP转HLS

方案二:可以直接调用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,具体用法和场景,后续逐步介绍;文章来源地址https://www.toymoban.com/news/detail-687105.html

到了这里,关于ffmpeg把RTSP流分段录制成MP4,如果能把ffmpeg.exe改成ffmpeg.dll用,那音视频开发的难度直接就降一个维度啊的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • Web_单一视频文件mp4转换为m3u分段ts文件实现边下边播

    Builds - CODEX FFMPEG @ gyan.dev 先解压缩,会看到如下结构: 进入bin目录, 把需要转换的视频文件复制过来 ,同时 新建一个文件夹 用来存放转换后的文件,然后按住Shift键同时单击鼠标右键,选择打开Powershell窗口: 输入以下命令(根据实际修改)后按Enter键: ffmpeg -i 源视频名字

    2024年02月10日
    浏览(42)
  • FFMPEG mp4封装实现

    FFMPEG mp4录像 author:lyn date:2022.09.28 version: ffmpeg4.1.3 1.mp4数据结构 2.ffmpeg mp4封装实现 3.mp4函数调用关系 4.参考资料 1.mp4数据结构 1.1mp4简介 MP4或称MPEG-4第14部分(英语:MPEG-4 Part 14)是一种标准的数字多媒体容器格式。MPEG-4第14部分的扩展名为 .mp4 ,以存储数字音频及数字视频

    2023年04月08日
    浏览(36)
  • ffmpeg操作MP4视频封面

    提取视频封面 视频流中提取帧图 3.重新设置视频封面 更多参考: https://blog.csdn.net/m0_37624402/article/details/125123818

    2024年02月04日
    浏览(44)
  • 将mp4视频推流rtsp,并转为http直播流,在前端显示

    最近有个需求,在vue页面的video组件播放直播流,本来想用flv.js,但是必须要flv格式才行,所以还是用原生video播放http直播流。 1. 将本地mp4推流rtsp 下载并解压EasyDarwin,双击EasyDarwin.exe运行,在控制台可以看到开启了两个服务,一个是rtsp服务端,一个是http服务。访问http://l

    2024年02月12日
    浏览(48)
  • 20231005使用ffmpeg旋转MP4视频

    20231005使用ffmpeg旋转MP4视频 2023/10/5 12:21 百度搜搜:ffmpeg 旋转90度 https://zhuanlan.zhihu.com/p/637790915 【FFmpeg实战】FFMPEG常用命令行 https://blog.csdn.net/weixin_37515325/article/details/127817057 FFMPEG常用命令行 5.视频旋转 顺时针旋转90度:ffmpeg -i test.mp4 -vf \\\"transpose=1\\\" out.mp4//顺时针旋转90° 逆时针

    2024年02月07日
    浏览(49)
  • video.js 视频截图、录制、自定义全屏,hls、flv、mp4视频播放

    功能 video.js内嵌 截图、录制功能 (图片、视频会下载到本地) 自定义全屏 播放hls、flv、mp4 功能集合成Vue组件 参考 video.js components RecordRTC demo video 截图并下载 video.js添加自定义组件的方法 使用RecordRTC对video视频进行录制 播放hls、flv、mp4 安装 引入 html 引入组件(视频地址使

    2023年04月08日
    浏览(46)
  • ffmpeg批量转换mpg为mp4

    1、新建一个txt文件,并复制如下代码进入,然后保存。 2、把文件后缀修改为bat 。 3、把后缀为bat的文件放到要批量处理的视频文件夹里面。 4、在确保安装了ffmpeg的情况下,双击bat文件执行即可。 5、参数说明: -i          输入文件,这里指的就是视频文件。 -y       

    2024年02月13日
    浏览(50)
  • ffmpeg ts列表合并为mp4

    操作系统:ubuntu 注意事项: 1.ts文件顺序必须正确,也就是下一帧的dst和pst要比上一帧的大,否则会报错 2.codecpar-codec_tag要设置为0,否则报错Tag [27][0][0][0] incompatible with output codec id ‘27’ (avc1) 3.设置output的max_streams数目,默认是1000,超过此数目就会报错

    2024年02月13日
    浏览(53)
  • ffmpeg从MP4中取出wav音频

    要从 MP4 文件中提取出 WAV 音频,你可以使用 FFmpeg 工具。请按照以下步骤进行操作: 1. 下载 FFmpeg:首先,你需要下载 FFmpeg 工具。你可以在 FFmpeg 官方网站(https://ffmpeg.org/)上找到适用于 Windows 的预编译版本。下载后,解压缩到一个方便的位置。 2. 打开命令提示符:按下

    2024年02月03日
    浏览(51)
  • FFmpeg将编码后数据保存成mp4

          以下测试代码实现的功能是:持续从内存块中获取原始数据,然后依次进行解码、编码、最后保存成mp4视频文件。       可保存成单个视频文件,也可指定每个视频文件的总帧数,保存多个视频文件。       为了便于查看和修改,这里将可独立的程序段存放在单个函

    2024年02月13日
    浏览(43)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包