基于物联网的智能家居系统设计报告书(编辑修改稿)内容摘要:
码器信息 AVFrame 帧 AVPacket 包 AVPicture 图像的存储格式 AVStream 流结构 FFMPEG 常用的接口函数有: av_register_all();初始化函数 avcodec_find_decoder();查找解码器 avpicture_fill();初始化帧存储空间 img_convert();色彩变换 av_free_packet();释放包空间 av_free();释放解码空间 等等。 FFMPEG 及其编解码库 的 移植 FFMPEG 本身支持多种音视频格式的编解码,但是有一些是需要在 FFMPEG 编译之前编译好,并且在配置的时候指明其库的路径。 而且 FFMPEG 的各个版本 就间 存在差异,接口函数并不完全统一。 因此,很难做到一次写代码不用修改的就在各个版本之间实现。 而且,FFMPEG 的移植也会因交叉编译环境而产生不适应。 所以应该选合适的版本。 这次,我选用的是 ,交叉编译环境是 gcc 版本为 . 首先,需要在本机编译和移植以下库 libfaad、 libfaac、 libx26 libxvid。 libfaad libfaac、解码 aac 音频格式 libx264 更优秀算法的符合 libxvid 开放源代码的 MPEG4 视频编解码器 FFMPEG 交叉编译环境的配置如下 ./configure \ crossprefix=/usr/local/\ disablestatic disableyasm disablearmv6 disablearmv6t2 disablearmvfp disableasm 9 disableoptimizations disableffmpeg disableffplay disableffserver disabledoc \ disableffprobe disablework targetos=linux arch=arm enablelibfaac \ enablelibfaad enablelibfaadbin enablelibxvid enablelibx264 enablelib make amp。 amp。 make install FFMPEG 解码流程 注册全部文件格式和编解码器 打开输入文件 查找输入流 确定输入的音频流和视频流 打开音频、视频解码器 初始化声卡设备,并打开声卡设备 初始化解码所需空间开辟新的内存区域 初始化图像缩放结构 等待解码指令 解码成功执行下一条,不成功退出 判断包的数据类型,音频或者视频 如果是音频,则解码并将数据写入到声音设备中 如果是视频则将其保存在固定的内存地址中 循环解码直至完毕,或者接受到终止指令 基于 Qt 的 嵌入式播放器的实现 在这部分中,需要写两个类,一个是 QPlay,用于实现播放器的初始化 和播放器的解码工作。 由于播放器需要实现文件的解码和图像的显示,并且能够接受鼠标的事件,所以对于 QPlay类需要继承 QThread。 使用多线程技术来实现解码工作。 类的声明如下: class QPlay :public QThread { Q_OBJECT 10 public: QPlay()。 QPlay(char *)。 //带参数的构造函数,用于接收来自主线程的文件名 AVFormatContext *oc。 AVPacket packet。 struct SwsContext *sws。 AVCodecContext *pCodecCtx。 AVCodecContext *aCodecCtx。 AVCodec *pCodec。 AVCodec *aCodec。 AVFrame *pFrame。 AVFrame *pFrameRGB。 int audioStream。 int videoStream。 int fd。 unsigned int i。 int datasize。 unsigned char buff[6000]。 //声音解码的工作 空间 char *filename。 int numBytes。 uint8_t *buffer。 int frameFinished。 QString maxtimestr。 //视频文件的播放时长 int nb_index_entries。 float maxtime。 float frametime。 float timeframe。 float nowtimetmp。 int nowtime。 int max[4]。 11 void init(char *inputfilename)。 void stop()。 void play(int timestamp)。 bool initok。 void halt()。 bool isstop。 signals: void threadstop()。 void valuechange(int)。 void imagechanged(struct SwsContext *)。 void stopright()。 public slots: void time_out()。 void rightstop()。 protected: void run()。 private: volatile bool stopped。 }。 核心解码部分 void QPlay::run(){ while(!thisisstop) { usleep(28000)。 if(av_read_frame(oc,amp。 packet)0){ thisnowtimetmp+=thisframetime。 thisnowtime=((int)thisnowtimetmp+)。 emit thisthreadstop()。 return。 } if(==videoStream) 12 { avpicture_fill((AVPicture *)pFrameRGB,buffer,PIX_FMT_RGB24,pCodecCtxwidth,pCodecCtxheight)。 avcodec_decode_video(pCodecCtx,pFrame,amp。 frameFinished,)。 //解码视频 } if(==audioStream) { datasize=FFMAX(*sizeof(*buff),AVCODEC_MAX_AUDIO_FRAME_SIZE)。 avcodec_decode_audio2(aCodecCtx,(int16_t*)buff,amp。 datasize,)。 write(fd,buff,datasize)。 thisnowtimetmp+=thisframetime。 thisnowtime=((int)thisnowtimetmp+)。 emit thisvaluechange(thisnowtime)。 } } emit thisstopright()。 } 13 播放器的逻辑结构 图 31 播放器主界面截图 在播放器 上方为主菜单选择按钮。 中间栏左侧为视频显示区,用于显示视频图像信息。 中间栏右侧,为播放列表,列出在指定目录下所有的音视频文件。 双击播放列表下的视频文件名,则会播放该视频文件。 此处,以 QT 的 MVC 架构实现。 双击文件名,产生一个时间触发一个信号,将此信号与一个自定义的槽函数相关联,槽函数在接到事件所传来的 QModelIndex 的对象后读出 QModelIndex 中的文件名信息,并且开始播放。 播放刘表下面实时显示播放时间于总时常。 功能按钮上有一个进度条,用于实时现实播放进度。 并且,拖动进度条可以将视频文件定位到相 应的时间继续播放。 本嵌入式视频播放器共有三种播放模式。 顺序播放,单曲循环和全部循环。 单曲循环是循环当前播放的歌曲。 顺序播放,从播放列表当前播放的文件开始,顺序向下播放,当最后一首歌曲播放完毕后,播放器停止。 全部循环则是在顺序播放基础上,仅在最后一首歌曲播放完毕 14 后,开始跳转到列表中的一首歌曲。 以此往复。 打 开 默 认 视 频 文 件解 码 器状 态 为 停 止等 待 用 户 输 入是 否 有 输 入 有 输 入 判 断 输 入无 输 入 返 回播 放下 一 曲 快 进上 一 曲 快 退 停 止 全 屏是 否 是 最 顶 层是 , 重 新 播 放 当 前文 件否 , 进 行 播 放 上 一曲是 否 是 最 底 层是 , 选 择 第 一 个 视频 文 件 播 放否 , 进 行 播 放 下 一曲是 否 达 到 最 大值 1 0是 , 停 止 快 进 播 放否 , 继 续 进 行 快 进是 否 为 全 屏判 断 当 前 状 态是 否 达 到 最 小值 + 1 0判 断 当 前 状 态是 , 停 止 快 退 播 放否 , 继 续 进 行 快 退播 放 , 将 状 态 置 为暂 停 , 并 且 暂 停暂 停 , 将 状 态 置 为播 放 , 并 且 播 放停 止 , 返 回其 他 , 将 状 态 置 为停 止 , 并 且 停 止 播放 当 前 文 件是 , 恢 复 窗 口 大 小否 , 将 窗 口 大 小 设置 为 全 屏当 前 播 放 状 态 选 择用 户 单 击判 断 状 态单 曲 循 环 全 部 循 环 顺 序 播 放全 名 屏 幕 控 制 菜 单右 键判 断 是 否 显 示未 显 示 , 显 示 显 示 , 隐 藏 图 32 播放器软件流程图 控制按钮所实现的功能有:上一曲,快退、播放与暂停、停止、快进、下一曲、选择模式。 15 播放器内部共有 6 种状态。 VIDEPPLAYING 视频播放 VIDEOSTOP 视频停止 VIDEOSUSPENDED 视频暂停 VIDEOFASTINTO 视频快进 VIDEORETREAT 视频快进 VIDEOEND 视频结束 播放即正常播放视频,进入停止状态后,视频解码器不关闭,但是停止解码,停止播放,并且将视频的位置信息置 ,从头开始播放。 视频快进、快退状态为视频的加速解码,设置一个定时器,当选中快进或者这快退后,定时器快开始工作,在解码完当前帧后,跳过几帧 后,再解码一次,并刷新图像,刷新时间。 当时间小于 10 秒时无法进行快退,当播放时间大于总时长 10 秒时,无法进行快进。 当快退至小于 10 秒时或者快进至大于总时长 10 秒时,则自动进入播放状态。 当点击播放按钮后,会停止快进或者快退定时器,由此进入播放状态。 视频的进度条和快进快退的定位由 FFMPEG 提供的 API av_seek_frame(AVFormatContext *s, int stream_index,int64_t timestamp,int flags)。 此函数,主要功能是根据流控制信息与输入的时间戳和标志信息,将文件流定位到与之对应的时间戳。 再次解码时则从定位后的流开始再次解码。 由此而实现播放器的快进、快退与进度条的定位功能。 除了可以以当前大小观看视频,还可以全屏幕观看,对播放窗口双击鼠标,或者点击全屏幕按钮,就可以将视频画面设为全屏幕。 全屏幕的实现主要重写了 QLabel 类的鼠标双击事件。 并且定义一个 bool 变量来监控是否进入全屏幕状态。 当对 QPlayLabel 双击之后,产生一个双击信号。 在主程序中接收双击信号 ,如果不是全屏幕,就将画面设置为全屏 640*480。 如果是全屏幕,则恢复原窗口大小。 在全屏幕状态下,单击鼠标右键可以显示控制栏。 包括,快进、快退、上一曲、下一曲、暂停与播放、停止、全屏幕及播放状态等按钮和时间进度条。 再次单击右键也可以隐藏这些工具。 16 基于 QtNetwork 和 V4L的视频监控系统 V4L 简介 ideo4Linux(简称 V4L)是 Linux 中关于视频设备的内核驱动,它为针对视频设备的应用程序编程提供一系列接口函数( API),这些视频设备包括现今市场上流行的 TV卡、视频捕捉卡和USB 摄像头等。 视频编程的流 程。基于物联网的智能家居系统设计报告书(编辑修改稿)
相关推荐
基于物联网的农业生产管理解决方案 第 19 页 智能节水灌溉系统 可 针对具体的植物种类、成熟度、土壤质地、地形坡度、灌水器类型等,通过相应的传感器包括(如温度、湿度、光照辐射、降雨、风力等),实时采集环境信息,并通过专家系统对数据进行综合分析及数据组织,并发布及时准确的生产指令,将土壤含水量保持在满足植物生长的最佳状态,又不浪费水。 系统的功能设计表 序 号 功能名称 功能说明 1 自动
5) 位时间为 或 ; NEC 码的位定义:一个脉冲对应 560us 的连续载波,一个逻辑 1 传输需要 ( 560us 脉冲 +1680us 低电平),一个逻辑 0 的传输需要 ( 560us 脉冲 +560us 低电平)。 而 红外 接收头在收到脉冲的时候为低电平,在没有脉冲的时候为高电平,这样,我们在接收头端收到的信号为:逻辑 1 应该是 560us 低+1680us 高,逻辑 0 应该是
知道 LED获得新的数据并显示出来, ST 才会重新置 AT89C51 转换速率很快(微 妙量级),所以不会影响其接收新的数据。 、设计过程 简易交流电压测量电路由 A/D 转换、数据处理及显示控制等组成。 电路原理图见附录 2。 A/D 转换由集成电路 0804 完成。 0804 具有 8 路模拟输入端口,地址 (2325)脚可决定对哪路模拟输入作 A/D 转换, 22 脚为地址锁存控制
物体都能向外辐射红外热,不同温度的物体,其释放的红外能量的波长是不 一样的,因此红外波长与温度的高低是相关的。 而任何物体由于本身的物理和化学性质的不同、本身温度不同所产生的红外辐射的波长和距离也不尽相同,通常分为三个波段。 近红外:波长范围 ~ 3μm; 中红外:波长范围 3~ 25μm; 远红外:波长范围 25~ 1000μm; 人体辐射的红外光波长 3~ 50μm,其中 8~ 14μm占
各部门加强联系与沟通,保证信息准确、畅通,加强合作,对外一致。 ( 4) 联合运营 在经营上公司并不是独立运作,需要与各社会物流公司有着广泛深入的联系,将在“物流与供应链信息管理平台”下由供应商进行运输与配送,统一使用标识,相互促进,协调发展。 ( 5) 第三方协议 同时和数众多的物流供应商建立战略 合作伙伴关系,填补实体方面的空白,因为任何一个物流公司要想在物流领域完全自己操作是 不太可能的
位串行模数转换器,使用开关电容逐次逼近技术完成 A/D 转换过程。 由于是串行输入结构,能够节省 51 系列单片机 I/O 资源;且价格适中,分辨率较高,因此在仪器仪表中有较为广泛的应用。 2TLC2543 的特点 : ( 1) 12 位分辩率 A/D 转换器; ( 2)在工作温度范围内 10μ s 转换时间; ( 3) 11 个模拟输入通道; ( 4) 3 路内置自测试方式; ( 5)采样率为