使用ffmpeg将实时流保存为AVI

2023-05-16

项目中需要将编码器编码出的H264数据保存为avi格式文件。使用ffmpeg接口进行实现。

ffmpeg一般是直接打开本地视频文件(如avi、mp4等)或者网络视频流(如:rtmp流媒体等),只需要直接将本地视频文件名或者流媒体的URL作为avformat_open_input的参数即可。但是这次的项目中,则需要直接将编码器编码出的H264流保存为avi文件。原本准备参考雷神的《ffmpeg 从内存中读取数据(或将数据输出到内存)》,但是这样对现有的程序结构改动比较大,因此考虑更为直接的方式,跳过avformat_open_input过程:

#include "libavformat/avformat.h"

int main(int argc, char **argv)
{
    int ret;
    char buf[] = "";
    AVOutputFormat *ofmt_ctx = NULL;
    AVStream *out_stream = NULL;
    AVPacket pkt = { 0 };
    
    av_register_all();
    av_log_set_level(AV_LOG_DEBUG); /* allocate the output media context */
    
    avformat_alloc_output_context2(&ofmt_ctx, NULL, NULL, filename);
    if (!ofmt_ctx) {
        printf("Could not deduce output format from file extension: using AVI.\n");
        avformat_alloc_output_context2(&ofmt_ctx, NULL, "avi", filename);
    }
    if(!ofmt_ctx) {
        goto exit;
    }
    out_stream = avformat_new_stream(ofmt_ctx, NULL);
    if (!out_stream) {
        printf( "Failed allocating output stream\n");
        ret = AVERROR_UNKNOWN; goto exit;
    }
    AVCodecContext *avctx = out_stream->codec;
    avctx->codec_type = AVMEDIA_TYPE_VIDEO; /*此处,需指定编码后的H264数据的分辨率、帧率及码率*/
    avctx->codec_id = AV_CODEC_ID_H264;
    avctx->bit_rate = 2000000;
    avctx->width = 640;
    avctx->height = 480;
    avctx->time_base.num = 1;
    avctx->time_base.den = 30; /* print output stream information*/
    av_dump_format(ofmt_ctx, 0, filename, 1);
    
    if (!(ofmt->flags & AVFMT_NOFILE)) {
        ret = avio_open(&ofmt_ctx->pb, filename, AVIO_FLAG_WRITE);
        if (ret < 0) {
            printf( "Could not open output file '%s'\n", filename); goto exit;
        }
        printf("Open output file success!\n");
    }
    
    //写文件头(Write file header)  
    ret = avformat_write_header(ofmt_ctx, NULL);
    if (ret < 0) {
        printf( "write avi file header failed\n");
        goto exit;
    }
    printf("Write avi header success!\n");
    while(...) {
        av_init_packet(&pkt);
        
        // get a video frame(从编码器获取一帧编码后的H264数据) ...
        // determine whether the I frame
        if (/* I frame */) {
            // 判断该H264帧是否为I帧
            pkt.flags |= AV_PKT_FLAG_KEY;
        } else { /* p frame*/
            pkt.flags = 0;
        }
        pkt.dts = pkt.pts = AV_NOPTS_VALUE;
        pkt.size = size; /*帧大小*/
        pkt.data = data; /*帧数据*/
        if(!pkt.data) {
            printf("no data\n");
        }
        //写入(Write)   
        ret = av_interleaved_write_frame(ofmt_ctx, &pkt);
        if (ret < 0) {
            av_strerror(ret, buf, 1024);
        }
        av_packet_unref(&pkt);
    }
    av_write_trailer(ofmt_ctx);
    
exit: /* close output */
    if (ofmt_ctx && !(ofmt_ctx->oformat->flags & AVFMT_NOFILE))
        avio_close(ofmt_ctx->pb);
    avformat_free_context(ofmt_ctx);
    
    return 0;
}

上面的代码只贴出了创建ffmpeg输入流、创建并保存数据到AVI文件的部分程序,方式已验证,能正常录制avi并使用VLC等进行播放。若是想保存为MP4文件,则还需另外写入extradata,否则会出现VLC能播放,但其它播放器无法播放,或播放帧率不对的问题。


---------------------
作者:wb8933
来源:CSDN
原文:https://blog.csdn.net/WB8933/article/details/76791798

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

使用ffmpeg将实时流保存为AVI 的相关文章

  • Docker 同步系统时间问题

    查看当前时区 系统时区是通过符号链接 etc localtime 到目录中的二进制时区标识符来 配置的 usr share zoneinfo span class token variable timedatectl span span c
  • 制作Ghost备份与还原

    用Ghost手动备份系统 用Ghost手动备份系统 xff0c 主要是针对组装电脑而言 xff0c 至于品牌机 xff0c 它都会有自己的系统恢复工具 xff0c 所以不在此列 现在很多人对在使用电脑中出现系统崩溃的故障 xff0c 都会采
  • Docker 安装部署 neo4j

    Neo4j是一个高性能的 NOSQL图形数据库 xff0c 本身就支持集群部署 xff0c 今天要搭建的就是neo4j的因果集群 xff0c 其中分为 xff1a 核心节点 xff1a core server xff0c 可以对数据进行读写
  • 【FTP工具】FileZila安装以及使用详解

    一 FTP概念 安装FTP主要是为了传输文件 xff0c FTP是持久的 xff0c 只有一次认证过程 xff0c 传输多个文件都是使用同一个连接 因为FTP就是为远程文件交互而设计的 xff0c 有些时候只是为了单纯做一个文件传输 xff
  • 【.dll 没有被指定在windows上运行】

    修复 xff08 重新注册DLL xff09 的具体步骤如下 xff1a 方法一 xff1a 1 快捷键win 43 r打开 运行 输入cmd 点击确定打开命令提示符窗口 2 复制 xff1a for 1 in windir system3
  • 在 Centos7 安装 Docker 详细命令行

    Docker 要求 CentOS 系统的内核版本高于 3 10 xff0c 查看本页面的前提条件来验证你的CentOS 版本是否支持 Docker 一 yum源安装docker 1 通过 uname r 命令查看你当前的内核版本 2 使用
  • 怎样将虚拟机文件拷贝至另一台虚拟机?

    1 想要将Master虚拟机中hadoop账户的zookeeper文件拷贝至Slave1虚拟机中 2 将文件打包 3 在Master虚拟机的主文件夹中有着打包好的zookeeper压缩包 4 将压缩包发送至Slave1虚拟机的hadoop账
  • linux 将某个文件夹移动到另一个文件夹下

    若要将某个文件夹整体移动到其它文件夹下 xff0c 可以使用如下命令 mv dir1 dir2 比如我要将上一级目录下的 data 文件夹移动到当前目录下 xff0c 可以使用下面命令 mv data 说明 其中 dir1 参数为 data
  • nextcloud 没有安装 “smbclient“. 无法挂载 “SMB / CIFS“

    Centos7安装apt get 第一步就是下载apt get curl https raw githubusercontent com dvershinin apt get centos master apt get sh o usr l
  • RedHat/CentOS8【OpenSSL】制作自签证书和 HTTPS 配置

    1 OpenSSL 制作自签名证书 1 1 第一阶段 xff1a 制作 CA 根证书 1 2 第二阶段 xff1a 制作服务器证书 1 3 第三阶段 xff1a 制作客户端证书 xff08 双向认证使用 xff09 2 Web 容器配置 H
  • centos安装horizon client

    https blog 51cto com chelaoer 4741839 CentOS 6 6安装Horizon View Client3 4 转载 圪蹴哈么2021 12 03 14 33 40博主文章分类 xff1a 运维 文章标签c
  • 构造函数的4种使用方式总结

    我们无法像调用成员函数那样使用对象来调用构造函数 xff0c 因为在构造函数构造出对象之前 xff0c 对象是不存在的 xff0c 因此构造函数被用来创建对象 xff0c 而不能通过对象来调用 C 43 43 提供了多种使用构造函数初始化创
  • 干线协议(802.1q/ISL)

    干线协议 802 1q交换机针对vlan tag数据帧的处理 ISL 802 1q 一台交换机收到一个数据帧 需要判断其属于哪一个vlan 有两种方法 1 让数据帧带上vlan tag 通过识别tag得知所属vlan 2 给交换机一张表 表
  • Python使用集合将txt文件重复行去除

    最近爬取了百度百科一些关键词的infobox xff0c 由于关键词也是从百度百科页面大量爬取的 xff0c 其中有诸多重复 xff0c 于是使用集合将重复的关键词去掉 xff0c 此方法也适用于其他类型重复行的去除 span class
  • Linux常用命令之软件包管理

    软件包管理 软件包分类 源码包 直接可以看到源码 需要手动编译 安装速度慢 脚本安装包 xff08 部分源码包将安装过程写成脚本 xff0c 交互式安装 xff09 二进制文件包 RPM 系统默认包 已经编译好 安装速度快 rpm命令管理
  • 【Windows11】麦克风不能用、扬声器不能用的解决办法

    这是一个目录0 0 前言扬声器不能用的解决办法麦克风不能用的解决办法 前言 最近笔者刚买的麦克风和扬声器 xff0c 插到电脑上居然不能用 一通排查之后发现原来是Windows系统内的一个设置不对 xff0c 下面是具体解决办法 xff08
  • python django mysql语句增删改查+报错execute() takes from 2 to 3 positional arguments but 4 were given

    python django框架 xff0c 进行增删改查语句 xff1a 1 查询 xff08 1 xff09 正确的写法如下 xff0c cursor execute那句 sql的所有参数 xff0c 应该都写到中括号里面 xff0c 以
  • 方法的形参和实参

    引用博客 博客 何为形参 实参 xff1a 方法定义时的参数称为形式参数 xff0c 简称形参 xff1b 方法调用时的传入参数称为实际参数 xff0c 简称实参 xff1b 实参和形参的类型要一致或兼容 个数 顺序必须一致 例如 span
  • 在linux(debian/ubuntu)中idea的插件默认安装位置和配置文件在哪里?亲测可用

    在 home 当前用户名 config JetBrains IntelliJIdea2020 具体版本号 options 目录下 我的debian10 其他的linux系统应该也在相同的位置
  • 中国电信修改光猫路由模式为桥接模式

    首先 需要搞到超级管理员的账号和密码 可以上网根据光猫型号查找 也可以直接跟安宽带的工作人员要 第一步 准备超级管理员账号和密码 可以自行根据光猫型号搜索 也可以直接跟安宽带的工作人员要 第二步 使用超级管理员账密登录网关管理页面 光猫 一

随机推荐

  • maven官网应该下载binary还是sources

  • Linux(Debian11)iptables放行所有端口

    iptables P INPUT ACCEPT iptables P OUTPUT ACCEPT iptables P FORWARD ACCEPT
  • mysql日期加一天

    使用函数 date add 日期 interval 1 day 即可 select DATE ADD 39 2022 02 24 09 03 36 39 INTERVAL 1 DAY select DATE ADD 39 2022 02 2
  • Debian安装mysql

    Debian 10系统中默认使用了MariaDB xff0c 在APT的软件源中并没有mysql 所以 xff0c Debian 10 如果要安装mysql xff0c 需要下载安装Mysql APT Repository xff0c 更新
  • mysql设置忽略大小写

    在连接数据库的时候发现库里有表的名字只是大小写不一样 xff0c 但就是连不上 xff0c 我用的是mysql5 7 8 默认没有开启忽略大小写 xff0c 这里记录一下 1 查看数据库大小写配置 show variables like 3
  • Linux(debian)常用代理设置

    不管实在开发还是在日常使用中 xff0c 梯子是必不可少的工具 xff0c 但是在linux系统中 xff0c 有时候操作起来不是那么方便 xff0c 于是在此做个笔记 0x01 环境变量设置 设置代理 xff1b echo 39 expo
  • linux(Debian11)安装后安装无线网卡等驱动

    在工作和生活中 xff0c 我们经常会用到linux系统 xff0c debian作为一个老牌的程序员常用发行版 xff0c 自然成为我们的首选 下面记录一下 xff0c 安装无线网卡的过程 首先 xff0c 可以通过命令查看自己所需要的驱
  • 基于深度学习的知识追踪研究进展 Research Advances in the Knowledge Tracing Based on Deep Learning

    8 基于深度学习的知识追踪研究进展 Research Advances in the Knowledge Tracing Based on Deep Learning 摘要 xff1a 知识追踪是教育数据挖掘领域的一个重要研究方向 xff0
  • Tomcat控制台弱密码漏洞

    文章目录 一 漏洞介绍1 1 漏洞原理1 2 影响版本1 3 触发条件 二 环境搭建2 1 环境信息2 2 tomcat配置2 3 配置漏洞环境 三 攻击过程3 1 控制台弱密码3 2 冰蝎控制 四 漏洞修复 一 漏洞介绍 1 1 漏洞原理
  • linux(debian11)系统安装那些事儿--没有无线网需要安装无线网卡驱动双显卡等问题

    linux在日常的工作和生活中是经常用到的 xff0c 在安装的时候 xff0c 和windows不太一样 xff0c 有些驱动是需要我们自己手动安装的 xff0c 但是也并不麻烦 这里记录一下 xff0c 一种很简单的安装intel无线网
  • java线程编排CompletableFuture

    在开发中偶尔也会需要用到线程编排 比如查询商品数据 查询商品规格信息和商品图片耗时分别是1 2s和5s 如果是异步执行 那么就可以使用5s完成查询了 而不是6 2s 这里记录一下 CompletableFuture完成线程编排 import
  • dump数据库导表线上服务无响应

    有时候 有些场景下 我们需要拷贝线上的数据 进行本地测试 如果你用的是dbeaver工具操作数据库 在拷贝数据库的时候容易导致服务器没响应 看服务正常运行 但是前端访问就是没反应 服务器也没欠费 这是什么情况呢 就是mysql在进行dump
  • 多线程之如何设计线程数量

    创建多少线程合适 xff0c 要看多线程具体的应用场景 一般来说 xff0c 我们可以将程序分为 xff1a CPU密集型程序和I O密集型程序 xff0c 而针对于CPU密集型程序和I O密集型程序 xff0c 其计算最佳线程数的方法是不
  • P1825 [USACO11OPEN]Corn Maze S 题解

    这道题就是一道普通的搜索题 xff0c 非常非常普通 xff0c 普通的不能再普通那种 xff0c 和以前的bfs一样 xff0c 不过这个bfs要注意一个特判 xff0c 当弹出的那个元素的是大写字母的时候 xff0c 要窜梭到对应的大写
  • 向CentOS7虚拟机中复制文件报错error when getting information

    xff08 安装过程中 xff0c 所有询问 xff0c 都是 yes 或者按 Enter 同意默认路径 xff0c 其中的一个要注意的见下图 xff09
  • 程序设计思维与实践week12作业

    文章目录 A 必做题 1 HDU 1029描述输入输出样例想法代码 B 必做题 2 POJ 2251描述输入输出样例想法代码 C 必做题 3 HDU 1024描述东东每个学期都会去寝室接受扫楼的任务 xff0c 并清点每个寝室的人数 输入输
  • nginx安装时/ngx_murmurhash.c:37:11: error: this statement may fall through [-Werror=implicit-fallthroug

    nginx安装时 ngx murmurhash c 37 11 error this statement may fall through Werror 61 implicit fallthroug如图报错 nginx 1 8 objs M
  • vmware如何把虚拟机和本地主机如何设置在同一网段

    我的本地系统是win10系统 xff0c 其它系统方法没试过 xff0c 应该差不多 一 前提是你此时已经安装好了vmware与操作系统了 二 首先在本地系统上操作 xff1a 1 2 3 4 右键该选择查看属性 ip4 不用做其它操作 5
  • 树莓派3B+指南(十五)omxplayer的安装与使用

    omxplayer的安装与使用 需要用python来控制播放视频 xff0c 所以就找到了这个播放器 xff0c 很好用 看了官网文档 xff0c 安装使用都写的比较明白了 官网地址 xff1a https python omxplayer
  • 使用ffmpeg将实时流保存为AVI

    项目中需要将编码器编码出的H264数据保存为avi格式文件 使用ffmpeg接口进行实现 ffmpeg一般是直接打开本地视频文件 如avi mp4等 或者网络视频流 如 xff1a rtmp流媒体等 xff0c 只需要直接将本地视频文件名或