摘要:随着Android 平台引爆新的潮流,Android 上的应用也火热起来。为了弥补Android平台本身对多媒体支持的薄弱,本文介绍了将目前成熟的开源多媒体框架ffmpeg 移植到Android 中的技术要点。
### 基于Android平台的ffmpeg的移植和应用
#### 引言
随着Google公司在2007年推出Android这一基于Linux平台的开源手机操作系统以来,Android系统迅速崛起并在短短几年内成为移动互联网领域的主导力量。截至2011年初,Android操作系统已超越塞班系统成为全球最受欢迎的智能手机平台之一。除了智能手机外,Android系统还在平板电脑和智能MP4等领域得到了广泛应用。
然而,Android系统自带的多媒体框架OpenCore仅支持3gp和mp4两种视频格式,这限制了多媒体应用的发展。因此,本文旨在介绍如何将成熟的开源多媒体框架ffmpeg移植到Android平台,以此来扩展Android平台的编解码能力,并利用ffserver作为流媒体服务器,实现摄像头拍摄视频的远程观看功能。本文将重点探讨ffmpeg的移植、JNI调用、ffserver的配置以及ffmpeg与ffserver之间的通信等方面的内容。
#### 项目设计
##### 项目总体结构图
项目的整体架构包括四个主要部分:采集、编码、传输和播放。具体来说,项目涉及以下几个环节:
- **采集**:通过Android摄像头采集原始视频数据。
- **编码**:对采集到的数据进行编码处理。
- **传输**:将编码后的视频流传输至ffserver。
- **播放**:通过ffserver接收并播放视频流。
##### 各部分详细说明
- **采集**:在Android系统中,可以通过Google提供的统一API获取摄像头数据。具体而言,通过摄像头的`Preview`功能并利用回调函数`onPreviewFrame`可以得到原始数据,通常是YUV420SP格式。
- **编码**:在Java层获取的数据需通过JNI(Java Native Interface)传递给C层,再在C层调用ffmpeg进行编码处理。
- **传输**:首先启动ffserver,随后使用ffmpeg将编码后的视频流发送给ffserver。
- **播放**:ffserver接收到视频流后将其存储在`feed1.ffm`文件中,当有播放请求时即可进行播放。
#### ffmpeg的移植
FFmpeg是一款开源的音视频处理工具,支持多种平台,提供了一套完整的音视频录制、转换及流化解决方案。其中包含了一个高性能的编解码库libavcodec,该库包含了多种编解码器,以确保高可移植性和高质量的编解码性能。
##### Android.mk的编写
`Android.mk`文件是NDK编译系统的一部分,用于描述源代码的相关信息。以下是一个简单的`Android.mk`示例,展示了一些基本的语法和变量定义:
```makefile
# 定义当前目录路径
LOCAL_PATH := $(call my-dir)
# 清除预定义的LOCAL_XXX变量
include $(CLEAR_VARS)
# 定义模块名
LOCAL_MODULE := helloworld
# 定义源文件列表
LOCAL_SRC_FILES := hello-world.c
# 指定需要链接的静态库
LOCAL_STATIC_LIBRARIES := ffmpeg-lib
# 构建模块
include $(BUILD_EXECUTABLE)
```
在这个示例中:
- `LOCAL_PATH`定义了当前目录的路径。
- `CLEAR_VARS`宏用于清除预定义的`LOCAL_XXX`变量,为构建当前模块做准备。
- `LOCAL_MODULE`定义了模块的名称。
- `LOCAL_SRC_FILES`列出了模块的源文件列表。
- `LOCAL_STATIC_LIBRARIES`指定了需要链接的静态库。
- `BUILD_EXECUTABLE`用于构建一个可执行模块。
通过这种方式,我们可以有效地将ffmpeg库集成到Android项目中,并实现所需的多媒体功能。
#### 结论
将ffmpeg移植到Android平台上不仅能够扩展Android系统的多媒体处理能力,还能为用户提供更丰富的视频应用体验。通过对ffmpeg的移植和ffserver的配置,可以轻松实现视频采集、编码、传输及播放等功能,这对于开发基于Android平台的流媒体应用具有重要意义。