基于ARM11的嵌入式无线视频监控系统:设计、实现与应用探索_第1页
基于ARM11的嵌入式无线视频监控系统:设计、实现与应用探索_第2页
基于ARM11的嵌入式无线视频监控系统:设计、实现与应用探索_第3页
基于ARM11的嵌入式无线视频监控系统:设计、实现与应用探索_第4页
基于ARM11的嵌入式无线视频监控系统:设计、实现与应用探索_第5页
已阅读5页,还剩124页未读 继续免费阅读

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

基于ARM11的嵌入式无线视频监控系统:设计、实现与应用探索一、引言1.1研究背景与意义在当今数字化时代,视频监控系统作为保障安全、维护秩序的重要工具,广泛应用于各个领域,如安防监控、交通管理、工业生产等。传统的视频监控系统大多基于有线连接,在实际应用中暴露出诸多弊端。一方面,布线复杂是传统有线视频监控系统的一大难题。在大型建筑、复杂地形或远距离监控场景中,铺设大量线缆不仅施工难度大、成本高,而且后期维护和扩展极为不便。例如,在一些老旧建筑中进行监控系统升级时,重新布线可能需要破坏墙体、天花板等结构,这不仅耗费大量人力、物力和时间,还可能对建筑造成损坏。另一方面,设备庞大也是传统视频监控系统的显著问题。这些系统通常需要配备多个独立设备,如摄像头、视频采集卡、存储设备等,这不仅占据大量空间,还增加了系统的复杂性和成本。而且,传统视频监控系统智能化程度较低,大多只能实现简单的视频采集和存储功能,缺乏对视频内容的智能分析和处理能力,难以满足现代社会对高效、精准监控的需求。在安防监控中,传统系统往往无法及时准确地识别异常行为,如入侵、火灾等,导致监控效果大打折扣。随着ARM11嵌入式系统技术的不断发展,其在无线视频监控领域展现出独特优势。ARM11是ARM公司推出的一款高性能处理器,具有低功耗、小尺寸、高集成度等特点,能够为无线视频监控系统提供强大的计算能力和稳定的运行支持。利用ARM11嵌入式系统,无线视频监控系统可以实现小型化、轻量化设计,大大降低设备成本和安装难度。其对无线网络的良好支持,使得视频数据能够实时传输,实现远程监控,有效解决了传统有线监控系统布线复杂的问题。ARM11嵌入式系统还具备一定的智能处理能力,通过搭载相应的算法和软件,可以实现对视频内容的智能分析,如目标检测、行为识别等,提高监控系统的智能化水平。基于ARM11的嵌入式无线视频监控系统的研究与实现具有重要的现实意义。从社会安全角度看,该系统可以广泛应用于安防监控领域,有效提升社会治安防控能力,保障人民生命财产安全。在交通管理中,它能够实时监测交通流量、识别违章行为,提高交通管理效率,缓解交通拥堵。从工业生产角度讲,该系统可以实现对生产过程的远程监控和管理,及时发现设备故障和安全隐患,提高生产效率和产品质量,降低生产成本。研究基于ARM11的嵌入式无线视频监控系统,对于推动视频监控技术的发展,满足社会各领域对高效、智能监控的需求具有重要意义。1.2国内外研究现状在国外,基于ARM的视频监控系统研究起步较早,发展较为成熟。早期,国外研究主要集中在视频采集与传输技术上,通过优化视频编码算法和网络传输协议,提高视频数据的传输效率和质量。随着ARM处理器性能的不断提升,研究逐渐转向系统的智能化方向,如利用机器学习和深度学习算法实现目标识别、行为分析等功能。在智能家居领域,国外已经推出了多款基于ARM架构的智能摄像头产品,这些产品不仅能够实现高清视频监控,还具备人脸识别、移动侦测等智能功能,用户可以通过手机APP随时随地查看监控画面,并接收异常报警信息。国内在基于ARM的视频监控系统研究方面也取得了显著进展。近年来,随着国内安防市场的快速发展和对视频监控技术需求的不断增加,国内科研机构和企业加大了对该领域的研发投入。在硬件方面,国内企业积极引进和消化国外先进技术,开发出一系列高性能、低成本的ARM开发板和相关硬件设备,为视频监控系统的研发提供了有力支持。在软件方面,国内研究人员在视频编码、图像处理、人工智能算法等领域进行了深入研究,取得了许多创新性成果。一些国内企业推出的基于ARM的智能视频监控系统,已经在安防、交通、教育等领域得到广泛应用,部分产品的性能和功能已经达到或超过国外同类产品水平。尽管国内外在基于ARM的视频监控系统研究方面取得了丰硕成果,但仍存在一些不足之处。一方面,现有系统在实时性和稳定性方面还有待进一步提高,特别是在复杂网络环境下,视频数据的传输延迟和丢包现象仍然较为严重,影响监控效果。另一方面,系统的智能化程度还需进一步提升,虽然目前已经实现了一些基本的智能功能,但在复杂场景下的目标识别准确率和行为分析能力仍有待提高,难以满足一些高端应用场景的需求。在系统的兼容性和可扩展性方面也存在一定问题,不同厂家的设备和软件之间往往难以实现无缝对接,限制了系统的大规模应用和推广。1.3研究内容与方法本研究旨在设计并实现一个基于ARM11的嵌入式无线视频监控系统,主要研究内容包括以下几个方面:首先是硬件系统设计,选择合适的ARM11开发板作为核心处理器,如三星的S3C6410开发板,其具有丰富的接口资源和强大的处理能力,能够满足系统的需求。在此基础上,扩展摄像头接口,选择高分辨率、低功耗的摄像头,如OV9650摄像头,以实现高质量的视频采集;添加无线网络模块,如WIFI模块,确保视频数据能够通过无线网络实时传输。还需对其他外围设备进行合理配置,如内存、存储设备等,以保障系统的稳定运行。其次是软件系统开发,构建系统软件框架,包括引导加载程序Bootloader、操作系统内核、设备驱动程序和应用层程序。在操作系统选择上,可采用嵌入式Linux系统,其开源、稳定且具有丰富的驱动支持和开发工具。针对视频采集功能,利用Linux系统下的Video4Linux2(V4L2)框架实现对摄像头的控制和视频数据采集;对于视频编码,采用H264编码算法,可选择硬编码方式,以提高编码速度,满足视频数据实时性要求;在视频传输方面,基于RTP(实时传送协议)协议实现视频数据的网络传输,并利用开源代码Jrtplib提供的RTP协议栈简化开发过程。还需开发用户界面,方便用户对系统进行操作和管理。最后是系统测试与优化,对系统的各项功能进行全面测试,包括视频采集质量、视频传输的实时性和稳定性、系统的智能化功能等。通过在不同网络环境和实际应用场景下进行测试,收集测试数据并进行分析,找出系统存在的问题和不足之处。针对测试中发现的问题,如视频卡顿、丢包等,从硬件和软件两方面进行优化。在硬件方面,调整硬件参数,优化电路设计;在软件方面,优化算法、调整网络传输策略等,以提高系统的性能和稳定性,使其满足实际应用需求。在研究方法上,采用了以下几种:一是文献研究法,通过查阅国内外相关文献资料,了解基于ARM的视频监控系统的研究现状和发展趋势,掌握相关的技术原理和方法,为系统的设计和实现提供理论支持。二是硬件设计与调试,根据系统需求,进行硬件选型和电路设计,搭建硬件平台,并对硬件进行调试和优化,确保硬件系统的正常运行。三是软件编程与测试,运用C/C++等编程语言进行软件系统开发,按照模块化设计思想,分别开发各个功能模块,并对软件进行单元测试、集成测试和系统测试,及时发现并解决软件中的问题。四是实验验证法,将设计实现的系统在实际场景中进行应用测试,验证系统的性能和功能是否满足要求,根据实验结果对系统进行进一步优化和改进。二、ARM11嵌入式系统概述2.1ARM11处理器介绍2.1.1ARM11技术特点ARM11处理器作为ARM公司推出的一款具有重要意义的处理器,采用了先进的8级流水线技术。与传统的5级流水线相比,8级流水线使得指令的执行过程更加细化,每个阶段的任务更加单一,从而能够在单位时间内处理更多的指令,有效提高了处理器的运行效率和处理速度,为系统的高性能运行奠定了坚实基础。在视频监控系统中,大量的视频数据需要快速处理,ARM11的8级流水线技术能够使系统迅速对视频数据进行采集、编码、传输等操作,确保视频监控的实时性和流畅性。ARM11在多媒体处理方面表现卓越,通过引入单指令多数据(SIMD)技术,大大增强了其多媒体处理能力。SIMD技术允许处理器在一条指令中同时对多个数据进行操作,这在处理视频和音频数据时具有显著优势。在视频编码过程中,能够快速对视频帧中的多个像素点进行处理,加快编码速度,提高编码效率;在音频处理中,也能高效地对音频信号进行解码和混音等操作,提升音频质量。ARM11还支持多种多媒体格式的编解码,如MPEG4、H.263、H.264等,使其能够广泛应用于各种多媒体应用场景。安全性是ARM11处理器的一大亮点,它引入了TrustZone技术。这是一种硬件和软件相结合的安全解决方案,通过将系统划分为安全世界和非安全世界,为片上数据提供了一个隔离的环境。在安全世界中,运行着对安全性要求极高的代码和数据,如加密密钥、用户身份验证信息等,这些内容受到严格的保护,非安全世界的代码和操作无法直接访问,从而有效增强了系统的安全性和隐私保护能力。在无线视频监控系统中,视频数据的传输和存储涉及用户的隐私和安全,TrustZone技术能够确保视频数据在处理和传输过程中的安全性,防止数据被窃取或篡改。ARM11还具备智能能源管理(IEM)技术,能够根据系统的实际需求动态调整功耗。当系统处于轻负载状态时,处理器可以降低时钟频率和电压,以减少能源消耗;而在面对高负载任务时,又能迅速提升性能,满足系统对处理能力的要求。这种动态调整功耗的能力,使得ARM11在实现高性能的能够保持较低的能耗,延长设备的电池续航时间,特别适合应用于对功耗有严格要求的嵌入式设备中。在便携式无线视频监控设备中,电池容量有限,ARM11的智能能源管理技术能够确保设备在长时间工作的情况下,不会因为功耗过大而导致电池电量快速耗尽。2.1.2ARM11在嵌入式系统中的应用领域在物联网领域,ARM11凭借其低功耗、高性能的特点,成为众多物联网设备的核心处理器。智能家居设备中的智能摄像头、智能音箱等,通过ARM11处理器实现与其他设备的互联互通,实时采集和传输数据。智能摄像头利用ARM11强大的处理能力,能够对拍摄的视频进行实时分析,实现人脸识别、移动侦测等智能功能,并将视频数据通过无线网络传输到用户的手机或云端服务器,方便用户随时随地查看监控画面。智能音箱则借助ARM11处理器运行语音识别和自然语言处理算法,实现与用户的语音交互,为用户提供音乐播放、信息查询等服务。在工业控制领域,ARM11也发挥着重要作用。工业自动化生产线中的各种控制器、传感器和执行器等设备,需要具备高效的数据处理能力和稳定的运行性能。ARM11处理器能够满足这些要求,它可以实时采集生产线上的各种数据,如温度、压力、速度等,并根据预设的控制策略对执行器进行精确控制,确保生产线的高效、稳定运行。在工业机器人中,ARM11处理器用于控制机器人的运动和操作,实现对生产任务的精确执行,提高生产效率和产品质量。在医疗设备领域,ARM11同样得到广泛应用。可穿戴式医疗设备如智能手环、智能手表等,利用ARM11处理器实时监测用户的生理数据,如心率、血压、睡眠状态等,并通过蓝牙或无线网络将数据传输到手机或医疗服务器,为用户提供健康监测和预警服务。在一些医疗影像设备中,ARM11处理器负责处理和分析医学影像数据,帮助医生更准确地诊断疾病。2.2嵌入式系统开发基础2.2.1嵌入式操作系统选择在嵌入式系统开发中,操作系统的选择至关重要。Linux作为一款开源、稳定且具有丰富驱动支持和开发工具的嵌入式操作系统,在基于ARM11的无线视频监控系统开发中具有显著优势。Linux拥有庞大的开源社区,开发者可以在社区中获取大量的代码资源、技术文档和技术支持,这大大降低了开发难度和成本。对于视频监控系统中的摄像头驱动开发,开发者可以参考社区中的相关代码和经验,快速实现对摄像头的控制和视频数据采集。Linux具有高度的可定制性,开发者可以根据系统的实际需求,对内核进行裁剪和优化,去除不必要的功能模块,减小系统体积,提高系统运行效率,使其更适合嵌入式设备有限的硬件资源。RT-Thread是一款开源的实时操作系统,它具有实时性强、资源占用少等特点。在一些对实时性要求极高的应用场景中,如工业控制、航空航天等领域,RT-Thread表现出色。在基于ARM11的无线视频监控系统中,虽然实时性也是一个重要指标,但Linux通过优化也能够满足视频监控系统对实时性的基本要求,且Linux在功能丰富度、软件兼容性和开发便利性等方面具有更大优势。Linux支持多种文件系统,能够方便地实现视频数据的存储和管理;它还拥有丰富的网络协议栈,便于实现视频数据的网络传输。综合考虑系统的功能需求、开发难度和成本等因素,选择Linux作为基于ARM11的无线视频监控系统的嵌入式操作系统更为合适。2.2.2开发工具与环境搭建交叉编译工具链是嵌入式系统开发中不可或缺的工具,它允许开发者在主机(如PC机)上编译出能够在目标嵌入式设备(如基于ARM11的开发板)上运行的可执行文件。以基于ARM11的开发板为例,通常需要安装针对该开发板的ARM交叉编译工具链,如arm-linux-gcc。在安装过程中,首先需要从官方网站或其他可靠渠道下载对应的交叉编译工具链安装包,然后按照安装向导的提示进行安装。安装完成后,需要配置环境变量,将交叉编译工具链的路径添加到系统的PATH环境变量中,以便在终端中能够直接调用相关命令。集成开发环境(IDE)能够提高开发效率,为开发者提供一个统一的代码编辑、编译、调试平台。常用的嵌入式开发IDE有Eclipse、QtCreator等。以Eclipse为例,搭建基于Eclipse的嵌入式开发环境时,首先需要安装Java运行环境(JRE),因为Eclipse是基于Java开发的。然后下载并安装EclipseIDEforC/C++Developers版本,安装完成后,还需要安装CDT(C/C++DevelopmentTools)插件,以支持C/C++语言的开发。接下来,需要配置Eclipse与交叉编译工具链的关联,在Eclipse的“Preferences”中找到“C/C++Build”选项,设置“ToolChainEditor”中的交叉编译器路径为之前安装的arm-linux-gcc路径,这样就完成了Eclipse开发环境与交叉编译工具链的集成。通过这样的环境搭建,开发者可以在Eclipse中方便地进行代码编写、编译和调试工作,大大提高开发效率。三、系统硬件设计3.1硬件总体架构3.1.1核心处理器选型在基于ARM11的嵌入式无线视频监控系统中,核心处理器的选型至关重要,它直接影响系统的性能和功能实现。三星S3C6410处理器凭借其卓越的性能和丰富的功能,成为本系统核心处理器的理想选择。三星S3C6410采用先进的ARM1176JZF-S内核,运行频率最高可达667MHz,具备强大的处理能力。在视频监控应用中,需要对大量的视频数据进行实时处理,包括视频采集、编码、传输等。S3C6410的高性能内核能够快速完成这些任务,确保视频监控的实时性和流畅性。在视频编码过程中,能够迅速对视频帧进行编码处理,将原始视频数据转换为适合网络传输的格式,减少编码延迟,使视频画面能够及时传输到监控终端。该处理器拥有64/32位内部总线架构,包括AXI、AHB和APB总线,这种先进的总线架构为处理器与各种外设之间提供了高效的数据传输通道。在视频监控系统中,需要与摄像头、无线传输模块、存储设备等多种外设进行数据交互。S3C6410的内部总线架构能够确保数据在处理器与这些外设之间快速、稳定地传输,提高系统的整体性能。在与摄像头进行数据传输时,能够快速接收摄像头采集的视频数据,为后续的处理提供保障。三星S3C6410还集成了多种硬件加速器,如视频处理、音频处理、2D图形、显示操作和缩放功能等。这些硬件加速器的集成,大大减轻了处理器内核的负担,提高了系统的多媒体处理能力。在视频处理方面,硬件加速器能够快速对视频进行解码、缩放、裁剪等操作,提高视频处理的效率和质量。在显示操作中,能够快速将视频数据输出到显示设备上,实现清晰、流畅的视频显示。该处理器内置的多格式编解码器(MFC)支持MPEG4、H.263、H.264编码与解码,以及VC1解码,非常适合实时视频会议和电视输出等应用场景。在视频监控系统中,需要对采集到的视频数据进行高效的编码,以减少数据量,便于网络传输。S3C6410的多格式编解码器能够支持多种主流的视频编码格式,特别是H.264编码格式,具有较高的压缩比和良好的视频质量,能够满足视频监控系统对视频编码的需求。3.1.2各硬件模块功能与连接视频采集模块是系统获取视频数据的关键部分,本系统选用OV9650摄像头。OV9650是一款高分辨率的CMOS图像传感器,能够输出高质量的视频图像。它支持多种分辨率模式,最高可达1280×960像素,能够满足不同场景下的视频监控需求。在一些对监控画面清晰度要求较高的场所,如银行、商场等,OV9650的高分辨率能够清晰地捕捉到人员和物体的细节信息。该摄像头还具有低功耗、体积小等优点,适合应用于嵌入式设备中。OV9650通过CameraSerialInterface(CSI)接口与三星S3C6410处理器相连。CSI接口是一种专门用于连接图像传感器和处理器的高速串行接口,具有数据传输速率高、抗干扰能力强等优点。通过CSI接口,OV9650采集到的视频数据能够快速、稳定地传输到S3C6410处理器中,为后续的视频处理提供数据支持。在数据传输过程中,CSI接口能够确保视频数据的完整性和准确性,减少数据丢失和错误。无线传输模块负责将处理后的视频数据通过无线网络传输到监控终端。本系统采用Wi-Fi模块实现无线传输功能。Wi-Fi模块能够支持IEEE802.11b/g/n等无线网络标准,提供高速的数据传输速率,满足视频数据实时传输的需求。在家庭、办公室等场景中,Wi-Fi网络已经广泛覆盖,使用Wi-Fi模块能够方便地将视频监控系统接入现有的无线网络,实现远程监控。Wi-Fi模块通过SDIO(SecureDigitalInputOutput)接口与S3C6410处理器连接。SDIO接口是一种多功能的接口,除了支持SD卡的读写操作外,还可以用于连接其他外部设备,如Wi-Fi模块、蓝牙模块等。通过SDIO接口,S3C6410处理器能够与Wi-Fi模块进行通信,实现对Wi-Fi模块的控制和数据传输。在视频传输过程中,处理器将编码后的视频数据通过SDIO接口发送给Wi-Fi模块,Wi-Fi模块再将数据通过无线网络发送出去。存储模块用于存储视频数据和系统程序。本系统采用NANDflash和DDR内存相结合的存储方案。NANDflash具有大容量、低成本的特点,适合用于存储大量的视频数据。在视频监控系统中,需要长时间存储视频数据,以便后续的查询和分析。NANDflash的大容量能够满足这一需求,同时其低成本也降低了系统的硬件成本。DDR内存则具有高速读写的特性,能够为系统运行提供快速的数据存储和读取支持,确保系统的高效运行。在系统运行过程中,DDR内存用于存储正在运行的程序和临时数据,处理器可以快速地从DDR内存中读取数据,提高系统的响应速度。NANDflash通过其专用的接口与S3C6410处理器相连,这种接口能够实现高速的数据传输和可靠的存储操作。在数据存储过程中,处理器将视频数据按照一定的格式写入NANDflash中,确保数据的安全性和可读取性。DDR内存则通过内存控制器与S3C6410处理器连接,内存控制器负责管理DDR内存的读写操作,确保处理器能够高效地访问DDR内存。在系统运行过程中,内存控制器根据处理器的指令,快速地将数据从DDR内存中读取出来,或者将数据写入DDR内存中。3.2关键硬件模块设计3.2.1视频采集模块设计在视频采集模块中,摄像头的选型至关重要。OV9650摄像头以其出色的性能成为本系统的理想选择。它采用先进的CMOS图像传感器技术,能够在不同的光照条件下获取清晰的图像。在低光照环境下,OV9650通过优化的像素设计和图像处理算法,能够有效地提高图像的亮度和对比度,减少噪点的产生,从而获取高质量的视频图像。该摄像头支持自动曝光、自动白平衡等功能,能够根据环境光线的变化自动调整拍摄参数,确保拍摄出的视频图像色彩鲜艳、真实。基于V4L2接口的视频采集原理是利用Linux操作系统提供的Video4Linux2框架实现对摄像头的控制和视频数据采集。V4L2是Linux下的一个视频设备驱动程序接口标准,它为应用程序提供了统一的编程接口,使得开发者可以方便地访问视频设备,而无需关注底层硬件的差异。在使用V4L2进行视频采集时,首先需要打开视频设备文件,通过open()系统调用实现。然后使用ioctl()调用执行VIDIOC_QUERYCAP命令来查询设备的能力,包括支持的格式、分辨率等,以便根据设备的实际情况进行相应的设置。接下来,通过ioctl()执行VIDIOC_REQBUFS命令来请求一定数量的缓冲区,这些缓冲区用于存放采集到的视频数据。请求缓冲区后,需要设置缓冲区类型为V4L2_BUF_TYPE_VIDEO_CAPTURE,并将准备好的缓冲区入队到驱动的队列中,通过ioctl()调用VIDIOC_QBUF命令实现。完成上述准备工作后,通过ioctl()执行VIDIOC_STREAMON命令开始视频流的捕获。在捕获过程中,应用程序通过ioctl()调用VIDIOC_DQBUF命令从队列中取出填充了数据的缓冲区,对采集到的视频帧数据进行处理,如保存成文件或进行编码传输等。处理完一帧数据后,通过ioctl()执行VIDIOC_QBUF命令将缓冲区重新入队,以便继续采集下一帧数据。当视频采集结束后,使用ioctl()调用VIDIOC_STREAMOFF命令停止视频流捕获,然后关闭设备并释放分配的资源。在视频采集模块的电路设计中,需要考虑OV9650摄像头与S3C6410处理器之间的电气连接和信号传输。OV9650的电源引脚需要连接到稳定的电源供应电路,以确保摄像头能够正常工作。为了减少电源噪声对摄像头工作的影响,通常会在电源引脚附近添加滤波电容,如陶瓷电容和电解电容,以平滑电源信号。摄像头的数据输出引脚通过CSI接口与S3C6410处理器的CSI接口相连,在连接过程中,需要注意信号的电平匹配和传输线的阻抗匹配。为了保证信号的完整性,传输线的长度应尽量缩短,并且要避免信号之间的干扰。还需要设计相应的控制电路,用于控制摄像头的工作模式和参数设置,如分辨率、帧率等。通过S3C6410处理器的GPIO引脚输出控制信号,与OV9650的控制引脚相连,实现对摄像头的控制。3.2.2无线传输模块设计在无线传输模块设计中,需要对Wi-Fi、3G等无线通信技术进行分析,以选择最适合本系统的技术方案。3G技术是第三代移动通信技术,能够提供一定的数据传输速率,实现视频数据的无线传输。它的覆盖范围广,在大多数地区都能够实现网络覆盖。3G技术的数据传输速率相对较低,难以满足高清视频数据实时传输的需求。在传输高清视频时,可能会出现视频卡顿、延迟等问题,影响监控效果。而且3G技术的使用成本较高,需要支付一定的流量费用,增加了系统的运营成本。Wi-Fi技术是一种基于无线局域网的通信技术,具有传输速率高、成本低等优点。目前,主流的Wi-Fi模块能够支持IEEE802.11b/g/n等无线网络标准,传输速率可以达到数百兆甚至更高,能够满足高清视频数据实时传输的需求。在家庭、办公室、商场等场所,Wi-Fi网络已经广泛覆盖,使用Wi-Fi模块能够方便地将视频监控系统接入现有的无线网络,实现远程监控,无需额外支付流量费用。综合考虑系统对视频传输速率的要求、成本因素以及网络覆盖情况,选择Wi-Fi模块作为无线传输模块更为合适。在Wi-Fi模块设计中,需要考虑模块的选型和电路设计。在模块选型方面,需要根据系统的需求选择合适的Wi-Fi模块。首先要考虑模块的传输速率,应选择能够满足视频数据实时传输速率要求的模块。对于高清视频监控系统,建议选择传输速率在150Mbps以上的Wi-Fi模块。还要考虑模块的稳定性和兼容性,选择质量可靠、兼容性好的模块,以确保模块能够稳定地工作,并与其他硬件设备和软件系统兼容。在电路设计方面,Wi-Fi模块通过SDIO接口与S3C6410处理器连接。在连接过程中,需要确保SDIO接口的信号连接正确,包括时钟信号、数据信号、控制信号等。为了减少信号干扰,需要对SDIO接口的信号进行适当的滤波处理,如在信号线上添加磁珠或电容。还需要设计Wi-Fi模块的电源电路,为模块提供稳定的电源供应。通常,Wi-Fi模块需要3.3V或5V的电源,电源电路应具有良好的稳压性能和抗干扰能力,以确保模块能够正常工作。3.2.3存储模块设计在存储模块设计中,NANDflash和DDR内存的选型和电路设计是关键。NANDflash的选型需要考虑存储容量、读写速度、可靠性等因素。在存储容量方面,应根据系统对视频数据存储时间和存储量的需求来选择合适容量的NANDflash。对于长时间、大量视频数据存储的需求,应选择大容量的NANDflash,如16GB、32GB甚至更高容量的产品。在读写速度方面,不同型号的NANDflash读写速度有所差异,应选择读写速度较快的产品,以提高视频数据的存储和读取效率。一些高速NANDflash的写入速度可以达到几十MB/s,读取速度可以达到上百MB/s。可靠性也是选型时需要考虑的重要因素,应选择质量可靠、稳定性好的NANDflash产品,以确保视频数据的安全存储。一些知名品牌的NANDflash产品在可靠性方面表现较好,具有较高的擦写寿命和数据保存能力。DDR内存的选型主要考虑内存容量和工作频率。内存容量应根据系统运行的需求来选择,对于运行复杂的视频处理算法和多任务的系统,建议选择1GB或更高容量的DDR内存,以确保系统有足够的内存空间来存储程序和数据。工作频率方面,应选择与S3C6410处理器兼容且工作频率较高的DDR内存,以提高内存的读写速度和系统的运行效率。一些DDR2或DDR3内存的工作频率可以达到800MHz甚至更高,能够满足系统对内存性能的要求。在NANDflash的电路设计中,NANDflash通过其专用的接口与S3C6410处理器相连。在连接过程中,需要确保接口信号的正确连接,包括地址信号、数据信号、控制信号等。为了保证数据传输的可靠性,需要对接口信号进行适当的处理,如添加上拉电阻或下拉电阻,以确保信号在传输过程中的电平稳定。还需要设计NANDflash的电源电路和擦写保护电路。电源电路应能够为NANDflash提供稳定的电源供应,通常需要提供3.3V或1.8V的电源。擦写保护电路用于防止NANDflash在擦写过程中出现错误或损坏,通过硬件电路或软件算法实现对擦写操作的监控和保护。DDR内存通过内存控制器与S3C6410处理器连接。在电路设计中,需要确保内存控制器与DDR内存之间的信号连接正确,包括时钟信号、数据信号、地址信号等。为了提高内存的读写速度和稳定性,需要对内存的布线进行优化,如采用合理的拓扑结构、控制信号传输线的长度和阻抗匹配等。还需要设计DDR内存的电源电路和散热电路。电源电路应能够为DDR内存提供稳定的电源供应,通常需要提供1.5V或1.35V的电源。散热电路用于降低DDR内存工作时的温度,提高内存的可靠性和稳定性,可以采用散热片或风扇等散热设备。四、系统软件设计4.1软件总体架构4.1.1引导加载程序Bootloader引导加载程序Bootloader在嵌入式系统启动过程中起着至关重要的作用。当系统上电或复位时,首先执行的便是Bootloader。它如同系统的“先行官”,负责初始化硬件设备,为后续操作系统内核的运行创造必要条件。通过初始化CPU的时钟频率、设置内存控制器等操作,确保硬件设备处于稳定且可正常工作的状态。建立内存空间的映射图,使得CPU能够正确访问内存中的数据和指令,为系统的正常运行提供基础支持。Bootloader还承担着加载操作系统内核的关键任务,将内核从存储设备(如NANDFlash、SD卡等)读取到内存中,并跳转到内核的入口点,将系统的控制权顺利交给操作系统内核,从而启动整个系统。在众多引导加载程序中,U-Boot以其强大的功能和广泛的适用性成为基于ARM11的无线视频监控系统的理想选择。U-Boot是一个开源的引导加载程序,具有跨平台支持的显著特点,能够适配多种处理器架构,包括ARM、x86、PowerPC等,这使得它在不同类型的嵌入式设备中都能发挥重要作用。其提供的强大交互式控制台,允许用户通过命令行接口执行各种操作,如启动操作系统、挂载文件系统、设置环境变量等,为系统的调试和配置提供了极大的便利。在系统开发和调试过程中,开发者可以利用U-Boot的控制台快速定位和解决问题,提高开发效率。U-Boot的启动过程可以分为多个阶段。在第一阶段,主要进行硬件的基本初始化工作。设置CPU的工作模式为特权模式,以获得对系统资源的完全访问权限;关闭中断,防止在初始化过程中被外部事件干扰;初始化内存控制器,确保内存能够正常工作;初始化串口,为后续的调试信息输出和交互提供通道。在这一阶段,还会进行代码的自搬移操作,将U-Boot的代码从低速的存储设备(如NANDFlash)复制到高速的内存(如SDRAM)中,以提高程序的执行速度。第二阶段则侧重于更全面的硬件初始化和系统配置。初始化更多的硬件设备,如I2C、SPI、USB等,使这些设备能够正常工作;加载环境变量,这些变量存储了系统的启动参数、网络配置等重要信息,决定了系统的启动行为和运行环境;检查并执行启动命令,根据环境变量中的设置,从存储设备中加载操作系统内核镜像到内存中,并跳转到内核的入口点,启动操作系统。在将U-Boot移植到基于ARM11的开发板时,需要进行一系列细致的配置和修改工作。要根据开发板的硬件资源,如内存大小、存储设备类型和接口等,对U-Boot的配置文件进行相应调整。在配置文件中,设置正确的内存地址范围、存储设备的驱动参数等,确保U-Boot能够正确识别和访问硬件设备。修改U-Boot的启动参数,使其与系统的需求相匹配。设置合适的内核加载地址、根文件系统的挂载方式等参数,以保证系统能够顺利启动。还可能需要根据开发板的具体硬件电路,对U-Boot中的硬件初始化代码进行修改,确保硬件设备能够正常初始化。在初始化串口时,需要根据串口硬件的连接方式和参数设置,调整初始化代码中的波特率、数据位、校验位等参数。4.1.2操作系统内核与驱动程序嵌入式Linux内核的裁剪和移植是构建基于ARM11的无线视频监控系统软件架构的关键环节。Linux内核作为操作系统的核心,负责管理系统的硬件资源、调度任务以及提供基本的系统服务。由于嵌入式设备的硬件资源有限,如内存容量、存储容量等,因此需要对Linux内核进行裁剪,去除不必要的功能模块,以减小内核体积,提高系统的运行效率。在裁剪过程中,需要根据系统的实际需求,仔细选择内核的功能组件。对于无线视频监控系统,可能需要保留与视频采集、编码、网络传输相关的功能模块,而去除一些与系统功能无关的模块,如某些文件系统的支持、不必要的设备驱动等。内核移植则是将裁剪后的Linux内核适配到基于ARM11的硬件平台上。这一过程需要对内核源码进行一系列的修改和配置。根据ARM11处理器的特性,修改内核中的处理器相关代码,如中断处理、时钟管理等部分,确保内核能够正确识别和利用ARM11处理器的硬件资源。针对开发板上的各种硬件设备,添加或修改相应的设备驱动程序,使内核能够与硬件设备进行通信和控制。在移植过程中,还需要配置内核的启动参数,如设置根文件系统的位置、内核加载地址等,以保证内核能够在目标硬件平台上顺利启动。设备驱动程序是连接硬件设备和操作系统内核的桥梁,它负责实现对硬件设备的控制和管理。在基于ARM11的无线视频监控系统中,需要开发多种设备驱动程序。对于OV9650摄像头,需要开发相应的驱动程序,实现对摄像头的初始化、参数设置、视频数据采集等功能。在驱动程序中,利用Linux系统提供的V4L2框架,通过一系列的系统调用和操作,实现对摄像头的控制。通过ioctl()系统调用,执行VIDIOC_QUERYCAP命令查询摄像头的设备能力,包括支持的视频格式、分辨率等;执行VIDIOC_S_FMT命令设置摄像头的视频格式和分辨率;执行VIDIOC_STREAMON命令启动视频采集,将采集到的视频数据传输到内核空间。对于Wi-Fi模块,同样需要开发驱动程序,实现对Wi-Fi模块的初始化、网络连接、数据传输等功能。在驱动程序中,通过SDIO接口与Wi-Fi模块进行通信,配置Wi-Fi模块的工作模式、网络参数等,实现无线视频数据的传输。对于存储设备,如NANDflash和DDR内存,也需要开发相应的驱动程序,实现对存储设备的读写操作、擦除操作、坏块管理等功能。在NANDflash驱动程序中,实现对NANDflash芯片的识别、分区管理、数据读写和擦除等操作,确保视频数据能够安全、可靠地存储在NANDflash中。4.1.3应用层程序设计应用层程序是用户与无线视频监控系统交互的直接界面,它承担着实现视频数据采集、编码、传输和显示等关键功能的重任,以满足用户对视频监控的实际需求。视频数据采集模块负责从摄像头获取原始视频数据。通过调用基于V4L2接口的函数,实现对摄像头的控制和视频数据的读取。在该模块中,首先打开视频设备文件,获取设备句柄,以便后续对设备进行操作。通过ioctl()系统调用执行VIDIOC_QUERYCAP命令,查询摄像头的设备能力,包括支持的视频格式、分辨率、帧率等信息,根据查询结果设置合适的视频采集参数,如分辨率、帧率、图像格式等。设置完成后,通过ioctl()执行VIDIOC_REQBUFS命令请求一定数量的缓冲区,用于存放采集到的视频数据。将准备好的缓冲区入队到驱动的队列中,通过ioctl()调用VIDIOC_QBUF命令实现。完成上述准备工作后,通过ioctl()执行VIDIOC_STREAMON命令开始视频流的捕获。在捕获过程中,应用程序通过ioctl()调用VIDIOC_DQBUF命令从队列中取出填充了数据的缓冲区,获取采集到的视频帧数据,并对其进行处理,如保存成文件或进行编码传输等。处理完一帧数据后,通过ioctl()执行VIDIOC_QBUF命令将缓冲区重新入队,以便继续采集下一帧数据。当视频采集结束后,使用ioctl()调用VIDIOC_STREAMOFF命令停止视频流捕获,然后关闭设备并释放分配的资源。视频数据编码模块的主要任务是对采集到的原始视频数据进行编码处理,以减少数据量,便于网络传输和存储。在本系统中,选择H.264编码算法,因为它具有较高的压缩比和良好的视频质量,能够在保证视频清晰度的有效地降低数据传输带宽和存储需求。该模块通过调用硬件编码库或软件编码库,将原始视频数据按照H.264编码标准进行编码。在编码过程中,设置合适的编码参数,如码率、帧率、I帧间隔等,以平衡视频质量和数据量。较高的码率可以提高视频质量,但会增加数据量;较小的I帧间隔可以提高视频的实时性,但也会增加数据量。需要根据实际应用场景和需求,合理调整这些参数。编码后的视频数据将以特定的格式输出,如NALU(NetworkAbstractionLayerUnit)单元流,以便后续的传输和处理。视频数据传输模块负责将编码后的视频数据通过无线网络传输到监控终端。在本模块中,基于RTP(实时传送协议)协议实现视频数据的传输。RTP协议是一种专门用于在IP网络中传输实时数据(如音频、视频)的协议,它能够提供时间戳、序列号等信息,确保数据的顺序和同步,从而保证视频数据在网络传输过程中的实时性和稳定性。利用Jrtplib库提供的RTP协议栈,实现视频数据的打包、发送和接收功能。在发送端,将编码后的视频数据封装成RTP数据包,添加时间戳、序列号等信息,然后通过网络发送出去;在接收端,接收RTP数据包,解析出视频数据,并根据时间戳和序列号进行数据的重组和同步,恢复出原始的视频流。视频显示模块则将接收到的视频数据进行解码和显示,为用户提供直观的视频监控画面。通过调用视频解码库,将H.264编码的视频数据解码成原始的视频帧,然后利用图形显示库,将视频帧显示在监控终端的屏幕上。在显示过程中,根据监控终端的屏幕分辨率和显示格式,对视频帧进行适当的缩放和格式转换,以确保视频画面能够完整、清晰地显示。还可以添加一些用户交互功能,如视频播放控制(暂停、播放、快进、快退等)、画面切换、截图等,提高用户体验。4.2视频数据处理相关软件设计4.2.1基于V4L2的视频数据采集实现在基于ARM11的嵌入式无线视频监控系统中,利用V4L2接口函数实现视频数据采集是关键环节之一。V4L2(VideoforLinuxTwo)是Linux内核中提供的用于视频设备驱动的接口,它为应用程序提供了统一的编程接口,使得开发者能够方便地访问和控制各种视频设备,而无需深入了解底层硬件的细节。实现视频设备打开操作时,应用程序首先需要使用open()系统调用打开视频设备文件。通常,视频设备文件位于/dev目录下,例如/dev/video0。open()函数的第一个参数为设备文件路径,第二个参数指定打开文件的模式,如O_RDWR表示以读写模式打开设备文件。示例代码如下:#include<fcntl.h>#include<unistd.h>intfd;fd=open("/dev/video0",O_RDWR);if(fd<0){perror("Failedtoopenvideodevice");return-1;}#include<unistd.h>intfd;fd=open("/dev/video0",O_RDWR);if(fd<0){perror("Failedtoopenvideodevice");return-1;}intfd;fd=open("/dev/video0",O_RDWR);if(fd<0){perror("Failedtoopenvideodevice");return-1;}fd=open("/dev/video0",O_RDWR);if(fd<0){perror("Failedtoopenvideodevice");return-1;}if(fd<0){perror("Failedtoopenvideodevice");return-1;}perror("Failedtoopenvideodevice");return-1;}return-1;}}这段代码尝试打开视频设备/dev/video0,如果打开失败,open()函数将返回-1,并通过perror()函数输出错误信息。打开设备后,需要对视频设备的参数进行设置,以满足系统的需求。通过ioctl()系统调用执行VIDIOC_QUERYCAP命令查询设备的能力,获取设备支持的视频格式、分辨率、帧率等信息。ioctl()函数的第一个参数为设备文件描述符,第二个参数为控制命令,这里为VIDIOC_QUERYCAP,第三个参数为指向v4l2_capability结构体的指针,用于存储查询结果。示例代码如下:#include<linux/videodev2.h>structv4l2_capabilitycap;if(ioctl(fd,VIDIOC_QUERYCAP,&cap)<0){perror("Failedtoquerydevicecapabilities");close(fd);return-1;}structv4l2_capabilitycap;if(ioctl(fd,VIDIOC_QUERYCAP,&cap)<0){perror("Failedtoquerydevicecapabilities");close(fd);return-1;}if(ioctl(fd,VIDIOC_QUERYCAP,&cap)<0){perror("Failedtoquerydevicecapabilities");close(fd);return-1;}perror("Failedtoquerydevicecapabilities");close(fd);return-1;}close(fd);return-1;}return-1;}}查询设备能力后,可以根据设备支持的参数设置视频采集的格式和分辨率。使用ioctl()调用VIDIOC_S_FMT命令设置视频格式,通过v4l2_format结构体指定要设置的格式信息,包括视频像素格式、宽度、高度等。示例代码如下:structv4l2_formatfmt;fmt.type=V4L2_BUF_TYPE_VIDEO_CAPTURE;fmt.fmt.pix.width=640;fmt.fmt.pix.height=480;fmt.fmt.pix.pixelformat=V4L2_PIX_FMT_YUYV;fmt.fmt.pix.field=V4L2_FIELD_INTERLACED;if(ioctl(fd,VIDIOC_S_FMT,&fmt)<0){perror("Failedtosetvideoformat");close(fd);return-1;}fmt.type=V4L2_BUF_TYPE_VIDEO_CAPTURE;fmt.fmt.pix.width=640;fmt.fmt.pix.height=480;fmt.fmt.pix.pixelformat=V4L2_PIX_FMT_YUYV;fmt.fmt.pix.field=V4L2_FIELD_INTERLACED;if(ioctl(fd,VIDIOC_S_FMT,&fmt)<0){perror("Failedtosetvideoformat");close(fd);return-1;}fmt.fmt.pix.width=640;fmt.fmt.pix.height=480;fmt.fmt.pix.pixelformat=V4L2_PIX_FMT_YUYV;fmt.fmt.pix.field=V4L2_FIELD_INTERLACED;if(ioctl(fd,VIDIOC_S_FMT,&fmt)<0){perror("Failedtosetvideoformat");close(fd);return-1;}fmt.fmt.pix.height=480;fmt.fmt.pix.pixelformat=V4L2_PIX_FMT_YUYV;fmt.fmt.pix.field=V4L2_FIELD_INTERLACED;if(ioctl(fd,VIDIOC_S_FMT,&fmt)<0){perror("Failedtosetvideoformat");close(fd);return-1;}fmt.fmt.pix.pixelformat=V4L2_PIX_FMT_YUYV;fmt.fmt.pix.field=V4L2_FIELD_INTERLACED;if(ioctl(fd,VIDIOC_S_FMT,&fmt)<0){perror("Failedtosetvideoformat");close(fd);return-1;}fmt.fmt.pix.field=V4L2_FIELD_INTERLACED;if(ioctl(fd,VIDIOC_S_FMT,&fmt)<0){perror("Failedtosetvideoformat");close(fd);return-1;}if(ioctl(fd,VIDIOC_S_FMT,&fmt)<0){perror("Failedtosetvideoformat");close(fd);return-1;}perror("Failedtosetvideoformat");close(fd);return-1;}close(fd);return-1;}return-1;}}在上述代码中,设置视频采集的分辨率为640x480,像素格式为YUYV,场模式为隔行扫描。设置完参数后,需要请求缓冲区并将其入队,以便存储采集到的视频数据。使用ioctl()调用VIDIOC_REQBUFS命令请求一定数量的缓冲区,通过v4l2_requestbuffers结构体指定请求的缓冲区数量和类型。示例代码如下:structv4l2_requestbuffersreq;req.count=4;req.type=V4L2_BUF_TYPE_VIDEO_CAPTURE;req.memory=V4L2_MEMORY_MMAP;if(ioctl(fd,VIDIOC_REQBUFS,&req)<0){perror("Failedtorequestbuffers");close(fd);return-1;}req.count=4;req.type=V4L2_BUF_TYPE_VIDEO_CAPTURE;req.memory=V4L2_MEMORY_MMAP;if(ioctl(fd,VIDIOC_REQBUFS,&req)<0){perror("Failedtorequestbuffers");close(fd);return-1;}req.type=V4L2_BUF_TYPE_VIDEO_CAPTURE;req.memory=V4L2_MEMORY_MMAP;if(ioctl(fd,VIDIOC_REQBUFS,&req)<0){perror("Failedtorequestbuffers");close(fd);return-1;}req.memory=V4L2_MEMORY_MMAP;if(ioctl(fd,VIDIOC_REQBUFS,&req)<0){perror("Failedtorequestbuffers");close(fd);return-1;}if(ioctl(fd,VIDIOC_REQBUFS,&req)<0){perror("Failedtorequestbuffers");close(fd);return-1;}perror("Failedtorequestbuffers");close(fd);return-1;}close(fd);return-1;}return-1;}}上述代码请求了4个内存映射类型的缓冲区。请求缓冲区后,需要将缓冲区映射到用户空间,并将其入队到设备驱动的队列中。通过mmap()函数将缓冲区映射到用户空间,获取缓冲区的地址;使用ioctl()调用VIDIOC_QBUF命令将缓冲区入队。示例代码如下:#include<sys/mman.h>structv4l2_bufferbuf;unsignedchar*buffers[4];for(inti=0;i<req.count;i++){memset(&buf,0,sizeof(buf));buf.type=V4L2_BUF_TYPE_VIDEO_CAPTURE;buf.memory=V4L2_MEMORY_MMAP;buf.index=i;if(ioctl(fd,VIDIOC_QUERYBUF,&buf)<0){perror("Failedtoquerybuffer");close(fd);return-1;}buffers[i]=(unsignedchar*)mmap(NULL,buf.length,PROT_READ|PROT_WRITE,MAP_SHARED,fd,buf.m.offset);if(buffers[i]==MAP_FAILED){perror("Failedtomapbuffer");close(fd);return-1;}if(ioctl(fd,VIDIOC_QBUF,&buf)<0){perror("Failedtoqueuebuffer");close(fd);return-1;}}structv4l2_bufferbuf;unsignedchar*buffers[4];for(inti=0;i<req.count;i++){memset(&buf,0,sizeof(buf));buf.type=V4L2_BUF_TYPE_VIDEO_CAPTURE;buf.memory=V4L2_MEMORY_MMAP;buf.index=i;if(ioctl(fd,VIDIOC_QUERYBUF,&buf)<0){perror("Failedtoquerybuffer");close(fd);return-1;}buffers[i]=(unsignedchar*)mmap(NULL,buf.length,PROT_READ|PROT_WRITE,MAP_SHARED,fd,buf.m.offset);if(buffers[i]==MAP_FAILED){perror("Failedtomapbuffer");close(fd);return-1;}if(ioctl(fd,VIDIOC_QBUF,&buf)<0){perror("Failedtoqueuebuffer");close(fd);return-1;}}unsignedchar*buffers[4];for(inti=0;i<req.count;i++){memset(&buf,0,sizeof(buf));buf.type=V4L2_BUF_TYPE_VIDEO_CAPTURE;buf.memory=V4L2_MEMORY_MMAP;buf.index=i;if(ioctl(fd,VIDIOC_QUERYBUF,&buf)<0){perror("Failedtoquerybuffer");close(fd);return-1;}buffers[i]=(unsignedchar*)mmap(NULL,buf.length,PROT_READ|PROT_WRITE,MAP_SHARED,fd,buf.m.offset);if(buffers[i]==MAP_FAILED){perror("Failedtomapbuffer");close(fd);return-1;}if(ioctl(fd,VIDIOC_QBUF,&buf)<0){perror("Failedtoqueuebuffer");close(fd);return-1;}}for(inti=0;i<req.count;i++){memset(&buf,0,sizeof(buf));buf.type=V4L2_BUF_TYPE_VIDEO_CAPTURE;buf.memory=V4L2_MEMORY_MMAP;buf.index=i;if(ioctl(fd,VIDIOC_QUERYBUF,&buf)<0){perror("Failedtoquerybuffer");close(fd);return-1;}buffers[i]=(unsignedchar*)mmap(NULL,buf.length,PROT_READ|PROT_WRITE,MAP_SHARED,fd,buf.m.offset);if(buffers[i]==MAP_FAILED){perror("Failedtomapbuffer");close(fd);return-1;}if(ioctl(fd,VIDIOC_QBUF,&buf)<0){perror("Failedtoqueuebuffer");close(fd);return-1;}}memset(&buf,0,sizeof(buf));buf.type=V4L2_BUF_TYPE_VIDEO_CAPTURE;buf.memory=V4L2_MEMORY_MMAP;buf.index=i;if(ioctl(fd,VIDIOC_QUERYBUF,&buf)<0){perror("Failedtoquerybuffer");close(fd);return-1;}buffers[i]=(unsignedchar*)mmap(NULL,buf.length,PROT_READ|PROT_WRITE,MAP_SHARED,fd,buf.m.offset);if(buffers[i]==MAP_FAILED){perror("Failedtomapbuffer");close(fd);return-1;}if(ioctl(fd,VIDIOC_QBUF,&buf)<0){perror("Failedtoqueuebuffer");close(fd);return-1;}}buf.type=V4L2_BUF_TYPE_VIDEO_CAPTURE;buf.memory=V4L2_MEMORY_MMAP;buf.index=i;if(ioctl(fd,VIDIOC_QUERYBUF,&buf)<0){perror("Failedtoquerybuffer");close(fd);return-1;}buffers[i]=(unsignedchar*)mmap(NULL,buf.length,PROT_READ|PROT_WRITE,MAP_SHARED,fd,buf.m.offset);if(buffers[i]==MAP_FAILED){perror("Failedtomapbuffer");close(fd);return-1;}if(ioctl(fd,VIDIOC_QBUF,&buf)<0){perror("Failedtoqueuebuffer");close(fd);return-1;}}buf.memory=V4L2_MEMORY_MMAP;buf.index=i;if(ioctl(fd,VIDIOC_QUERYBUF,&buf)<0){perror("Failedtoquerybuffer");close(fd);return-1;}buffers[i]=(unsignedchar*)mmap(NULL,buf.length,PROT_READ|PROT_WRITE,MAP_SHARED,fd,buf.m.offset);if(buffers[i]==MAP_FAILED){perror("Failedtomapbuffer");close(fd);return-1;}if(ioctl(fd,VIDIOC_QBUF,&buf)<0){perror("Failedtoqueuebuffer");close(fd);return-1;}}buf.index=i;if(ioctl(fd,VIDIOC_QUERYBUF,&buf)<0){perror("Failedtoquerybuffer");close(fd);return-1;}buffers[i]=(unsignedchar*)mmap(NULL,buf.length,PROT_READ|PROT_WRITE,MAP_SHARED,fd,buf.m.offset);if(buffers[i]==MAP_FAILED){perror("Failedtomapbuffer");close(fd);return-1;}if(ioctl(fd,VIDIOC_QBUF,&buf)<0){perror("Failedtoqueuebuffer");close(fd);return-1;}}if(ioctl(fd,VIDIOC_QUERYBUF,&buf)<0){perror("Failedtoquerybuffer");close(fd);return-1;}buffers[i]=(unsignedchar*)mmap(NULL,buf.length,PROT_READ|PROT_WRITE,MAP_SHARED,fd,buf.m.offset);if(buffers[i]==MAP_FAILED){perror("Failedtomapbuffer");close(fd);return-1;}if(ioctl(fd,VIDIOC_QBUF,&buf)<0){perror("Failedtoqueuebuffer");close(fd);return-1;}}perror("Failedtoquerybuffer");close(fd);return-1;}buffers[i]=(unsignedchar*)mmap(NULL,buf.length,PROT_READ|PROT_WRITE,MAP_SHARED,fd,buf.m.offset);if(buffers[i]==MAP_FAILED){perror("Failedtomapbuffer");close(fd);return-1;}if(ioctl(fd,VIDIOC_QBUF,&buf)<0){perror("Failedtoqueuebuffer");close(fd);return-1;}}close(fd);return-1;}buffers[i]=(unsignedchar*)mmap(NULL,buf.length,PROT_READ|PROT_WRITE,MAP_SHARED,fd,buf.m.offset);if(buffers[i]==MAP_FAILED){perror("Failedtomapbuffer");close(fd);return-1

温馨提示

  • 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
  • 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

评论

0/150

提交评论