• Android的MediaRecorder架构介绍


    本帖最后由 guannameduo 于 2009-7-11 18:07 编辑

    第一部分 MediaRecorder概述
    Android的MediaRecorder包含了Audio和video的记录功能,在Android的界面上,Music和Video两个应用程序都是调用MediaRecorder实现的。
    MediaRecorder在底层是基于OpenCore(PacketVideo)的库实现的,为了构建一个MediaRecorder程序,上层还包含了进程间通讯等内容,这种进程间通讯的基础是Android基本库中的Binder机制。
    以开源的Android为例MediaRecorder的代码主要在以下的目录中:
    JAVA程序的路径:
    packages/apps/Camera/src/com/android/camera/VideoCamera.java

    JAVA Framework的路径:
    frameworks/base/media/java/android/media/MediaRecorder.java

    JAVA本地调用部分(JNI):
    frameworks/base/media/jni/android_media_MediaRecorder.cpp
    这部分内容编译成为目标是libmedia_jni.so

    主要的头文件在以下的目录中:
    frameworks/base/include/media/

    多媒体底层库在以下的目录中:
    frameworks/base/media/libmedia/ 
    这部分的内容被编译成库libmedia.so

    多媒体服务部分:
    frameworks/base/media/libmediaplayerservice/
    MediaRecorder和MeidaPlayer使用相同的服务。


    基于OpenCore部分 
    external/opencore/android/author
    这部分内容被编译成库libopencoreauthor.so


    第二部分 MediaRecorder的接口与架构
    MediaRecorder的各个可以用下图的表示:
    1.jpg 



    MediaRecorder部分的头文件在frameworks/base/include/media/目录中,这个目录是和libmedia.so库源文件的目录frameworks/base/media/libmedia/相对应的。主要的头文件有以下几个:
    ■mediarecorder.h :mediarecorder的上层接口
    ■IMediaRecorder.h:MediaRecorder的服务部分实现接口
    ■PVMediaRecorder.h :MediaRecorder的下层接口,由OpenCore实现
    在这些头文件MediaRecorder.h提供了对上层的接口,而其他的几个头文件都是提供一些接口类(即包含了纯虚函数的类),这些接口类必须被实现类继承才能够使用。
    整个MediaRecorder库和调用的关系如下图所示




    2.jpg 
    整个MediaRecorder在运行的时候,可以大致上分成Client和Server两个部分,它们分别在两个进程中运行,它们之间使用Binder机制实现IPC通讯。
    注意MediaRecorder中不需要使用callback,这点和MediaPlayer的架构有一定的区别,因此并不需要一个MediaRecorderClient的类。
    MediaRecorder C语言上层的接口在mediarecorder.h 中,定义一个MediaRecorder类:
    • class MediaRecorder
    • {
    • public:
    • MediaRecorder();
    • ~MediaRecorder();
    • status_tinitCheck();
    • status_tsetCamera(const sp<ICamera>& camera);
    • status_tsetPreviewSurface(const sp<Surface>& surface);
    • status_tsetVideoSource(int vs);
    • status_tsetAudioSource(int as);
    • status_tsetOutputFormat(int of);
    • status_tsetVideoEncoder(int ve);
    • status_tsetAudioEncoder(int ae);
    • status_tsetOutputFile(const char* path);
    • status_tsetVideoSize(int width, int height);
    • status_tsetVideoFrameRate(int frames_per_second);
    • status_tprepare();
    • status_tgetMaxAmplitude(int* max);
    • status_tstart();
    • status_tstop();
    • status_treset();
    • status_tinit();
    • status_tclose();
    • status_trelease();
    • };

    复制代码
    在meidarecorder的上层接口中,基本不涉及数据流的处理,但是需要设置两个重要的部分,一个是输入的设备ICamera,另一个是ICamera的预览(preview)Surface:
    • status_tsetCamera(const sp<ICamera>& camera);
    • status_tsetPreviewSurface(const sp<Surface>& surface);

    复制代码
    这两个类需要通过上层的接口设置,其中设置的Surface在下层的处理中也会被设置到ICamera的接口中,ICamera则作为这种meidarecorder视频输入的设备,在meidarecorder底层的实现中,通过这个Icamera获取视频流。
    prepare(),start(),stop()和reset()等几个函数用于设置控制媒体记录的运行。
    另外的几个接口用于设置音频、视频的输入和格式,输出的格式。



    第三部分 PVAuthor的架构
    PVAuthor是基于OpenCore的AuthorEngine的Android实现, 代码在以下路径中:
    external/opencore/android/author/
    它实现的接口类是PVMediaRecorder.h,这个类基本上是一个封装,它需要处理三个方面的内容:
    音频的输入环节(Audio Input)
    视频的输入(Camera)
    视频的预览(使用ISurface)

    3.jpg 
    其中实现PVMediaRecorder.h的类是PVMediaRecorder.cpp,authordriver.h和authordriver.cpp是具体实现,android_audio_input.*和android_camera_input.*是两个PvmiMIOControl的实现,PvmiMIOControl最终会构建成一个Node.。它们是Active Source类型的Node,因此它们需要实现PvmiMediaTransfer::writeComplete()函数。
    在AndroidCameraInput内部会建立一个Camera(可以不使用从外部得到的方式);AndroidCameraInput::SetPreviewSurface的函数用于得到一个外部的ISurface,这个Surface将被设置到Camera中,作为Camera的预览。
    android_audio_input.*是作为音频输入的实现,它基于Android的Audio系统构建,主要使用media/AudioRecord.h接口。


    第四部分 Android MediaRecorder和Camera的关系
    从功能的角度MediaRecorder一般包含音频,视频记录,视频预览的功能,Camera包含了取景区预览,静态图像捕获的功能。
    在Android中,应用程序自上而下分成JAVA应用,JAVA框架,JNI,C框架,具体实现几个部分。多媒体方面的程序尤其是这样。
    MediaRecorder和Camera在Android中都有自上而下的架构,它们在顶层JAVA应用层,共用一个应用程序Camera(其中的程序也是独立的),在JAVA框架和JNI层是独立的,主要的联系在于Camer的C框架以下的内容被MediaRecorder实现(也就是PVAuthor)所调用,作为MediaRecorder实现的视频输入设备,它的作用是负责传输视频数据和提供显示预览。本身Camera C框架以下的代码基本提供了取景器预览(Preview)、视频数据流获取、静止图像获取三方面的功能,MediaRecorder实现使用其取景器预览和视频数据流获取的功能,而Camera的JNI使用其取景器预览和静止图像获取两方面的功能

  • 相关阅读:
    洛谷mNOIP模拟赛Day2-星空
    洛谷mNOIP模拟赛Day2-将军令
    洛谷mNOIP模拟赛Day2-入阵曲
    洛谷mNOIP模拟赛Day1-斐波那契
    洛谷mNOIP模拟赛Day1-数颜色
    计蒜客NOIP2017提高组模拟赛(五)day1-展览
    HDU1700Points on Cycle(圆心半径)
    HDU1086You can Solve a Geometry Problem too (斜率问题)
    湖南省第十届大学生计算机程序设计竞赛1503: 点到圆弧的距离(atan()函数的应用)
    HDU献给杭电五十周年校庆的礼物 (切蛋糕,线段划分区域)
  • 原文地址:https://www.cnblogs.com/xyzlmn/p/3168213.html
Copyright © 2020-2023  润新知