基于S3C2440在Linux上实现视频监控系统的FFmpeg编解码设计

发布时间:2023-01-13  

引言

随着视频编解码技术、计算机网络技术、数字信号处理技术和嵌入式系统的发展,以嵌入式网络视频服务器为核心的远程视频监控系统开始在市场上崭露头角。该系统把摄像机输出的模拟视频信号通过内置的嵌入式视频编码器直接转换成视频流,通过计算机网络传输出去。嵌入式网络视频服务器具备视频编码处理、网络通信、系统控制等强大功能,直接支持网络视频传输和网络管理,使得监控范围达到前所未有的广度。在远程视频监控系统中,摄像头获取的原始视频流在传输之前需要压缩,而FFmpeg可以将原始视频压缩为H264格式视频流,H264是一种被广泛使用的高精度视频的录制、压缩和发布格式,因此采用FFmpeg来实现。


1、系统方案

系统是在S3C2440平台上运行嵌入式Linux系统,使用CMOS摄像头OV9650获取实时视频图像数据,采用H264标准通过FFmpeg原始视频进行压缩编码成视频流,通过网络传输,用户在接收处理端经过FFmpeg解码之后,使用OpenCV显示播放即可实时查看远程视频图像。


系统由两部分组成:采集发送端和接收处理端,采用Client/Server设计模式来实现两者之间的相互通信,由接收处理端向采集发送端发送控制信号,采集发送端开启摄像头进行视频数据采集,采集的原始视频数据是yuv422格式,经过FFmpcg编码压缩成H.264格式视频流,经通信网络传输到接收处理端;接收处理端接收到视频流数据后,经FFmpeg解码,通过OpenCV进行显示。采集发送端视频数据采集和发送采用三星公司的具有ARM920T内核的S3C2440作为嵌入式微控制器,接收处理端采用普通电脑。系统方案如图1所示。

基于S3C2440在Linux上实现视频监控系统的FFmpeg编解码设计

2、 采集发送端

采集发送端主要包括嵌入式Linux平台和摄像头两部分,嵌入式Linux平台需要搭建交叉编译环境,而摄像头需要驱动程序才能正常工作。


嵌入式Linux平台采用三星公司的S3C2440A处理器为硬件平台,S3C2440A处理器是一款基于ARM920T内核的16/32bit嵌入式处理器,主频

400MHz,最高可达533MHz,支持30/130/200万像素CMOS摄像头,支持linux2.4和Wince4.2双操作系统,适合应用于对功率和成本都较敏感的嵌入式系统场合。


摄像头采用Omni Visio公司生产的CMOS摄像头OV9650,具有高敏感度、低功耗,高分辨率(最高1300X1028 pixels),支持大量常用的图像格式、支持自动图像控制等优点。在接口上能够保持与S3C2440的一致性。输出图像最大为130万像素,输出图像格式包括SXGA,VGA,QVG A,CIF,QCIF等,并可以输出不同尺寸的图像。对于不同的输出图像格式,最高帧率可以不同,最高可达120f/s,输出的8位数据格式包括YUV/YCbCr(4:2:2)、GRB(4:2:2)、原始RGB数据3种。


2.1 建立嵌入式Linux平台

建立嵌入式Linux系统的基本流程:首先在宿主机上建立交叉编译环境,然后移植Linux的引导程序到目标板,最后构建嵌入式Linux系统并移植到目标板。构建嵌入式Linux系统主要包括对内核进行裁剪和配置,根据实际的硬件系统进行内核和外设驱动程序的移植开发,以及构建Linux的根文件系统。


2.2 摄像头驱动配置

CMOS摄像头驱动以MODULES的形式编写,因为MODULES形式的驱动可动态加载到Linux内核。


加载驱动程序后,就可以像操作普通文件一样对摄像头进行操作。如:定义intm_filev412,通过m_filev412=open(“/dev/camera” O_RDWR)打开摄像头,通过read(fd,&inyuv422,D SIZE)读取摄像头的视频数据到数组inyuv422中,通过closc(m_filev412)关闭摄像头。有了视频数据后,就可以通FFmpeg进行编码。


2. 3 FFmpeg编码

2.3.1 FFmpeg简介

FFmpeg是一个开源免费跨平台的视频和音频流方案,属于自由软件,采用LGPL或GPL许可证(依据所你选择的组件),是一个集录制、转换、音/视频编解码功能为一体的、完整的开源解决方案。FFmpeg的开发基于Linux操作系统,也可在大多数操作系统中编译和使用。FFmpeg支持MPEG、DivX、MPEG4、AC3、DV、FLV等40多种编码,AVI、MPEG、OGG、Matroska、ASF等90多种解码;TCPMP、VLC、MPlayer等开源播放器都用到了FFmpeg。


FFmpeg中FF是指Fast Forward。


2.3.2 编码

OV9650摄像头输出的数据为yuv422格式,而FFmpeg编码需要输入yuv420格式数据,因此在编码之前需要先将yuv422格式数据转化为yuv 420格式。FFmpeg中的函数sws_scale()可以实现这个过程。

在使用FFmpeg编码之前,首先需要对FFmpeg库进行初始化,注册所有的编解码器以及文件格式,设置编码器码率、帧速率、编码像素格式等参数,然后寻找编码器并打开,打开编码器之后才可以进行编码。通过设置结构体AVCodecContext中的各个成员参数来完成参数的设置过程,例如通过设置AVCodecContext-》bit_rate,AVCodecContext-》width,AVCodecContcxt-》height等可以设置码率,宽度和高度等,通过设置AVCodecContext-》pix_fmt=PIX_FMT_YUV420P设置YUV420像素格式。编码核心函数是avcodec_encode_video()。系统每采集一帧数据,就送给avcodec_encode_video()函数编码成H.264视频流。其编码流程如图2所示。

基于S3C2440在Linux上实现视频监控系统的FFmpeg编解码设计

下面对编码流程的各个步骤中主要函数的作用进行详细介绍:

1)av_register_all():注册库中含有所有文件格式和编解码器,没有这一步将无法打开编解码器。

2)av_open_imput_file():打开摄像头视频文件。

3)av_find_stream_info():寻找视频流。

4)av_find_encoder():寻找编码器,编码器参数需在pCodec中初始化,参数的初始化很重要,对编码的图像质量有很大影响。

pCodec=avcodec_find_encoder (CODEC_ID_H264);//寻找H.264格式编码器

5)avcodec_alloc_frame():为编码帧分配内存。

pFrame=avcodec_alloc_frame();//pFrame为AVFrame格式

6)avcodec_open():打开编码器。

7)av_read_frame():从视频流中读取一帧视频数据。

8)avcodec_encode_video():编码一帧视频数据。

9)avcodec_close():关闭编码器。

10)avformat_close_mput file():关闭视频摄像头文件。


3、 接收处理端

接收处理端可以与任意一个采集发送端进行连接通信。连接后可以接收采集发送端发送的视频数据,经过FFmpeg解码后显示。


3.1 FFmpeg解码

用FFmpeg解码的流程与编码的流程大致相同,只是解码的核心函数为avcodec_decode_video()。接收处理端接收到一帧数据后,通过avpicture_fill()存储到AVFrame格式的内存空间中,然后再使用avcodec_decode_video()函数进行解码。其解码流程如图3所示:

基于S3C2440在Linux上实现视频监控系统的FFmpeg编解码设计

3.2.视频显示

FFmpeg对H.264解码出来格式是YUV(.i420)格式,需要转换成RGB(.rgb24)格式显示,使用FFMPEG中的sws_scalc()函数可以实现格式转换。


显示视频采用的是OpenCV。显示的核心函数是cVShowImage(char* name,lpllmage* dst),将得到的RGB(.rgb24)格式数据转换为OpenCV格式的lpllmage数据,然后显示在监控窗口上,如图4所示:


4 、结束语

随着视频压缩技术的发展成熟,嵌入式视频监控逐渐在监控领域占有重要地位。以S3C2440为嵌入式硬件平台,通过摄像头采集数据,在嵌入式Linux与Windows操作系统相结合的跨平台上,实现FFmpeg的编解码,为实际嵌入式视频监控系统的视频压缩传输设计,提供了一种可行的方法。


