基于物联网的智能家居系统设计报告书(编辑修改稿)内容摘要:

码器信息 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 摄像头等。 视频编程的流 程。
阅读剩余 0%
本站所有文章资讯、展示的图片素材等内容均为注册用户上传(部分报媒/平媒内容转载自网络合作媒体),仅供学习参考。 用户通过本站上传、发布的任何内容的知识产权归属用户或原始著作权人所有。如有侵犯您的版权,请联系我们反馈本站将在三个工作日内改正。