新闻中心

EEPW首页>嵌入式系统>设计应用> 基于FFmpeg的远程视频监控系统编解码

基于FFmpeg的远程视频监控系统编解码

作者: 时间:2013-03-05 来源:网络 收藏

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)关闭摄像头。有了视频数据后,就可以通进行编码。
2. 3编码
2.3.1简介
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所示。

本文引用地址://m.amcfsurvey.com/article/148086.htm

d.JPG


下面对编码流程的各个步骤中主要函数的作用进行详细介绍:
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():关闭视频摄像头文件。

linux操作系统文章专题:linux操作系统详解(linux不再难懂)
摄像头相关文章:摄像头原理


评论


相关推荐

技术专区

关闭