基于 S3C6410 的视频无线监控系统设计报告
第一组
刘启明 12330210
刘悦 12330219
杨宇灏 12330374
目录
基于 S3C6410 的视频无线监控系统设计报告................................................................................1
一 camera 驱动分析与系统定制.....................................................................................................3
2.1 安装 arm-linxu-gcc 编译器并完成环境变量的设置............................................5
2.2 获得 linux 源码 ...................................................................................................... 5
2.3 裁剪内核及编译 ....................................................................................................5
1 需求分析及系统定制清单................................................................................................3
2. 系统定制过程 .................................................................................................................... 5
3. 编译根文件系统................................................................................................................ 6
4. 其他经验 ............................................................................................................................ 6
5.
Camera 驱动分析与设计..................................................................................................6
二 采集节点软件设计 ...................................................................................................................... 7
一、采集节点设计概述 ............................................................................................................7
二、VideoCapture 类设计概述.................................................................................................9
三、MFCH264Encoder 类设计概述 ........................................................................................13
四、Widget 类设计概述 ......................................................................................................... 15
五、转换为 C 代码设计概述 ..................................................................................................16
六、网络传输概述 .................................................................................................................. 17
七、采集,编码,传输的多线程实现概述 ..........................................................................17
八 参考资料 ............................................................................................................................ 17
三 接受节点软件设计 .................................................................................................................... 19
一、接收节点设计概述 ..........................................................................................................19
接收节点主要工作流程:.................................................................................................19
分步设计思路:..............................................................................................................20
二、JRTPlib 传输部分设计 ......................................................................................................22
H264 NAL 层分析.............................................................................................................22
NAL 的 RTP 打包流程 ...................................................................................................... 24
采集节点分包发送的流程..............................................................................................28
接收节点接收组包流程:..............................................................................................34
一 camera 驱动分析与系统定制
1 需求分析及系统定制清单
下表为系统定制的部分选项及其选择情况。因为可选项太多,不方便逐一列举。于是挑
选了一些关键的选项进行分析说明,其余为列明的选项则一般是按默认处理。
主菜单项
子菜单项
项目解释
选择与否&原因
prompt for development and/or
incomplete code/drivers
对测试阶段的代码、模块等
的支持
是。提高系统可拓展性
Local
version
kernel release
-
append
to
内核显示的版本信息
否。非必须。可修改为自己
喜欢的字符串
Automatically append version
information
version
string
the
to
自动在版本字符串后添加版
本信息
否。非必须
Support for paging of anonymous
memory (swap)
使用交换分区或交换文件来
作为虚拟内存
否。不设置 swap 分区
System V IPC
系统间进程通讯
是。进程通讯是必须的
BSD Process Accounting
Export task/process statistics
through netlink (EXPERIMENTAL)
General
setup
Auditing support
Kernel .config support
Kernel log buffer size (16 =>
64KB, 17 => 128KB)
Control Group support
用户进程访问内核时将进程
信息写入文件中
否。非特别需要
通过 netlink 接口向用户空
间导出任务/进程的统计信
息
否。非特别需要
审计支持,用于内核的某些
子模块同时工作
否。非特别需要
允许.config 文件保存在内
核当中
否。非特别需要
内核日至文件大小
填入 17。即 128KB
cgroup 支持,主要作用是给
进程分组,并动态调控进程
组的 CPU 占用率
否。非特别需要
Simple CPU accounting cgroup
subsystem
cgroup 子系统
否。非特别需要
Resource counters
资源计数器
否。非特别需要
Initial RAM filesystem and RAM 在真正内核装载前,做一些 是。保障系统可维护性
disk
support
(initramfs/initrd)
Optimize for size
操作(两阶段启动),比如加
载 module,mount 非 root 分
区,提供灾难恢复 root 分区
等
优化得到更小内核,在编译
时 GCC 命令后用“-Os”代替
“-O2”参数,但容易产生错
误二进制代码
是。为得到更精简的内核
Choose SLAB allocator (SLAB) 选择内存分配管理器
选择 SLUB。
Profiling support
剖面支持,用一个工具来扫
描和提供计算机的剖面图
否。非必须
Kprobes
调试内核
否。提高系统稳定性
Forced module loading
允许强制加载模块
否。保证系统稳定性
Module unloading
允许卸载已经加载的模块 是。提高系统可拓展性
Module versioning support
添加版本信息,为模块提供
独立的特性
否。非必须。我们的驱动会
直接编译进内核,而不是使
用加载模块的形式
Enable
loadable
module
support
Source checksum for all modules 为所有模块校验源码
否。非必须
Enable the
block layer
*
块设备支持
否。非必须
System Type ARM system type
选择 ARM 芯片类型
选择 Samsung S3C64XX。
Power
management
Power Management support
电源管理
否。减少内核体积
options
Networking
support
Wireless
无线网络支持
是。我们将使用无线网卡
Device
Drivers
Network device support
选择 Ethernet 和相应的 USB
Network Adapters
是。但因为目前 USB 网卡芯
片未知,只能稍后再对其驱
动进行安装
File
systems
DOS/FAT/NT
DOS、FAT、NTFS 等文件系统
支持
选择支持 NTFS 和 FAT32,
主要是考虑到开发过程中
可能会在读取 U 盘上的文
Miscellaneous filesystems
多种文件系统,除 ext*,DOS
外
找到 UBIFS 选项并 enable
件
Network File Systems
NFS 的支持
是。以后当有大型文件需要
在开发板上调试时,可以通
过 NFS 减少传输文件的麻
烦
2. 系统定制过程
2.1安装 arm-linxu-gcc 编译器并完成环境变量的设置
2.1.1 下载 arm-linux-gcc-4.5.1-v6-vfp-20101103.tgz 文件,解压到根目录
(sudo tar xvzf ./arm-linux-gcc-4.5.1-v6-vfp-20101103 /)
2.1.2 编辑/root/.bashrc,新增 PATH 环境变量的一个值,指向 arm-linxu-gcc
编译器所在的的 bin 文件夹(export
PATH=$PATH:/opt/FriendlyARM/toolschain/4.5.1/bin),编辑完成后登出账户再登入
即可。但其实也可以将该变量设置到~/.bashrc 中,设置完不需要登出再登入,在新
开的终端中该环境变量即可生效。
2.2获得 linux 源码
2.2.1 创建目录/opt/FriendlyARM/mini6410/linux,使用-p 参数迭代创建
2.2.2 复制 linux 源码压缩包 linux-2.6.28.6-20111212.tar.gz 到/tmp/linux
目录,解压到/opt/FriednlyARM/mini6410/linux 目录
2.3裁剪内核及编译
2.3.1 进入到目录/opt/FriendlyARM/mini6410/linux/linux-2.6.28.6 中(具
体子目录看所使用的内核源码版本号)
2.3.2 使用 make menuconfig 命令,开始配置/裁剪内核。期间可能会遇到一些
错误提示。比如说缺少 gcc 等,按照提示进行相应的安装即可。
2.3.3 具体裁剪方案见上表所述。裁剪后将会生成.config 配置文件。此后的内
核编译将会根据该文件的配置完成编译工作。
2.3.4
make menuconfig 配置完成之后,执行 make clean,先清除已经生成的模
块文件和目标文件。
2.3.5
make dep 编译变量依赖关系。注意使用超级用户执行,因为之前设置的
$PATH 变量是在 root 空间设置的。否则将报错,提示找不到 arm-linxu-gcc 命令。执
行该命令会提示“make dep is unnecessary now”,即此步可以跳过。
2.3.6
make zImage 正式生成经压缩以后的内核映像文件。
2.3.7
make modules 编译模块(可选)
2.3.8
make modules_install 安装编译后的模块(可选)
至此,该 linux 内核就裁剪、编译完成了。编译后 zImage 文件大小为 3.3M。
3. 编译根文件系统
3.1 若要使用最精简的文件系统即一些简单的工具,那使用 busybox 工具即可。
busybox 的配置过程与内核裁剪过程相似,在此就不赘述每个小工具的选择与否了。简
述一下编译过程:解压 busybox 源码后,执行 make menuconfig 配置选项;然后直接
make 命令编译;接着 make install 命令生成文件系统。使用 busybox 生成的文件系统
大概只有 870KB,里边只包含了一些常用工具,比如说“ls”,“grep”等。如果无须图
形化界面和更多复杂功能的话,该文件系统也能满足基本需求。
3.2 生成镜像文件。无论是直接使用 busybox 生成的文件系统,还是使用 FriendARM
提供的 rootfs_qtopia_qt4 文件系统包,都可以使用一条命令对该文件系统进行映像打
包:mkubimage-mlc2 source_folder_name target_file_name.ubi。该命令生成针对
mlc2 类型 Flash 存储芯片优化的 ubifs 格式文件系统。然而,因为美柚图形化界面等
内容,前者的映像文件只有 15M,后者则是 170M。
4. 其他经验
在使用 mktool 的时候,系统缺少 liblzo2 这个链接库。我的解决方法是安装该链
接库,再创建软链接。但在安装时,因为我的 ubuntu 系统是 64 位的,所以安装时也默
认安装的是 64 位的库,但 mkubimage 命令执行时使用的是 32 位的库。于是重新下载
32 位的库: sudo apt-get install liblzo2-dev:i386。下载完后因为库所在路径没
有正确添加的原因,还需要添加库所在的路径。但因为嫌麻烦,我直接创建了一个软链
接:sudo ln -s /lib/i386-linux-gnu/liblzo2.so.2 /usr/lib/liblzo2.so.2。之后
映像文件的创建就很顺利了。
5. Camera 驱动分析与设计
要认识 Camera 驱动,就需要先从 Camera 的原理开始。对于一个 CMOS Camera 来说,
最底层的就是 Camera Sensor。它属于外设的一种,它的制造公司会提供相应的 Camera
驱动。接着 Camera 控制器厂商使用自己的芯片对 Camera 进行一些底层的配置、控制等,
芯片厂商会开发自己的 Camera 控制器驱动,其中部分功能会调用到 Camera Sensor 驱
动,来完成整个 Camera 驱动的封装。
其中,Camera 控制器驱动的设计应该要满足 V4L2 子系统。该子系统提供了统一的
API 函数接口去操作不同的视频设备,大大简化了驱动开发的复杂度,增强了代码的重
用性。在此就不赘述其中的一些控制函数用法和数据结构了。
而 I2C 是一种应用非常广的总线通信标准。它定义了芯片输入输出引脚的功能和底
层通讯协议。这次我们所使用的 OV9650 Camera 也使用了该标准。因此,我们若要为摄
像头开发驱动,就需要了解 I2C 的通讯机制,在此基础上按照 V4L2 子系统的设计规范
对 Camera 进行调用、控制。
二 采集节点软件设计
一、采集节点设计概述
在“6410 平台视频硬编码示例”的代码中,为了采集时同步在输入显存在屏幕上显示,
图像采集直接使用的 read 方法,读取的是 RGB565 格式的数据,这样虽然方便同步显示,
但是在之后硬编码的过程中,还要转换为 YUV420 格式。由于示例代码的 rgb565 转 yuv420
的函数可能存在缺陷,导致编码压缩的视频色彩丢失。于是我们在设计做了如下考虑:
采集节点为了检验是否能成功采集,所以选择了同步显示,因而牺牲了格式。但只要我
们能够检验视频能够采集成功就可以了,保证图片质量是最重要的。所以有了以下思路:
1 采集时使用 mmap 方式直接采集 yuv420 格式的图片。
2 将 yuv420 格式的图片直接进行压缩
3 验证是否正确采集时,将 10s 内压缩的图片存入一个视频文件(用户界面不同步显示
图像),然后使用示例代码的回放功能查看是否能正常录制。
为了保证采集节点能够正常工作,采集节点的开发遵循逐步验证求精原则。在采集节点
的开发过程中,依次进行了如下验证。
1 检验摄像头是否支持 YUV420 格式。
编写 format.c 的代码,主要实现查询摄像头采集图像格式并打印输出的功能。此代码仅
用于测试是否支持 YUV420 格式,交叉编译后下载到开发板运行即可。
2 capture for test
只采集一帧图像数据,将原始数据写入 test-mmap.yuv 文件中,查看数据是否正常写入。
3 capture and encode for test
只采集并编码一帧图像数据,将原始数据写入 test-capture.yuv 文件中,与之前的
test-mmap.yuv 文件比较大小,观察图片是否被压缩写入。
4 record and play back for test
只进行采集 10s 视频数据,使用 h264 压缩存入文件,不同步显示。然后使用“6410 平
台视频硬编码示例”的代码中的 playback 功能,测试录制生成的文件,检验自己的设计是否
能够采集并压缩视频。
以上三个测试的代码均在 qt 中使用 c++实现,。对应的图像采集类 VideoCapture,图像
硬编码类 MFCH264Encoder。主要工作为图像采集的 C 代码的 C++移植(类的构造和调试),MFC
硬编码 API 的提取调用。简易的 qt 界面:
5 record and send to self
将采集并压缩的视频图像一帧一帧的发送到本机。
6 record and send to destination
将采集并压缩的视频图像一帧一帧的发送到接受节点。
以上两个测试的代码在 2~4 三个测试完成的前提下,进行测试。由于考虑到采集节点的
架构用 C 语言实现更为合适,于是在这两个测试中,将之前完成的 C++代码转换为了 C 代码,
在 qt 中只保留基本界面,点击按钮时使用 QProcess 调用 C 代码进行。
整个采集节点程序的工作流程如下图所示: