AVI格式--学习笔记

opencv学习笔记(九)捕获摄像头的视频并保存成avi格式 这个程序引用自下面的博客,但是运行之后我发现视频保存之后,要利用前面提到的opencv播放视频程序播放,不能用普通播放器播放——而且用前面的opencv程序播放时,图像是倒置的,需要我们在程序里面改一下。在while(1)里面加上一句     cvFlip(frame, NULL, 0 );//翻转图像  http://blog.youkuaiyun.com/augusdi/article/details 阅读详情

1. 介绍

  AVI是音频视频交错(Audio Video Interleaved)的英文缩写,它是Microsoft公司开发的一种符合RIFF文件规范的数字音频与视频文件格式,原先用于Microsoft Video for Windows (简称VFW)环境,现在已被Windows 95/98、OS/2等多数操作系统直接支持。AVI格式允许视频和音频交错在一起同步播放,支持256色和RLE压缩,但AVI文件并未限定压缩标准,因此,AVI文件格式只是作为控制界面上的标准,不具有兼容性,用不同压缩算法生成的AVI文件,必须使用相应的解压缩算法才能播放出来。

2.RIFF格式

  在介绍AVI文件前,我们要先来看看RIFF文件结构。AVI文件采用的是RIFF文件结构方式,RIFF(Resource Interchange File Format,资源互换文件格式)是微软公司定义的一种用于管理windows环境中多媒体数据的文件格式,波形音频wave,MIDI和数字视频AVI 都采用这种格式存储。

2.1. 数据块

构造RIFF文件的基本单元叫做数据块(Chunk),每个数据块包含3个部分:

  1. 4字节的数据块标记(或者叫做数据块的ID);
  2. 数据块的大小;
  3. 数据;

  整个RIFF文件可以看成一个数据块,其数据块ID为RIFF,称为RIFF块。一个RIFF文件中只允许存在一个RIFF块。RIFF块中包含一系列的子块,其中有一种字块的ID为"LIST",称为LIST,LIST块中可以再包含一系列的子块,但除了LIST块外的其他所有的子块都不能再包含子块。

2.2. 形式类型

  RIFF和LIST块分别比普通的数据块多一个被称为形式类型(Form Type)和列表类型(List Type)的数据域,其组成如下:

  1. 4字节的数据块标记(Chunk ID)
  2. 数据块的大小
  3. 4字节的形式类型或者列表类型
  4. 数据

2.2. AVI块

  下面我们看看AVI文件的结构。AVI文件是目前使用的最复杂的RIFF文件,它能同时存储同步表现的音频视频数据。AVI的RIFF块的形式类型是AVI,它包含3个子块,如下所述:

  1. 信息块,一个ID为"hdrl"的LIST块,定义AVI文件的数据格式。
  2. 数据块,一个ID为 "movi"的LIST块,包含AVI的音视频序列数据。
  3. 索引块,ID为 "idxl"的子块,定义 "movi"LIST块的索引数据,是可选块。

2.2.1. 信息块

信息块,信息块包含两个子块,即一个ID为 avih 的子块和一个ID 为 strl 的LIST块。

  • "avih"子块的内容可由如下的结构定义:
typedef struct 
{
 DWORD dwMicroSecPerFrame ; //显示每桢所需的时间ns,定义avi的显示速率
 DWORD dwMaxBytesPerSec; // 最大的数据传输率
 DWORD dwPaddingGranularity; //记录块的长度需为此值的倍数,通常是2048
 DWORD dwFlages; //AVI文件的特殊属性,如是否包含索引块,音视频数据是否交叉存储
 DWORD dwTotalFrame; //文件中的总桢数
 DWORD dwInitialFrames; //说明在开始播放前需要多少桢
 DWORD dwStreams; //文件中包含的数据流种类
 DWORD dwSuggestedBufferSize; //建议使用的缓冲区的大小,
 //通常为存储一桢图像以及同步声音所需要的数据之和
 DWORD dwWidth; //图像宽
 DWORD dwHeight; //图像高
 DWORD dwReserved[4]; //保留值
}MainAVIHeader;
  • “strl” LIST块用于记录AVI数据流,每一种数据流都在该LIST块中占有3个子块,他们的ID分别是"strh",“strf”, “strd”;

"strh"子块由如下结构定义:

