APP下载

FFmpeg在基于Android的楼宇可视对讲程序中的应用

2017-07-29张阳吴朝霞

电脑知识与技术 2017年12期

张阳 吴朝霞

摘要:该文介绍了在基于Android的楼宇可视对讲应用程序中,保存对讲视频的意义和工作原理。并提出了将FFmpeg解决方案移植到Android系统中来,以完成对视频信息的编码和解码工作。该文主要分析了FFmepg的源代码和特点,讲述了如何将FFmepg中的有用部分移植到Android平台上,并通过JNI技术实tKAndroid应用层的调用,最终完成音视频的编码和解码工作。

关键词:Android;可视对讲;FFmpeg;视频编解码

1概述

在基于Android的楼宇可视对讲应用程序中,出于安保需求,室内机需要将单元门口机访客的视频信息保存并提交到管理中心机。如果保存未进行压缩过的音视频原码,则需要耗费大量的存储空间,也不利于视频文件的网络传输。而Android的类库并没有提供符合我們需求的视频编码功能,所以必须使用第三方解决方案来完成。而FFmpeg由于其高效、可移植,并且是完全免费的音视频流处理方案,成为了本文完成音视频编解码工作的首选。

2FFmpeg简介

FFmpeg是一个开源免费跨平台的视频和音频流方案,属于自由软件,采用LGPL或GPL许可证(依据开发人员选择的组件)。它提供了录制、转换以及流化音视频的完整解决方案。它包含了非常先进的音频/视频编解码库libavcodec。我们使用音视频编码是为了完成视频通话记录的音视频编码以方便保存。由于Android应用开发没有现成的音视频编码工具,我们只能使用cygwin+cdt+ndk的开发环境,编写自己的音视频编码动态链接库,FFmpeg为我们提供了高效的音视频编码方法。

3视频播放与实时编码方案

在室内机和单元门口机建立通信连接后,单元门口机通过其摄像头和麦克风捕获访客的音视频信息,视频信息为连续的jpeg图像,音频信息为PCM音频原码。接收到音视频信息后,室内机一边向用户播放实时视频,一边将其编码为MP4视频文件。音频编码为aac,音频位率:128kb/s。视频编码为mpeg4,视频位率为1200kb/s,视频尺寸为:320*180。通话结束后,室内机将MP4文件上传到管理中心机保存。其中音视频编码功能就是将FFmepg移植到Android平台下来实现的。通过An—droid底层C/C++驱动开发工具,将FFmpeg和自己的C语言代码编译成为后缀名为“.so”的动态链接库文件,添加到Android应用程序项目中,供应用层Java代码调用。实时可视对讲与音视频编码流程如图1所示。

4FFmpeg的JNI驱动开发

本文采用cygwin+CDT+NDK的开发环境进行Android动态链接库开发。NDK提供了一系列的工具,帮助开发者快速开发C(或C++)的动态库,并能自动将so文件和java应用一起打包成apk。要注意的是,因为cygwin是在Windows上模拟Linux的控制台环境,所以对于访问文件的路径是不能带有空格和中文的。所以ndk的解压后存放的路径必须不能包括空格或中文,比如这种“D:\rogram Files\android-ndk-windows”在cygwin是不能识别成功的。FFmpeg源代码可以在其官网上免费下载,本文使用的是ffmpeg-0.8.1,FFmpeg的功能非常强大,几乎所有的音视频主流编解码方式都可以实现,而且代码效率非常的高,并且全部原码由C语言编写,可以非常方便的移植到An-dorid平台下。

此外,编写Android动态链接库需要使用JNI技术。C语言和Java之间有很多差别,比如基本数据类型就有很大差别,Java有类和对象的概念,而C没有。想要Java调用C编写的方法,需要JNI作为桥梁,JNI的主要作用就是规定了如何用Java调用C方法,c访问Java调用者传递的形式参数等等相互操作。根据JNI规定,我们需要自己编写的源文件“avjni.c”,用来向下实现对FFmpeg的调用,向上提供Android应用层调用的接口函数。其中编译脚本Android.mk如下所示: