设为首页 加入收藏 期刊导航 网站地图
  • 首页
  • 期刊
    • 数学与物理
    • 地球与环境
    • 信息通讯
    • 经济与管理
    • 生命科学
    • 工程技术
    • 医药卫生
    • 人文社科
    • 化学与材料
  • 会议
  • 合作
  • 新闻
  • 我们
  • 招聘
  • 千人智库
  • 我要投搞
  • 办刊

期刊菜单

  • ●领域
  • ●编委
  • ●投稿须知
  • ●最新文章
  • ●检索
  • ●投稿

文章导航

  • ●Abstract
  • ●Full-Text PDF
  • ●Full-Text HTML
  • ●Full-Text ePUB
  • ●Linked References
  • ●How to Cite this Article
Software Engineering and Applications 软件工程与应用, 2013, 2, 104-108
http://dx.doi.org/10.12677/sea.2013.25019 Published Online October 2013 (http://www.hanspub.org/journal/sea.html)
Real-Time Video Transmission and Decoding Based on
Android Mobile Phone
Xiaojia Wu, Hua Ye, Ya Su, Yanlan Yang
School of Automation, Southeast University, Nanjing
Email: wuxiaojiaemma@163.com
Received: Sep. 1st, 2013; revised: Sep. 11th, 2013; accepted: Sep. 17th, 2013
Copyright © 2013 Xiaojia Wu et al. This is an open access article distributed under the Creative Commons Attribution License, which permits
unrestricted use, distribution, and reproduction in any medium, provided the original work is properly cited.
Abstract: This paper discusses video transmission and decoding of the Android mobile phone video surveillance
application. Mobile client communicates with server through Socket to receive video data, and restructures the video
data to a video frame according to the frame number. This paper designs to use frame dropping mechanism to solve the
problem that undecoded video frame filling the buffer because of the phone’s weak processing power. Then, it
completes real-time decoding and image format conversion of the video data in H.264 format by FFmpeg codec library
which was migrated to the Android system. The test results show that the software runs well, the picture is clear and
smooth.
Keywords: Video Transmission; H.264 Decoding; Android; Video Surveillance
基于 Android 手机的实时视频传输和解码
吴晓佳,叶 桦,苏 雅,仰燕兰
东南大学自动化学院,南京
Email: wuxiaojiaemma@163.com
收稿日期:2013 年9月1日;修回日期:2013年9月11 日;录用日期:2013 年9月17 日
摘 要:本文主要探讨了 Android 手机视频监控软件的视频传输和解码。手机客户端通过 Socket 与平台服务器
通讯,接收视频数据,并按照帧号重组成视频帧。本文设计采用丢帧机制解决了由手机处理能力弱导致待解码
视频帧占满缓存区的问题,然后通过移植到Android 系统中的 FFmpeg解码库,实现了 H.264格式视频数据的实
时解码和图像格式转换。经测试结果表明软件的运行良好,画面清晰流畅。
关键词:视频传输;H.264 解码;安卓操作系统;视频监控
1. 引言
视频监控作为安防系统的重要组成部分,在民用
安全、城市交通和重大事件中发挥着巨大的作用,越
来越受到人们的重视。传统的视频监控系统大多通过
线缆或光纤将视频信号传输到监控中心,但由于网线
的限制,不利于监控系统的迅速搭建[1],人们只能在
一定设备环境下进行监控。随着信息化程度的提高,
人们已经不满足于这种视频监控模式,迫切需要一种
更加方便,实时的视频监控模式。Android 系统的产
生和 3G 网络的普及为此提供了技术支持。Android
是Google公司推出的基于 Linux 的开源操作系统,凭
借其良好的稳定性、开放性和可移植性,广泛应用于
智能手机和平板电脑[2]。3G 网络的普及应用为流媒体
无线传输业务提供了保证。本文在 Android 操作系统
Copyright © 2013 Hanspub
104
基于 Android 手机的实时视频传输和解码
的智能手机上,利用无线网络通信技术,H.264编码
技术和 FFmpeg视频解码解决方案,研发了一个视频
监控应用软件,正好满足了这一需求。用户只要随身
携带手机,在有无线网络的情况下就可以通过本软件
随时,随地查看监控画面,更加快捷,方便,具有较
大的应用前景。本文主要探讨了 Android 手机视频监
控软件的视频传输和解码。
2. 整体方案设计
2.1. 系统结构
本系统由摄像头,监控终端,平台服务器和智能
手机客户端四个部分组成,系统结构如图 1所示。摄
像头负责拍摄采集视频数据,传输到终端;摄像头带
有云台,可以在上下左右四个方向的转动,并具有调
焦功能。一个监控终端可以同时控制几个摄像头,一
个摄像头即为一路视频。监控终端将采集到的视频数
据按 H.264 格式编码后上传到平台服务器,并控制着
摄像头的转动和调焦。平台服务器作为终端和手机客
户端之间的沟通中介,负责将终端上传的视频数据转
发到手机客户端;同时将手机客户端的指令转发到终
端。手机客户端主要负责接收和解析来自平台的数据
包,解码 H.264视频帧后,将视频画面播放显示,也
可以根据用户需求发出相应指令控制摄像头转动和
调焦。
2.2. 软件架构
基于 Android 的手机视频监控软件的架构如图 2
所示,由视频解码,视频显示和通讯三个模块构成。
其中通讯模块负责与服务器之间的数据收发。主要分
成三个部分,一是接收来自服务器的所有数据,并对
数据进行处理,当解析到设备信息,推送到用户界面
显示,当解析到视频数据则将数据存储到视频缓冲区
中;二是将用户操作产生的控制命令传送到服务器
端;三是向服务器发送和接收心跳,保持手机客户端
Figure 1. System structure diagram
图1. 系统结构图
和服务器之间的稳定连接。视屏解码模块负责从缓冲
区中读取视频数据,送入解码器进行解码,并调整解
码后图像的分辨率和格式适应不同型号的手机。视频
显示模块将解码获得的图像绘制到界面上实现视频
显示。
3. 通讯模块实现
3.1. 通讯协议
手机视频监控最重要的一个性能指标就是实时
性。因此,在选择网络通信协议时必须着重考虑这个
因素。TCP 和UDP 是目前最为常用的两种网络通讯
协议。TCP 是一种面向连接的、可靠的、基于字节流
的运输层通信协议,服务器和客户端的传输数据之前
必须先建立连接。TCP提供超时重发,丢弃重复数据,
检验数据,流量控制等功能,保证数据能从一端传到
另一端。用户数据报协议(UDP)是一种无连接的传输
层协议,UDP在传输数据报前不用在客户和服务器之
间建立一个连接,且没有超时重发等机制,故而传输
速度很快,同时它不提供可靠通信保证,数据包可能
会丢失。分析比较两者的特点,本软件在 Android手
机客户端和平台服务器之间采用UDP 协议连接,以
保证视频传输的实时性,提高视频传输速度[3]。
UDP 应用在网络通讯中,首先要建立套接字
DatagramSocket,通过 DatagramSocket就可以接受和
发送 UDP 数据报(DatagramPacket)。DatagramPacket
中包含了要发送的数据信息和目的地址的信息,
DatagramSocket 根据该信息把 UDP 数据报发送到目
的地址[4]。
3.2. 视频数据处理
3.2.1. 视频组包
在视频传输的过程中,关键帧的数据量是非常大
Figure 2. Software architecture diagram
图2. 软件架构图
Copyright © 2013 Hanspub 105
基于 Android 手机的实时视频传输和解码
的,根据视频分辨率和码率的不同可以达到几万甚至
几十万个字节,不可能在一个数据包中传输,往往需
要分成独立的 NALU 单元后封装在几个数据包中发
送。因此,在接收到数据后,手机客户端需要将收到
的数据包解析,然后把帧号相同的视频数据重新组成
一帧。客户端在接到第一帧数据的时候先解析出帧
号,包号(当一帧数据被分成几包,包号表示此数据包
是一帧图像的第几包)和视频数据等信息,然后将包号
和视频数据信息保存到构建的 Package对象中,并将
Package 对象存储到缓冲区,记录下当前帧号为
P_FrameId 后,开始接收下一包数据。当接收到的新
数据包的帧号与P_FrameId 相同,表明视频数据是同
一帧的数据,将其以同样的方式存储到缓存区中,当
收到新的数据包的帧号与P_FrameId 不同时,就认为
上一帧的数据已经收完,就可以把缓冲区中的数据组
包。将缓冲区清空后,再将收到的数据包信息存入缓
冲区,同时更新P_FrameId。
Package{
Int P_Id;//包号
Byte[] P_data;//视频数据
}
服务器发送的视频数据包在网络传出的过程中
时,由于网络不稳定等因素有可能出现数据包乱序到
达的情况,因此在数据包组包的过程中,设计采用冒
泡算法根据包号将数据包排序。
3.2.2. 丢帧机制
由于 CPU处理能力和内存的限制,手机解码速
度可能滞后于接收到视频数据的速度,视频缓冲区也
不能过大,当过多的视频数据滞存在缓冲区中时,不
仅会占满视频缓冲区,也会影响视频监控的实时性。
为解决这个问题,本文采取了丢帧机制,视频的帧率
为15FPS,软件设计视频缓冲区最多可以容纳 30 个视
频帧,当视频帧占满缓冲区时就要丢弃一部分视频
帧。以前的一些视频监控软件采用的丢帧方式是当发
现缓冲区满以后,将新收到的视频帧丢弃。这种丢帧
方式虽然也能保证软件正常运行,但是没有考虑到编
码方式的特征,影响了手机的实时性,也可能造成一
段时间的监控盲区。本文采取的丢帧机制是,丢弃较
早到达的视频帧,容纳新的数据来保证视频监控的实
时性。同时考虑监控终端采用的H.264 视频编码标准,
在编码过程中只使用了I 帧和P帧。其中 I帧是关键
帧,可以独立解码;P帧是参考帧,是这一帧跟之前
一个关键帧(或P帧)的差别,在接收到 I帧的基础上,
P帧才能进行解码。从两者的重要性考虑,首先丢弃
P帧,再丢弃 I帧。在既定的缓冲区中保留更多的可
用视频帧,具体处理流程如图3。
3.3. 心跳模块
手机视屏监控要求具有稳定性,为保证手机客户
端和平台服务器之间长时间稳定的连接,本文设计采
用心跳模块。心跳功能由 Service 实现,Service 是
Android的服务组件,没有用户界面,在后台运行,
对用户完全透明[5],不影响前台界面的正常运行。
在使用 Service 前先要在 Androidmainfest.xml 文
件中进行注册,注册的代码如下:
<service
android:name = "com.video.service.HeartbeatServi
ce "
android:enabled = "true"
android:exported = "false"
android:label = "HeartbeatServiceOFvideo">
</service>
在登陆到平台以后调用 context.startService()函数
开启 Service,在 Service 中开启一个线程,定时向平
台发送心跳包,平台在收到心跳包后给以回复,当心
跳线程连续三次没有收到回复的时候,向广播接收组
件(BroadcastReceiver)发送广播告警信息,Broadcast
Receiver 在收到广播信息后,调用 context.stopService()
Figure 3. Frame dropping mechanism
图3. 丢帧机制
Copyright © 2013 Hanspub
106
基于 Android 手机的实时视频传输和解码
函数将 Service结束,然后跳转到登陆界面并给出断
线提醒,用户可以重新连接平台。
当手机客户端在接收视频数据的时候,客户端和
服务器之间有很频繁的数据交互,不需要用心跳包来
来维持与服务器之间的连接,心跳包的存在反而会给
客户端和服务器都带来负担,因此,在接收视频数据
的时候,客户端不再验证心跳包,直到视频数据终止
传输。
4. 视频解码模块实现
4.1. FFmpeg解码库移植
Android平台自身的多媒体框架OpenCore 只支持
3gp、MP4 两种视频格式,无法解码终端编码的 H.264
格式视频。同时 Android 没有开放 OpenCore 的底层
视频编解码 native API,利用Java 来处理有关音视频
编解码的工作显然力不从心,所以本文移植FFmpeg
来完成解码工作[6]。FFmpeg 是一个集录制、转换、音
/视频编码解码功能为一体的完整开源解决方案[7]。
FFmpeg 是用 C语言编码的,但是在Windows 平台下,
Android 环境不能直接支持 C语言的开发。因此,还
需要利用 Android NDK将其编译为动态链接库后才
能在 Android平台下进行开发。
4.2. 视频解码
视频解码模块基于 FFmpeg 底层解码函数调用,
由C语言编程实现的;主要负责从缓冲区中读取视频
帧,将其进行解码,并将解码后的视频数据交送视频
显示模块。监控终端上传的视频是 H.264 视频编码
的分辨率为 352 × 288,YUV420 格式的视频帧。针对
本项目在 FFmpeg解码方案的基础上设计H.264 解码
器。
H.264 解码器主要成为四步:初始化解码器,解
码视频帧,视频分辨率/格式转换,释放解码器。
初始化解码器的主要工作是调用av_register_all()
注册多种音视频格式的编解码器及各种文件;针对视
频编码方式的单一性,通过 avcodec_find_decoder
(CODEC_ID_H264 )将解码器设置为H.264 模式,并为
解码器和解码过程中需要用到的结构分配内存,最后
打开解码器。
解码视频帧所用的函数是
avcodec_decode_video2(),其返回值表示解码出一幅
图像所消耗的数据帧的字节长度,由此可以判断解码
是否成功,当函数返回值为−1时,表示解码不成功。
解码成功后获得的图像存储在AV Fr am e结构中,而图
像的大小和格式信息则在 pAVCodecCtx结构中。
视频分辨率/格式转换是必不可少的一个步骤,
Android手机只支持 RGB 格式的图像显示,平台传送
过来的帧解码后是 YUV 格式的视频数据,只有转成
RGB 格式后才能在手机上播放;源视频的分辨率为
352 × 288,手机型号种类繁多,分辨率也各不相同,
为适应不同型号的手机,获得更好的视觉效果,也需
要将对视频的分辨率做调整。FFmpeg 中提供了
sws_scale()函数来进行图像缩放和格式转换。转换的
过程中还用到了一个很重要的结构 SwsContext,在转
换前需要在此结构中指明原图像和目标图像的分辨
率大小和视频格式,以及转换过程中采用的算法等信
息。
释放解码器是在解码完成后的必要操作,初始化
解码器时所分配的内存到解码完毕后都要释放掉。不
及时的内存释放会导致程序出现内存泄露而崩溃。
视频解码模块的主要流程可以从图 4中看到。
数据帧通过解码和格式转换后,以RGB 格式存
储在数组中。本软件将 RGB数组转成 Bitmap后采用
SurfaceView 作为绘图容器将图像画在手机屏幕上。
SurfaceView 可以直接从内存或者 DMA等硬件接口取
Figure 4. Flowchart of decoding
图4. 解码流程图
Copyright © 2013 Hanspub 107
基于 Android 手机的实时视频传输和解码
Copyright © 2013 Hanspub
108
Figure 5. Interface of monitoring software
图5. 监控软件界面
得图像数据,具有双缓冲机制,效率高,能够实现良
好的显示效果。
5. 软件运行
本软件在型号为三星GT-N7108 的手机利用 WIFI
无线网络运行并测试。经测试,本软件在视频为 15
帧/s,码率 256 bit/s的条件下能够获得良好的运行结
果,视频流畅播放,有很好的实时性和稳定性,满足
设计的基本需求。视频监控软件的运行效果如图 5。
6. 总结
本系统在当前主流的智能手机操作系统——
Android平台上移植了 FFmpeg 解码库,开发出一个视
频监控应用,实现了视频数据接收,视频解码显示以
及云台控制等功能。本文详细分析了软件架构设计,
主要论述了视频数据接收和视频解码模块的设计和
实现。在数据处理过程中,不同性能的手机解码能力
存在差距,本文采用丢帧机制解决了由手机处理能力
弱导致待解码视频帧占满缓存区的问题,提高了软件
的适用性,实时性和稳定性。最后,本文探讨了 H.264
视频解码器的实现。软件实现了友好的操作界面,具
有良好的稳定性和实时性,满足了当前市场的需求,
具有较大的市场潜力。
参考文献 (References)
[1] 李昂, 宋海声, 苏小芸. 基于 Android 的视频监控系统设计
与实现[J]. 电子技术应用, 2012, 38(7): 138-143.
[2] 宋强, 齐贵宝, 宋占伟. 基于Android 系统的 H.264视频监控
设计[J]. 吉林大学学报, 2012, 30(3): 272-278.
[3] 赵飞, 叶震. UDP协议与 TCP 协议的对比分析与可靠性改进[J].
计算机技术与发展, 2006, 16(9): 219-221.
[4] 张雷. 基于 Android 的物联网音视频通信系统关键技术研究[D].
南京邮电大学硕士论文, 2012.
[5] 苏雅, 仰燕兰, 吴晓佳, 叶桦. 基于 Android 系统的手机定位
软件的设计与开发[J]. 计算机科学与应用, 2013, 3: 17-22.
[6] 摆云. UDP协议与 TCP 协议的对比分析与可靠性改进[J]. 计
算机技术与发展, 2006, 16(9): 219-221.
[7] 杨钊. 基于Android 的视频采集系统的设计与实现[F]. 西安
电子科技大学硕士论文, 2012.

版权所有:汉斯出版社 (Hans Publishers) Copyright © 2012 Hans Publishers Inc. All rights reserved.