typedef struct 
{
 FOURCC fccType; //4字节,表示数据流的种类 vids 表示视频数据流
 //auds 音频数据流
 FOURCC fccHandler;//4字节 ,表示数据流解压缩的驱动程序代号
 DWORD dwFlags; //数据流属性
 WORD wPriority; //此数据流的播放优先级
 WORD wLanguage; //音频的语言代号
 DWORD dwInitalFrames;//说明在开始播放前需要多少桢
 DWORD dwScale; //数据量,视频每桢的大小或者音频的采样大小
 DWORD dwRate; //dwScale /dwRate = 每秒的采样数
 DWORD dwStart; //数据流开始播放的位置,以dwScale为单位
 DWORD dwLength; //数据流的数据量,以dwScale为单位
 DWORD dwSuggestedBufferSize; //建议缓冲区的大小
 DWORD dwQuality; //解压缩质量参数,值越大,质量越好
 DWORD dwSampleSize; //音频的采样大小
 RECT rcFrame; //视频图像所占的矩形
}AVIStreamHeader;

"strf"子块紧跟在"strh"子块之后,其结构视"strh"子块的类型而定,如下所述;如果 strh子块是视频数据流,则 strf子块的内容是一个与windows设备无关位图的BIMAPINFO结构;

  • "strf"子块由如下结构定义:
typedef struct tagBITMAPINFO
{
 BITMAPINFOHEADER bmiHeader;
 RGBQUAD bmiColors[1]; //颜色表
}BITMAPINFO;

typedef struct tagBITMAPINFOHEADER
{
 DWORD biSize;
 LONG biWidth;
 LONG biHeight;
 WORD biPlanes;
 WORD biBitCount;
 DWORD biCompression;
 DWORD biSizeImage;
 LONG biXPelsPerMeter;
 LONG biYPelsPerMeter;
 DWORD biClrUsed;
 DWORD biClrImportant;
}BITMAPINFOHEADER;

如果 strh子块是音频数据流,则strd子块的内容是一个WAVEFORMAT结构,如下:

  • "strf子块是音频数据流"子块由如下结构定义:
typedef struct 
{
 WORD wFormatTag; 
 WORD nChannels; //声道数
 DWORD nSamplesPerSec; //采样率
 DWORD nAvgBytesPerSec; //WAVE声音中每秒的数据量
 WORD nBlockAlign; //数据块的对齐标志
 WORD biSize; //此结构的大小
}WAVEFORMAT

  "strd"子块紧跟在strf子块后,存储供压缩驱动程序使用的参数,不一定存在,也没有固定的结构。

  “strl” LIST块定义的AVI数据流依次将 “hdrl " LIST 块中的数据流头结构与"movi” LIST块中的数据联系在一起,第一个数据流头结构用于数据流0,第二个用于数据流1,依次类推。

2.3 数据块

  数据块中存储视频和音频数据流,数据可直接存于 “movi” LIST块中。数据块中音视频数据按不同的字块存放,其结构如下所述,

  • 音频块
  1. “##wb”
  2. Wave 数据流
  • 视频块
  1. “##db”
  2. RGB数据流
  • 压缩视频块
  1. “##dc”
  2. 压缩的图像数据流

2.4 索引块

  索引块包含数据块在文件中的位置索引,能提高avi文件的读写速度,其中存放着一组AVIINDEXENTRY结构数据。如下,这个块并不是必需的,也许不存在。
typedef struct
{
 DWORD ckid; //记录数据块中子块的标记
 DWORD dwFlags; //表示chid所指子块的属性
 DWORD dwChunkOffset; //子块的相对位置
 DWORD dwChunkLength; //子块长度
};

ffmpeg h264转avi学习笔记 本章只记录h264封装成avi格式视频,参考ffmpeg项目的avienc.c,avi封装格式图请查看这个博客:https://blog.youkuaiyun.com/houxiaoni01/article/details/84341885 结构体如下: typedef struct { long fdes; /* File descriptor of AVI file */ u_8 bExtFd; //is extern fd,not close u_8 阅读详情

相关推荐

音视频学习笔记002:视频封装格式

文章目录视频封装格式初步认识疑问:常见的封装格式AVI格式MP4格式MOV格式MKV格式TS格式FLV格式WMV格式RMVB格式 前面网上查资料,大概了解了一些H.264的一些皮毛。 接下来就需要参考如何学习,一脸懵逼o((⊙﹏⊙))o,查看各种博客,虽然大概了解了一下,还没开始怎么敲代码,也不知道如何开始敲相关的代码,接下来期望能从雷神的笔记中领悟节奏吧,然后再参考其他的博客啥的理解…,既然敲不...