文章来源于:电子工程世界    原文链接
本站所有转载文章系出于传递更多信息之目的,且明确注明来源,不希望被转载的媒体或个人可与我们联系,我们将立即进行删除处理。

相关文章

    板子闪存够大,近30M东西啊(有空了看能不能精简下)!我是把lib目录下的库文件拷到了板子的默认lib下,所以也就省了export。当然还有ffmpeg程序,保持着nfs,用如下命令试下:#./ffmpeg......
    三菱PLC、西门子指令详解;三菱PLC指令详解 1 取指令与输出指令(LD/LDI/LDP/LDF/OUT) 1)LD(取指令) 一个常开触点与左母线连接的指令,每一......
    拉流要支持另一种视频格式,则还要写代码来实现解码。如果录像要支持另一种视频格式,也要写代码来实现编码。 方案2)原框架的代码保留不变(或仅作少量改动)。仅录像功能,由JNI+FFmpeg来实现并暴露出JNI接口......
    常用 U-boot命令详解;U-boot发展到现在,他的命令行模式已经非常接近Linux下的shell了,在我编译的U-boot-2009.11中的命令行模式模式下支持“Tab”键的命令补全和命令......
    ,可以通过以下方式测试: ① 用如下命令编译FFmpeg。 。/configure enablecrosscompile arch=armv6 cpu=armv6 targetos......
    简要使用信息                char *help;        // 命令详细帮助信息        } 成员cmd是个函数指针,需要指向该命令对应的处理函数。这也是在前面的模板中先定义一个处理函数的原 因。所有命令......
        |   |-- ? md 或者 help md 可以查看 md 命令详细介绍    |-- print    |   |-- 输出的是 u-boot 环境变量    |-- set......
    ARM+FPGA开发板基于FFMPEG的网络视频播放终端——米尔NXP I.MX 8M;ARM+FPGA开发板基于FFMPEG的网络视频播放终端——米尔NXP I.MX 8M MINI+ARTIX......
    FFmpeg移植S3C2440;FFmpeg移植过程: FFmpeg是一个开源免费跨平台的视频和音频流方案,属于自由软件,采用LGPL或GPL许可证。它的移植同样遵循LGPL或GPL移植......
    FFmpeg移植到mini2440;Fedora 8arm-linux-gcc 3.4.1 下载ffmpeg_x264_src_20071007源码 免费下载地址在 http......

我们与500+贴片厂合作,完美满足客户的定制需求。为品牌提供定制化的推广方案、专属产品特色页,多渠道推广,SEM/SEO精准营销以及与公众号的联合推广...详细>>

利用葫芦芯平台的卓越技术服务和新产品推广能力,原厂代理能轻松打入消费物联网(IOT)、信息与通信(ICT)、汽车及新能源汽车、工业自动化及工业物联网、装备及功率电子...详细>>

充分利用其强大的电子元器件采购流量,创新性地为这些物料提供了一个全新的窗口。我们的高效数字营销技术,不仅可以助你轻松识别与连接到需求方,更能够极大地提高“闲置物料”的处理能力,通过葫芦芯平台...详细>>

我们的目标很明确:构建一个全方位的半导体产业生态系统。成为一家全球领先的半导体互联网生态公司。目前,我们已成功打造了智能汽车、智能家居、大健康医疗、机器人和材料等五大生态领域。更为重要的是...详细>>

我们深知加工与定制类服务商的价值和重要性,因此,我们倾力为您提供最顶尖的营销资源。在我们的平台上,您可以直接接触到100万的研发工程师和采购工程师,以及10万的活跃客户群体...详细>>

凭借我们强大的专业流量和尖端的互联网数字营销技术,我们承诺为原厂提供免费的产品资料推广服务。无论是最新的资讯、技术动态还是创新产品,都可以通过我们的平台迅速传达给目标客户...详细>>

我们不止于将线索转化为潜在客户。葫芦芯平台致力于形成业务闭环,从引流、宣传到最终销售,全程跟进,确保每一个potential lead都得到妥善处理,从而大幅提高转化率。不仅如此...详细>>