BMP to AVI 及其压缩的实现

2023-11-16

  <script type="text/javascript"> srcString = contentarea.value; srcString = ubbReplace(srcString, 'all'); document.write(srcString); srcString = signaturearea.value; showSign(srcString); </script>1.设计方案的产生
   这个设计方案是物光院嵌入式系统试验室的基于CDMA技术的无线视频传输监控系统的设计的一部分。我简要说明此系统的原理。系统单片机部分主要模块由CDMA、DSP与ARM处理器、FLASH、ROM组成。此单片机用来获取监控所在地视频图像,经过DSP中的H264协议压缩,通过arm再到CDMA,最后把数据包发送到主机端的网卡。最后通过主机端的函数接口:
LONG WINAPI Decode(void *DecHeap,void *CodBuf,int CodLen,void *ResBuf,int *imgtype,int *imgw,int *imgh);把压缩视频包解码存储于ResBuf。
2.为什么要用到BMP to AVI
   单片机提供的本地存储图像函数接口:LONG API SaveImgToBmpFile(CHAR *BmpFileName,
void *ImgBuf,LONG Img_Width,LONG Img_Height,LONG Img_ClrBits);是将图像帧按BITMAP格式文件存盘。而我们实际的目标是要把实时视频录制成AVI文件格式,并且实现压缩。这样才不至于在录了几十分钟硬盘就多了好几个G。
3.BMP to AVI方案的具体实施
   本来以为可以很轻松的找到例子。可是我翻阅了百度的几乎所有相关中文网站,没有找到BMP 转换成 AVI的例子。唯一的一个例子是用VB写的,它的缺点是张数有限,不支持动态添加,而且没有压缩,数据量很大。最后,我在参考了国外网站上的两个类似的AVI类,经过我的修改,于是有了现在这个程序。
步骤(1)了解AVI (定义在AVIFMT.H文件中)
微软公司的AVI格式是一种由RIFF指定的应用程序,用来对音频/视频流进行捕捉、编辑和播放的文件格式。大体上,AVI文件包含不同类型的多重数据流。大多数的AVI文件里都包含音频和视频流。有些简单的AVI文件里只包含视频流而不包含音频流。而有些更特殊的AVI文件可能包括一个控制通道或MIDI道作为一个附加的数据流。控制道可以控制如MCI影碟播放器的外部器件,MIDI声道可以为视频流播放背景音乐。要完全播放出这种特殊的数据流效果,需要播放程序有特殊的插件,但一般的播放程序也可以播放,只不过把特殊数据忽略AVI文件使用AVI RIFF格式。AVI的RIFF格式通过文件开始的”AVI ”字符来识别。所有的AVI文件包括两个必须的LIST块。这些数据块定义了视频和音频流的格式数据。AVI文件也可能包括一个索引数据块。这个可选块包含了可选数据在文件中的位置。一个AVI文件具有以下形式:
  RIFF(’AVI ’ 
        LIST  (‘hdrl’)    //定义数据格式
        LIST(‘movi’)     //包含AVI流数据
       [‘idx1’<AVI Index>]//索引
          )
     LIST块和索引数据块是RIFF”AVI”数据块的子数据块。“AVI”数据块用来辨认文件是一个AVI RIFF文件。LIST“hdrl”数据块定义数据的格式,它被放在第一个位置。LIST “movi”数据块包含AVI流的数据,它被放在第二个位置。LIST“idx1”数据块是可选择的索引数据块。AVI文件一定要以适当的顺序保存这三个分量。LIST”hdrl”和LIST”movi”又使用子数据块作为它们的数据。