摆乌龙的博客 886

服务器信息块协议,高级疑难解答服务器消息块(SMB)

高级疑难解答服务器消息块(SMB)12/25/2019本文内容服务器消息块(SMB)是一种用于文件系统操作的网络传输协议,可让客户端访问服务器上的资源。 SMB 协议的主要用途是通过 TCP/IP 启用两个系统之间的远程文件系统访问。SMB 故障排除可能非常复杂。 本文并不是一个详尽的故障排除指南,它是一个简短的入门知识,可了解有关如何有效排查 SMB 问题的基础知识。工具和数据收集质量 SMB ...

weixin_36031304的博客 914

K210学习笔记(六)——MAIX BIT(K210)播放视频与录制

系列文章目录 提示:这里可以添加系列文章的所有文章的目录,目录需要自己手动添加 例如:第一章 Python 机器学习入门之pandas的使用 提示:写完文章后,目录可以自动生成,如何生成可参考右边的帮助文档 文章目录系列文章目录前言一、pandas是什么?二、使用步骤1.引入库2.读入数据总结 前言 提示:这里可以添加本文要记录的大概内容: 例如:随着人工智能的不断发展,机器学习这门技术也越来越重要,很多人都开启了学习机器学习,本文就介绍了机器学习的基础内容。 提示:以下是本篇文章正文内容,下面案例

Thousand_drive的博客 5951

STM32H743寄存器操作(内存颗粒SDRAM初始化及简单使用)

STM32H743XIH6对SDRAM的初始化及简单使用,纯寄存器操作

weixin_51686526的博客 3130

读写Avi文件的vc程序

vc代码,用于读写avi文件的vc程序 vc代码,用于读写avi文件的vc程序

CMOS锁相环核心:四种鉴频鉴相器(PFD)结构深度剖析与选型指南

本文深入剖析了CMOS锁相环中四种鉴频鉴相器(PFD)的结构与性能,包括传统RS触发器型、非时钟型、预充电型和边沿触发型PFD。通过详细的电路分析、实测数据和工程案例,提供了PFD选型的实用指南,帮助工程师根据速度、功耗和精度需求选择最优方案,提升锁相环设计效率。

weixin_42530458的博客 588

STM32H723、STM32H743、STM32H750的区别

例如,STM32H723提供高达2 MB的闪存和564 KB的RAM,STM32H743提供高达2 MB的闪存和1 MB的RAM,而STM32H750提供高达1 MB的闪存和340 KB的RAM。STM32H723的最大频率为550 MHz,STM32H743的最大频率为480 MHz,而STM32H750的最大频率为480 MHz。例如,STM32H723和STM32H743都可提供LQFP、UFBGA、BGA和WLCSP等多种封装选项,而STM32H750主要提供LQFP封装。

小灰灰的博客 2万+

保姆级教程:用MATLAB搞定双目相机标定,从导入图片到参数解读全流程

本文提供了一份详细的MATLAB双目相机标定全流程指南,涵盖从图片准备到参数解读的每个环节。重点讲解了棋盘格选择、拍摄技巧、MATLAB工具箱设置及参数优化,帮助读者避免常见错误并提升标定精度。特别适合机器人导航、三维重建等领域的开发者。

weixin_33737134的博客 429

stm32h743数据手册_STM32H743从RAM启动异常的案例分享

有人使用STM32H743芯片做产品开发,反映没法将代码放在RAM区进行调试运行。基于他的反馈,这边找了块STM32H743的Nucleo开发板进行测试。不妨找个基于该开发板的一个最简例程,GPIO的按键操作并触发中断,每按键一次将LED进行亮暗切换。下面使用ARM MDK开发环境进行测试。芯片内部有多个SRAM区域,先考虑将代码放到D1域的AXI_SRAM里去运行,其它堆栈数据使用D...

weixin_39988197的博客 2534

SKF SimPro Quick 4.8.1发布

发布说明可以在SimPro手册的SKF SimPro Quick应用程序的一般部分下找到(帮助→SKF SimPro快速手册→一般→发布说明)。请删除旧版本,请备份您存储在C:\SKF SimPro xxx\files文件夹中的文件以及所有自定义报告模板和表格。我们很高兴地通知您,我们的轴承应用工程软件SKF SimPro Quick 4.8.1可供下载。将新的安装文件下载到本地计算机后,双击它安装向导将打开(按照说明操作)3.安装后,在本地机器上启动SKF SimPro Expert软件。

小韩的博客 1820

解密DS90UB983-Q1的汽车电子魔法:如何通过FPD-Link IV实现4K视频的无缝传输

本文深入解析了德州仪器DS90UB983-Q1串行器芯片如何通过FPD-Link IV技术在汽车电子中实现4K视频无缝传输。文章详细介绍了该技术的核心功能,包括多流传输(MST)模式、热插拔检测(Hot Plug Detect)机制以及电磁兼容性设计,为车载信息娱乐系统提供了高带宽、低延迟的可靠解决方案。

i3j4k5的博客 242

avi

最近在做视频文件的解析,需要将视频文件中封装的视频与音频解析出来,然后用自己的解码器解码。这个过程专业点叫做叫做Demultiplex,视频播放器中负责这部分的叫做Demuxer。我们平时看到的各种格式视频,比如:avi,mp4,mkv等相当于一种容器,里面包含了音视频,字幕的信息以及数据,Demuxer的工作就是解析视频文件,取出里面的音视频或者字幕送到指定的解码器解码。 我刚开始接触的a

u010527630的专栏 3824

ZYNQ microblaze boot.bin固化步骤

一,ZYNQ移植软核的原理FPGA规模巨大而且功能复杂,因此设计的每一个部分都从头开始是不切实际的。一种解决的办法是:对于较为通用的部分可以重用现有的功能模块,而把主要的时间和资源用在设计中的那些全新的、独特的部分。这就像是你在开发应用程序的时候就不用直接去写驱动物理硬件的代码,而是直接调用Windows提供的API就行了。

wangjie36的博客 2782

AVI文件格式学习笔记(非完全版)

1、名词解释 — AVI:Audio Video Interleaved — RIFF:Resource Interchange File Format — FOURCC:Four-Character Code 2、RIFF格式 RIFF格式的文件由一个RIFF头开始,其后添加0个或多个list或chunk组成。 — RIFF头格式如下: 'RIFF' filesize fi...

weixin_30546933的博客 141

【nvidia-B200 生产环境】NVIDIA 570.124.06+Cuda12.8 Ubuntu22.04 nccl-test 一键部署脚本(免修改复制即用)

目录1. 初始化与日志记录2. 安装基础工具与配置更新3. NVIDIA 驱动安装 570.124.064. 安装 Mellanox OFED 24.10-2.1.8.05. 安装 CUDA 12.86. 安装 NCCL 和测试7. 配置 rc.local 和其他优化8. B200 单独步骤9. 最终测试与重启10. 完整生产脚本,复制即可直接使用总结 功能: 设置日志目录和日志文件路径。 使用 命令将标准输出和错误输出同时写入日志文件和终端。 记录脚本开始时间,并计算开始的秒数

jundao1997的专栏 2798

[企业AI落地] RAG 知识库系统在多租户环境下的细粒度权限隔离设计

多租户 RAG 系统真正的风险不只是搜不到,而是把不该看到的内容查出来、说出来、写回去。本文结合多客户售后知识助手场景,用元数据结构、向量检索过滤、回答策略和审计回写示例拆解租户、资源、检索、生成、审计五层权限边界。

技术小甜甜:传播可落地技术,帮助个人和企业降低解决真实场景问题的成本 220

音视频封装格式转换器(支持avi格式转换),基于FFmpeg4.1实现(音视频学习笔记二)

参照雷霄骅博士的最简单的基于FFMPEG的封装格式转换器(无编解码)的博客和FFmpeg官网的example,实现一个简单的封装格式转换器。先上结果图: 这个程序可以实现各种封装格式转换,对于有字幕流的视频进行了字幕流剔除。代码注释比较详细,直接上代码: #include<iostream> extern "C" { #include<libavutil/timestamp.h> #include<libavformat/avformat.h> } int main(i

weixin_40840000的博客 1979

大模型LangChain面试题及参考答案(上)

明确的输入输出类型:函数参数需包含类型注解,返回值需定义清晰的数据结构(如JSON格式),便于LLM理解参数含义和调用方式。工具描述:通过文档字符串或独立的描述对象(如Tool类)说明函数的功能、参数用途及调用场景,供LLM判断是否需要调用。示例:定义一个计算两个数之和的工具函数@tool"""计算两个整数的和。参数:- a:第一个整数- b:第二个整数调用场景:当用户需要进行数值加法计算时使用。"""除了内置的。

