zoukankan      html  css  js  c++  java
  • Android的MediaRecorder架构介绍

    第一部分 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的各个可以用下图的表示:

    MediaRecorder部分的头文件在frameworks/base/include/media/目录中,这个目录是和libmedia.so库源文件的目录frameworks/base/media/libmedia/相对应的。主要的头文件有以下几个:

    ■mediarecorder.h :mediarecorder的上层接口

    ■IMediaRecorder.h:MediaRecorder的服务部分实现接口

    ■PVMediaRecorder.h :MediaRecorder的下层接口,由OpenCore实现 在这些头文件MediaRecorder.h提供了对上层的接口,而其他的几个头文件都是提供一些接口类(即包含了纯虚函数的类),这些接口类必须被实现类继承才能够使用。

    整个MediaRecorder库和调用的关系如下图所示  

    整个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();
      tatus_tinit();
      status_tclose();
      status_trelease();
    };

    在meidarecorder的上层接口中,基本不涉及数据流的处理,但是需要设置两个重要的部分,一个是输入的设备ICamera,另一个是ICamera的预览(preview)Surface:

    1.status_tsetCamera(const sp<ICamera>& camera);
    2.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)

    其中实现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使用其取景器预览和静止图像获取两方面的功能

  • 相关阅读:
    Eclipse安装Hadoop插件
    (转)Ubuntu14.0.4中hadoop2.4.0伪分布模式配置
    Hadoop--DataNode无法启动
    启动与关闭hadoop
    hadoop中执行命令时发生错误
    strings命令
    Deriving data from ElasticSearch Engine
    elasticsearch data importing
    reading words in your computer and changing to female voice, linux festival text2wave saving wav files
    DDNS client on a Linux machine
  • 原文地址:https://www.cnblogs.com/vus520/p/2561965.html
Copyright © 2011-2022 走看看