RIFF('AVI' 
 *       LIST(‘hdrl‘//多上数据流存在
 *     avih(<MainAVIHeader>)//AVI主首部
 *                  LIST ('strl'
 *                      strh(<Stream header>)//流首部
 *                      strf(<Stream format>)//流格式
 *   ... additional header data//格式由压缩解压驱动器定义
 *            LIST(‘movi‘//数据直接位于数据块中  
 *         { LIST(‘rec’ //编组成REC数据块放入movi
 *             SubChunk...//用于磁盘存取文件
 *          )
 *             | SubChunk } ....     
 *            )
 *            [ <AVIIndex> ]
 *      )
LIST”movi”数据块包含一个用于标示数据块类型的四字符编码,由二字符流编号和定义信息类型的二字符组成
数据流一些块定义:
 *           Video Streams:
 *                  ##db: RGB DIB bits(未压缩)
 *                  ##dc: RLE8 compressed DIB bits
 *                  ##pc: Palette Change
 *
 *           Audio Streams:
 *                  ##wb: waveform audio bytes
AVI主首部定义:
typedef struct
{
    DWORD  dwMicroSecPerFrame; // frame display rate (or 0L)
    DWORD  dwMaxBytesPerSec; // max. transfer rate
    DWORD  dwPaddingGranularity; // pad to multiples of this
                                                // size; normally 2K.
    DWORD dwFlags; // the ever-present flags
    DWORD dwTotalFrames; // # frames in file
    DWORD dwInitialFrames;
    DWORD dwStreams;
    DWORD dwSuggestedBufferSize;
    
    DWORD dwWidth;
    DWORD dwHeight;
    
    DWORD dwReserved[4];
} MainAVIHeader;
AVI流首部:
typedef struct {
    FOURCC fccType;
    FOURCC fccHandler;
    DWORD dwFlags; /* Contains AVITF_* flags */
    WORD wPriority;
    WORD wLanguage;
    DWORD dwInitialFrames;
    DWORD dwScale;
    DWORD dwRate;/* dwRate / dwScale == samples/second */
    DWORD dwStart;
    DWORD dwLength; /* In units above... */
    DWORD dwSuggestedBufferSize;
    DWORD dwQuality;
    DWORD dwSampleSize;
    RECT rcFrame;
} AVIStreamHeader;
步骤(2)BMP to AVI流程(定义在AVIFILE文件中)
主要有6步:

遍历文件夹-->建立AVI文件-->取得位图句柄

设置压缩参数-->压缩-->装帧-->释放位图句柄

相关函数接口和类接口:
IAVIFile    AVIFileInit(); AVIFileOpen(); AVIFileExit();
DIBSECTION  AVISTREAMINFO
AVICOMPRESSOPTIONS AVISaveOptions
AVISaveOptionsFree AVIMakeCompressedStream
AVIStreamSetFormat 
步骤(3)实时数据读取
现在只能读固定文件:( 
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

BMP to AVI 及其压缩的实现 的相关文章

  • 在Python中将整数附加到列表的开头[重复]

    这个问题在这里已经有答案了 如何在列表的开头添加一个整数 1 2 3 42 1 2 3 gt gt gt x 42 gt gt gt xs 1 2 3 gt gt gt xs insert 0 x gt gt gt xs 42 1 2 3
  • 是否有一个 jquery List 插件可以自动排序项目并具有强大的添加/删除方法?

    我已经在谷歌上搜索了几个小时 寻找一些东西来处理我的情况 我还不够熟练 无法编写自己的 jquery 插件 该插件应该自动对列表进行排序 这并不像能够轻松地从列表中添加 删除项目那么重要 Themeroller 功能将是一个优点 我基本上会
  • 使用 sapply 的列表和矩阵

    我有一个也许是基本的问题 我在网上搜索过 我在读取文件时遇到问题 尽管如此 我还是按照 Konrad的建议设法读取了我的文件 我很欣赏这一点 How to get R to read in files from multiple subdi
  • 如何将 Python 字典序列化为字符串,然后再序列化回字典?

    如何将 Python 字典序列化为字符串 然后再序列化回字典 字典中将包含列表和其他字典 这取决于您想用它做什么 如果您只是想保存它 您应该使用pickle https docs python org 3 library pickle ht
  • 以特定方式填充列表

    我需要填充一个包含 5 个位置的列表 new list 我收到 2 个列表 并且有一个默认值来填充新列表 现在开始解决问题 好的方式是 我从列表中接收 2 个值 从列表中接收 2 个值并添加默认值 A1 A2 DEFAULT B1 B2 但
  • Python 有不可变列表吗?

    python 有不可变列表吗 假设我希望具有元素有序集合的功能 但又想保证它不会改变 如何实现呢 列表是有序的 但它们可以改变 是的 它被称为一个tuple 所以 而不是 1 2 这是一个list并且可以突变 1 2 is a tuple并
  • 我想将对象列表添加到 firestore 文档中,-flutter

    我想将对象列表添加到 firestore 文档 我定义了产品数据模型 我还有类别数据模型 我想将类别列表添加到 firestore 中的产品文档中 我将类别添加到临时列表 然后将值放入product categories 产品 类别 类别t
  • 如何在 Haskell 中向右或向左移动列表的 1 个元素?

    嗨 我一直在寻找答案 但找不到 假设我们有一个像这样的列表 1 10 4 5 3 我怎样才能将 5 向左移动 使这个列表变成 1 10 5 4 3 我尝试过了swapElementsAt通过找到该元素的索引 但它看起来非常不足 swapEl
  • 如何在 Python 中连接两个列表?

    这个问题的答案是社区努力 help privileges edit community wiki 编辑现有答案以改进这篇文章 目前不接受新的答案或互动 如何在 Python 中连接两个列表 Example listone 1 2 3 lis
  • 分配列表的多个值

    我很想知道是否有一种 Pythonic 方式将列表中的值分配给元素 为了更清楚 我要求这样的事情 myList 3 5 7 2 a b c d something myList So that a 3 b 5 c 7 d 2 我正在寻找比手
  • Django查询:如何过滤对象以排除列表中的id?

    如何在查询中进行过滤 以便结果排除 ID 属于列表的任何对象实例 可以说我有 object id list 1 5 345 MyObject objects filter Q time gte datetime now Q what to
  • 属性错误:“列表”对象没有属性“拆分”

    我正在尝试读取一个文件并用逗号分隔每行中的一个单元格 然后仅显示第一个和第二个单元格 其中包含有关纬度和经度的信息 这是文件 time 纬度 经度 类型2015 03 20T10 20 35 890Z 38 8221664 122 7649
  • 如何在 Haskell 中制作打勾游戏的图案?

    实现有 2 个参数的函数 ticktick 第一个参数是自然数元组 定义游戏场地的行数和列数 第二个列表包含由玩家 x 和玩家 o 轮流玩的坐标给出的井字游戏比赛的记录 打印游戏的实际状态 其中游戏区域将由字符 和 界定 空方块 以及字符
  • 如何在Python中按AaB而不是ABa顺序对字符串进行排序

    我正在尝试对字符串进行排序 为 punnetsquare 制作基因型 我目前的实现是 unsorted genotype ABaB sorted genotype sorted list unsorted genotype sorted s
  • 从列表python的单个列表中删除子列表

    我已经经历过从列表列表中删除子列表 https stackoverflow com questions 47209786 removing sublists from a list of lists 但当我为我的数据集扩展它时 它不适用于我
  • 使用字符串中的变量名称访问变量值,R

    Intro 一个数据集有大量的age year变量 age 1990 age 1991 etc 我有一个字符串值数组length age years 表示这些变量 使得age years 1 回报 age 1990 etc Need 我想搜
  • 如何将Scheme中的函数应用于另一个函数返回的参数列表?

    假设有两个函数 f 和 v 进一步假设 v 返回长度为 n 的列表 并且 f 需要恰好 n 个参数 我正在Scheme中寻找正确的语法 以将f应用于v返回的列表 如果我使用语法 f v v arguments 然后我收到一个关于 f 需要
  • 使用 LINQ 通过一个属性比较两个列表

    假设我有以下内容 class Widget1 public int TypeID get set public string Color get set class Widget2 public int TypeID get set pub
  • php如何生成动态list()?

    根据我的理解 这就是 list 的工作原理 list A1 A2 A3 array B1 B2 B3 所以在帮助下list 我们可以相应地从数组中分配值 这是我的问题 如何生成动态list 1 基于数据库返回结果 我不确定有多少 但我将其全
  • 查找 C# 列表中重复项的数量

    我在 C 中使用列表 代码如下 测试用例 cs public class TestCase private string scenarioID private string error public string ScenarioID ge

随机推荐

  • RPC 服务优雅停机、优雅重启,你的服务重启够优雅吗?

    关注公众号 1024个为什么 及时接收最新推送文章 背景 由于最近上线比较频繁 就遇到了一个小概率的数据不一致的问题 具体过程如下 很明显 是服务没有做到优雅停机 导致的两个服务的数据不一致 优雅停机 优雅重启 本质到底是什么 优雅重启涵盖
  • 【最简单】STM32+ESP8266+MQTT+EMQX完成数据上传和点灯环节

    首先要吐槽一点 那就是网络上的这方面资料杂七杂八 而且很多都是一模一样的 然后我作为一个学生 没有多大的本事 就是想实现最基本的功能 然后在此基础上慢慢拓展 所以那些十分庞大的工程或者一些IoT物联网平台的官方SDK对于我来说是比较难看懂的
  • js、vue、vue3.0、时间格式转换函数

    时间戳转换时间格式 时间戳转任意时间格式 调用方法 gt this getDate 1626137166000 m d H i this getDate 1626137166000 等等 getDate function date form
  • c++ string中的data()和c_str() 区别与联系

    c str 返回的是const char 类型的指针 无法修改指针指向字符串的值 data 有两种版本 一种返回的是const char 类型的指针 此时与上面的c str 用法完全一致 网上有说c str返回的会加上 0 可能不同版本不一
  • 电路基础(2)电阻电路的等效变换

    1 电路的等效变换 两端网络 任何一个复杂的电路 向外引出两个端钮 且从一个端子流入的电流等于从另一端子流出的电流 则称这一电路为二端网络 或一端口网络 两端电路等效 两个两端电路 端口具有相同的电压 电流关系 则称它们是等效的电路 两电路
  • WordPress BuddyPress 存在越权漏洞RCE(CVE-2021-21389)

    一 漏洞描述 BuddyPress 是一个用于构建社区站点的开源 WordPress 插件 在 7 2 1 之前的 5 0 0 版本的 BuddyPress 中 非特权普通用户可以通过利用 REST API 成员端点中的问题来获得管理员权限
  • 错误,调试

    有些也写在了开发工具 xcode中 http article ityran com archives 1143 1 编译iPad真机时 选择了 Architetures Standard armv6 BaseSDK iPhoneDevice
  • 神经网络算法的基本原理,神经网络算法都有哪些

    神经网络算法的三大类分别是 神经网络算法的三大类分别是 1 前馈神经网络 这是实际应用中最常见的神经网络类型 第一层是输入 最后一层是输出 如果有多个隐藏层 我们称之为 深度 神经网络 他们计算出一系列改变样本相似性的变换 各层神经元的活动
  • GeoServer发布地图服务并在OpenLayers中显示:shp的WMS服务和GeoTIFF的WTMS服务

    GeoServer发布的地图服务结构如下 必须创建一个工作区 该工作区下可以存放多组无关数据 也就是说 工作区的作用就类似于一个文件夹 仅仅用于分类 在工作区下添加数据存储 数据存储即一组相关数据 通常 一个地区的地图可能是单个文件构成 也
  • vim进阶

    首先晒一张我的vim截图 基本IDE有的功能都能实现了 虽然在日常工作里还是IDE用的多 但是作为一个开发者 少不了折腾的心 vim 作为与emacs齐名的编辑器 无需更多溢美之词 由于学习曲线陡峭 但是学会之人 无不表示其方便 vim操作
  • Docker 安装 MySQL、Redis、Nginx

    222 1 Portainer 安装 docker可视化 2 Docker 安装MySQL 3 Docker安装Redis 4 Docker安装 Nginx 1 Portainer 安装 docker可视化 docker run d p 8
  • C++多线程(三)事件

    事件 解决两个线程通信问题 要注意死锁 g hEvent CreateEvent NULL FALSE FALSE NULL WaitForSingleObject g hEvent INFINITE ResetEvent g hEvent
  • ubuntu18-opencv3.4.6移植到aarch64

    一 前提条件 需先安装好arm64相关的交叉编译器 安装好cmake gui 下载并解压opencv3 4 6 下载ippicv 2019 lnx intel64 general 20180723 tgz 二 配置cmake 进入openc
  • Unity初学者学习路线与建议

    Unity初学者学习路线与建议 目录 Unity初学者学习路线与建议 一 前言 二 我的学习建议 三 学习要点 一 前言 Holle大家好 先自我介绍一下 我现在大二 专业是数字媒体技术 方向是游戏制作 学的是Unity 和我同专业的另一个
  • Ubuntu 16.04安装MinGW32

    直接使用命令 sudo apt get install mingw32 会报错 Unable to locate package mingw32 解决办法如下 sudo gedit etc apt sources list 在sources
  • ModBus-RTU详解

    Modbus 一个工业上常用的通讯协议 一种通讯约定 Modbus协议包括RTU ASCII TCP 其中MODBUS RTU最常用 比较简单 在单片机上很容易实现 虽然RTU比较简单 但是看协议资料 手册说得太专业了 起初很多内容都很难理
  • Mysql中字符串正确的连接方法

    虽然SQL server和My sql的语句基本都一致 但是仍然存在一些小区别 就如字符串的连接来说 SQL server中的字符串连接是使用 来连接 不带引号sql server是做加法运算 而my sql中无论是带引号和不带引号 它都将
  • 无缓存交换

    请编写一个函数 函数内不使用任何临时变量 直接交换两个数的值 给定一个int数组AB 其第零个元素和第一个元素为待交换的值 请返回交换后的数组 测试样例 1 2 返回 2 1 思路 使用异或 public int exchangeAB in
  • python3生成中文词云图

    usr bin python3 coding utf 8 coding utf 8 导入wordcloud模块 from wordcloud import WordCloud 中文分词库 pip install jieba import j
  • BMP to AVI 及其压缩的实现

    1 设计方案的产生 这个设计方案是物光院嵌入式系统试验室的基于CDMA技术的无线视频传输监控系统的设计的一部分 我简要说明此系统的原理 系统单片机部分主要模块由CDMA DSP与ARM处理器 FLASH ROM组成 此单片机用来获取监控所在