大模型大数据攻城狮的专栏 1139

FFmpeg学习笔记(二):多线程rtsp推流和ffplay拉流操作,并储存为多路avi格式的视频

文章目录多线程rtsp推流多线程ffplay拉流(并保存视频) 如果不了解什么是rtsp推流和ffplay拉流可以看我这篇博客 https://blog.youkuaiyun.com/m0_51004308/article/details/117430611?spm=1001.2014.3001.5501 由于项目需要,不得不使用多线程的方式来进行视频流的推送,从边缘端储存到服务器端。多线程的方式很明显有个非常大的特点,线程之间不相互影响,也就是你有你的工作,我有我的工作,你不工作了没关系,也不会影响我。 下面请看推流

源的博客 4754

TMS_WebGMaps_1.9.8.0_Full_Source

TMS_WebGMaps_1.9.8.0_Full_Source 全源码 delphi cbuilder

霍尼韦尔SoftMaster使用说明

霍尼韦尔SoftMaster使用说明

stm32h743单片机嵌入式学习笔记8-avi视频解码

*AVI 格式允许视频和音频交错在一起同步播放,支持 256 色和 RLE 压缩,但 AVI 文件并 未限定压缩标准,AVI 仅仅是一个容器,用不同压缩算法生成的 AVI 文件,必须使用相应的解 压缩算法才能播放出来。比如本章,我们使用的 AVI,其音频数据采用 16 位线性 PCM 格式(未 压缩),而视频数据,则采用 MJPG 编码方式。 * 视频文件信息头这里有很多我们要用到的信息,比如...

biao2488890051的博客 4993

VC中sqlite的使用

在VC中对sqlite的使用,实现数据库大批数据的快速插入,读取数据库中的数据在ListCtrl中显示

OpenCV学习笔记【7】:写入AVI视频文件

将一个彩色视频文件以灰度格式输出,下面程序并没有

hualitlc的专栏 801

ET2012新版免狗免安装绿色软件

ET2012新版免狗免安祖昂绿色软件。,新界面,新视觉,

学习笔记--了解主要视频格式

MPEG/MPG/DAT MPEG(Moving Picture Experts Group) l  MPEG-1:主要用于CD,VCD。MPEG-1分三层,其中第三层即MP3(MPEG-1 audio layer 3)。MP3压缩率:压缩率 12:1--10:1。 l  MPEG-2:被用于无线数位电视-ATSC、DVB以及ISDB、数字卫星电视(例如DirecTV)、数字有线电视信号,以

用心看,这个世界好奇妙,代码也很奇妙 1689

OpenCV学习笔记----保存视频文件.avi

打开摄像头设备并将其写入.avi文件,录像功能(C++)

Wanggj的博客 1853

NDK学习笔记(十三) 使用AVILib+opengl es 2.0创建一个AVI视频播放器

avilib、opengl es、GLSurfaceView

来来来,走一走 287

AE学习笔记——第五章:效果预设和渲染导出

目录 一:效果与预设的应用 (1)效果的运算顺序 (2)效果的应用 (3)动画预设的使用 二:渲染和输出 (1)使用Adobe Media Encoder渲染 (2)使用AE渲染 A:.avi格式 B:.mov格式 一:效果与预设的应用 (1)效果的运算顺序 AE中为图层添加效果时可以使用图层菜单,或者效果预设面板,同时配合效果控件面板使用。这里需要注意的是在AE中,图层中添加的效果其运算或处理是自上而下的,所以如果添加效果的顺序不合适可能导致最终的结果不合适。 (2)效果的应

快乐江湖的博客 1870

基础学习笔记之opencv(6):实现将图片生成视频

基础学习笔记之opencv(6):实现将图片生成视频     在做实验的过程中,难免会读视频中的图片用来处理,相反将处理好的图片又整理输出为一个视频文件也是很常用的。下面就来讲讲基于opencv的C++版本中图片输出视频是怎么实现的。     本次试验的数据为摇摆的树枝树叶图片,Waving Trees,其来源网址为: http://research.microsoft.com/en-us

陈曦(网络管理) 1137
上一篇: const的作用--学习笔记
下一篇: live555四大基础组件学习笔记-处理程序handler类
BERLIN23
博客等级 码龄14年 7粉丝 16原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值