Android的多媒体(Media Sever Framework )框架OpenCore(PacketVideo)介绍

Android下bluedroid、bluetooth apk介绍 前言本文档主要介绍android平台下bluetooth的应用层软件,先介绍bluetooth应用层的框架,接着分别介绍Bluedroid层软件、Bluetooth应用程序(Bluetooth.apk),Bluetooth framework层,最后完整分析一些蓝牙的操作流程。基于android 5.1的平台,涉及的bluetooth硬件为realtek的蓝牙。文档主要针对蓝牙的初学者,提供基础的学 阅读详情

Android的多媒体框架OpenCore(PacketVideo)介绍

  本文为个人总结,不代表官方观点。

  分为几个阶段:

  1、整个Android的多媒体框架OpenCore

  2、Player和Author的详细介绍

  2、OpenCore和Android其他部分的集成

  第一部分 OpenCore概述:

  OpenCore的另外一个常用的称呼是PacketVideo,它是Android的多媒体核心。事实上,PacketVideo是一家公司的名称,而OpenCore是这套多媒体框架的软件 层的名称。在Android的开发者中间,二者的含义基本相同。对比Android的其它程序库,OpenCore的代码非常庞大,它是一个基于C++的实现,定义了全功能的操作系统 移植层,各种基本的功能均被封装成类的形式,各层次之间的接口多使用继承等方式。

  OpenCore是一个多媒体的框架,从宏观上来看,它主要包含了两大方面的内容:

  PVPlayer:提供媒体播放器的功能,完成各种音频(Audio)、视频 (Video)流的回放(Playback)功能

  PVAuthor:提供媒体流记录的功能,完成各种音频(Audio)、视频(Video)流的以及静态图像捕获功能

  PVPlayer和PVAuthor以SDK的形式提供给开发者,可以在这个SDK之上构建多种应用程序和服务。在移动终端中常常使用的多媒体应用程序,例如媒体播放器、照相机、录像机、录音机等等。

  为了更好的组织整体的架构,OpenCore在软件层次在宏观上分成几个层次:

  

   OSCL:Operating System Compatibility Library (操作系统兼容库),包含了一些操作系统底层的操作,为了更好地在不同操作系统移植。包含了基本数据类型、配置、字符串工具、IO、错误处理、线程等内 容,类似一个基础的C++库。

  PVMF:PacketVideo Multimedia Framework(PV多媒体框架),在框架内实现一个文件解析(parser)和组成(composer)、编解码的NODE,也可以继承其通用的接口,在用户层实现一些NODE。

  PVPlayer Engine:PVPlayer引擎。

  PVAuthor Engine:PVAuthor引擎。

  事实上,OpenCore中包含的内容非常多:从播放的角度,PVPlayer的输入的(Source)是文件或者网络 媒 体流,输出(Sink)是音频视频的输出设备,其基本功能包含了媒体流控制、文件解析、音频视频流的解码(Decode)等方面的内容。除了从文件中播放 媒体文件之外,还包含了与网络相关的RTSP流(Real Time Stream Protocol,实时流协议)。在媒体流记录的方面,PVAuthor的输入的(Source)是照相机、麦克风等设备,输出(Sink)是各种文件, 包含了流的同步、音频视频流的编码(Encode)以及文件的写入等功能。

  在使用OpenCore的SDK的时候,有可能需要在应用程序层实现一个适配器(Adaptor),然后在适配器之上实现具体的功能,对于PVMF的NODE也可以基于通用的接口,在上层实现,以插件的形式使用。

 

 第二部分 OpenCore的代码结构2.1 代码结构

  以开源Android的代码为例,OpenCore的代码在以下目录中:external/opencore/。这个目录是OpenCore的根目录,其中包含的子目录如下所示:

  android:这里面是一个上层的库,它基于PVPlayer和PVAuthor的SDK实现了一个为Android使用的Player和Author。

  baselibs:包含数据结构和线程安全 等内容的底层库

  codecs_v2:这是一个内容较多的库,主要包含编解码的实现,以及一个OpenMAX的实现

  engines:包含PVPlayer和PVAuthor引擎的实现

  extern_libs_v2:包含了khronos的OpenMAX的头文件

  fileformats:文件格式的解析(parser)工具

  nodes:提供一些PVMF的NODE,主要是编解码和文件解析方面的。

  oscl:操作系统 兼容库

  pvmi: 输入输出控制的抽象接口

  protocols:主要是与网络 相关的RTSP、RTP、HTTP等协议的相关内容

  pvcommon:pvcommon库文件的Android.mk文件,没有源文件。

  pvplayer:pvplayer库文件的Android.mk文件,没有源文件。

  pvauthor:pvauthor库文件的Android.mk文件,没有源文件。

  tools_v2:编译工具以及一些可注册的模块。

  在external/opencore/目录中还有2个文件,如下所示:

  Android.mk:全局的编译文件

  pvplayer.conf:配置文件

  在external/opencore/的各个子文件夹中包含了众多的Android.mk文件,它们之间还存在着“递归”的关系。例如根目录下的Android.mk,就包含了如下的内容片断:

  include $(PV_TOP)/pvcommon/Android.mk

  include $(PV_TOP)/pvplayer/Android.mk

  include $(PV_TOP)/pvauthor/Android.mk

  这表示了要引用pvcommon,pvplayer和pvauthor等文件夹下面的Android.mk文件。

  external/opencore/的各个Android.mk文件可以按照排列组合进行使用,将几个Android.mk内容合并在一个库当中。

  2.2 编译结构

  1.库的层次关系:在Android的开源版本中编译出来的内容,OpenCore编译出来的各个库如下所示:

  libopencoreauthor.so:OpenCore的Author库

  libopencorecommon.so:OpenCore底层的公共库

  libopencoredownloadreg.so :下载注册库

  libopencoredownload.so:下载功能实现库

  libopencoremp4reg.so:MP4注册库

  libopencoremp4.so:MP4功能实现库

  libopencorenet_support.so:网络支持库

  libopencoreplayer.so:OpenCore的Player库

  libopencorertspreg.so:RTSP注册库

  libopencorertsp.so:RTSP功能实现库

  这些库的层次关系如下图所示:

  

  OpenCore的各个库之间具有如下的关系:

  libopencorecommon.so是所有的库的依赖库,提供了公共的功能;

  libopencoreplayer.so和libopencoreauthor.so是两个并立的库,分别用于回放和记录,而且这两个库是OpenCore对外的接口库;

  libopencorenet_support.so提供网络支持的功能;

  一些功能以插件(Plug-In)的方式放入Player中使用,每个功能使用两个库,一个实现具体功能,一个用于注册。

  2.libopencorecommon.so库的结构

  libopencorecommon.so是整个OpenCore的核心库,它的编译控制的文件的路径为pvcommon/Android.mk,这个文件使用递归的方式寻找子文件:include $(BUILD_SHARED_LIBRARY)
include $(PV_TOP)//oscl/oscl/osclbase/Android.mk

include $(PV_TOP)//oscl/oscl/osclerror/Android.mk
include $(PV_TOP)//oscl/oscl/osclmemory/Android.mk
include $(PV_TOP)//oscl/oscl/osclutil/Android.mk
include $(PV_TOP)//oscl/pvlogger/Android.mk
include $(PV_TOP)//oscl/oscl/osclproc/Android.mk
include $(PV_TOP)//oscl/oscl/osclio/Android.mk
include $(PV_TOP)//oscl/oscl/osclregcli/Android.mk
include $(PV_TOP)//oscl/oscl/osclregserv/Android.mk
include $(PV_TOP)//oscl/unit_test/Android.mk
include $(PV_TOP)//oscl/oscl/oscllib/Android.mk
include $(PV_TOP)//pvmi/pvmf/Android.mk
include $(PV_TOP)//baselibs/pv_mime_utils/Android.mk
include $(PV_TOP)//nodes/pvfileoutputnode/Android.mk
include $(PV_TOP)//baselibs/media_data_structures/Android.mk
include $(PV_TOP)//baselibs/threadsafe_callback_ao/Android.mk
include $(PV_TOP)//codecs_v2/utilities/colorconvert/Android.mk
include $(PV_TOP)//codecs_v2/audio/gsm_amr/amr_nb/common/Android.mk
include $(PV_TOP)//codecs_v2/video/avc_h264/common/Android.mk
       这些被包含的 Android.mk 文件真正指定需要编译的文件,这些文件在 Android.mk 的目录及其子目录中。事实上,在 libopencorecommon.so库中包含了以下内容:

OSCL的所有内容

Pvmf 框架部分的内容( pvmi/pvmf/Android.mk )

基础库中的一些内容( baselibs )

编解码的一些内容

文件输出的 node ( nodes/pvfileoutputnode/Android.mk )

    从库的结构中可以看出,最终生成库的结构与OpenCore的层次关系并非完全重合。libopencorecommon.so库中就包含了底层的OSCL的内容、PVMF的框架以及Node和编解码的工具。

3.libopencoreplayer.so库的结构

      libopencoreplayer.so是用于播放的功能库,它的编译控制的文件的路径为pvplayer/Android.mk,它包含了以下的内容:

include $(BUILD_SHARED_LIBRARY)
include $(PV_TOP)//engines/player/Android.mk
include $(PV_TOP)//codecs_v2/audio/aac/dec/util/getactualaacconfig/Android.mk
include $(PV_TOP)//codecs_v2/video/avc_h264/dec/Android.mk
include $(PV_TOP)//codecs_v2/audio/aac/dec/Android.mk
include $(PV_TOP)//codecs_v2/audio/gsm_amr/amr_nb/dec/Android.mk
include $(PV_TOP)//codecs_v2/audio/gsm_amr/amr_wb/dec/Android.mk
include $(PV_TOP)//codecs_v2/audio/gsm_amr/common/dec/Android.mk
include $(PV_TOP)//codecs_v2/audio/mp3/dec/Android.mk
include $(PV_TOP)//codecs_v2/utilities/m4v_config_parser/Android.mk
include $(PV_TOP)//codecs_v2/utilities/pv_video_config_parser/Android.mk
include $(PV_TOP)//codecs_v2/omx/omx_common/Android.mk
include $(PV_TOP)//codecs_v2/omx/omx_queue/Android.mk
include $(PV_TOP)//codecs_v2/omx/omx_h264/Android.mk
include $(PV_TOP)//codecs_v2/omx/omx_aac/Android.mk
include $(PV_TOP)//codecs_v2/omx/omx_amr/Android.mk
include $(PV_TOP)//codecs_v2/omx/omx_mp3/Android.mk
include $(PV_TOP)//codecs_v2/omx/factories/omx_m4v_factory/Android.mk
include $(PV_TOP)//codecs_v2/omx/omx_proxy/Android.mk
include $(PV_TOP)//nodes/common/Android.mk
include $(PV_TOP)//pvmi/content_policy_manager/Android.mk
include $(PV_TOP)//pvmi/content_policy_manager/plugins/oma1/passthru/Android.mk
include $(PV_TOP)//pvmi/content_policy_manager/plugins/common/Android.mk
include $(PV_TOP)//pvmi/media_io/pvmiofileoutput/Android.mk
include $(PV_TOP)//fileformats/common/parser/Android.mk
include $(PV_TOP)//fileformats/id3parcom/Android.mk
include $(PV_TOP)//fileformats/rawgsmamr/parser/Android.mk
include $(PV_TOP)//fileformats/mp3/parser/Android.mk
include $(PV_TOP)//fileformats/mp4/parser/Android.mk
include $(PV_TOP)//fileformats/rawaac/parser/Android.mk
include $(PV_TOP)//fileformats/wav/parser/Android.mk
include $(PV_TOP)//nodes/pvaacffparsernode/Android.mk
include $(PV_TOP)//nodes/pvmp3ffparsernode/Android.mk
include $(PV_TOP)//nodes/pvamrffparsernode/Android.mk
include $(PV_TOP)//nodes/pvmediaoutputnode/Android.mk
include $(PV_TOP)//nodes/pvomxvideodecnode/Android.mk
include $(PV_TOP)//nodes/pvomxaudiodecnode/Android.mk
include $(PV_TOP)//nodes/pvwavffparsernode/Android.mk
include $(PV_TOP)//pvmi/recognizer/Android.mk
include $(PV_TOP)//pvmi/recognizer/plugins/pvamrffrecognizer/Android.mk
include $(PV_TOP)//pvmi/recognizer/plugins/pvmp3ffrecognizer/Android.mk
include $(PV_TOP)//pvmi/recognizer/plugins/pvwavffrecognizer/Android.mk
include $(PV_TOP)//engines/common/Android.mk
include $(PV_TOP)//engines/adapters/player/framemetadatautility/Android.mk
include $(PV_TOP)//protocols/rtp_payload_parser/util/Android.mk
include $(PV_TOP)//android/Android.mk
include $(PV_TOP)//android/drm/oma1/Android.mk
include $(PV_TOP)//tools_v2/build/modules/linux_rtsp/core/Android.mk
include $(PV_TOP)//tools_v2/build/modules/linux_rtsp/node_registry/Android.mk
include $(PV_TOP)//tools_v2/build/modules/linux_net_support/core/Android.mk
include $(PV_TOP)//tools_v2/build/modules/linux_download/core/Android.mk
include $(PV_TOP)//tools_v2/build/modules/linux_download/node_registry/Android.mk
include $(PV_TOP)//tools_v2/build/modules/linux_mp4/core/Android.mk
include $(PV_TOP)//tools_v2/build/modules/linux_mp4/node_registry/Android.mk
libopencoreplayer.so中包含了以下内容:

一些解码工具

文件的解析器( mp4)

解码工具对应的Node

player 的引擎部分(engines/ player /Android.mk )

为Android的player 适配器(android/Android.mk)

识别工具(pvmi/recognizer)

编解码工具中的OpenMax部分(codecs_v2/omx)

对应几个插件Node的注册

    libopencoreplayer.so中的内容较多,其中主要为各个文件解析器和解码器, PVPlayer的核心功能在engines/player/Android.mk当中, 而 android/Android.mk的内容比较特殊,它是在PVPlayer之上构建的一个为Android使用的播放器。


4.libopencoreauthor.so库的结构
      libopencoreauthor.so是用于媒体流记录的功能库,它的编译控制的文件的路径为pvauthor/Android.mk,它包含了以下的内容:
include $(BUILD_SHARED_LIBRARY)
include $(PV_TOP)//engines/author/Android.mk
include $(PV_TOP)//codecs_v2/video/m4v_h263/enc/Android.mk
include $(PV_TOP)//codecs_v2/audio/gsm_amr/amr_nb/enc/Android.mk
include $(PV_TOP)//codecs_v2/video/avc_h264/enc/Android.mk
include $(PV_TOP)//fileformats/mp4/composer/Android.mk
include $(PV_TOP)//nodes/pvamrencnode/Android.mk
include $(PV_TOP)//nodes/pvmp4ffcomposernode/Android.mk
include $(PV_TOP)//nodes/pvvideoencnode/Android.mk
include $(PV_TOP)//nodes/pvavcencnode/Android.mk
include $(PV_TOP)//nodes/pvmediainputnode/Android.mk
include $(PV_TOP)//android/author/Android.mk

libopencoreauthor.so中包含了以下内容:

一些编码工具(视频 流H263、H264,音频流Amr)

文件的组成器( mp4 )

编码工具对应的Node

表示媒体输入的Node( nodes/pvmediainputnode/Android.m )

author的引擎部分( engines/author/Android.mk )

为Android的 author适配器(android/author/Android.mk)

    libopencoreauthor.so中主要为各个文件编码器和文件组成器, PVAuthor的核心功能在engines/ author /Android.mk当中, 而 android/ author /Android.mk是在PVAuthor之上构建的一个为Android使用的媒体记录器。

5.其他库
       另外的几个库的 Android.mk 文件的路径如下所示:
网络支持库 libopencorenet_support.so :
tools_v2/build/modules/linux_net_support/core/Android.mk

MP4 功能实现库 libopencoremp4.so 和注册库 libopencoremp4reg.so :
tools_v2/build/modules/linux_mp4/core/Android.mk
tools_v2/build/modules/linux_mp4/node_registry/Android.mk

RTSP 功能实现库 libopencorertsp.so 和注册库 libopencorertspreg.so :
tools_v2/build/modules/linux_rtsp/core/Android.mk
tools_v2/build/modules/linux_rtsp/node_registry/Android.mk

下载功能实现库 libopencoredownload.so 和注册库 libopencoredownloadreg.so :
tools_v2/build/modules/linux_download/core/Android.mk
tools_v2/build/modules/linux_download/node_registry/Android.mk

 

 第三部分 OpenCore OSCL简介 

    OSCL,全称为Operating System Compatibility Library (操作系统 兼容库),它包含了一些在不同操作系统中移植层的功能,其代码结构如下所示:
oscl/oscl
|-- config              :配置的宏
|-- makefile
|-- makefile.pv
|-- osclbase          :包含基本类型、宏以及一些 STL 容器类似的功能
|-- osclerror         :错误处理的功能
|-- osclio              :文件 IO 和 Socket 等功能
|-- oscllib             :动态库接口等功能
|-- osclmemory :内存 管理、自动指针等功能
|-- osclproc          :线程、多任务通讯等功能
|-- osclregcli         :注册客户端的功能
|-- osclregserv      :注册服务器 的功能
`-- osclutil            :字符串等基本功能
          在 oscl 的目录中,一般每一个目录表示一个模块。 OSCL 对应的功能是非常细致的,几乎对 C 语言中每一个细节的功能都进行封装,并使用了 C++ 的接口提供给上层使用。事实上, OperCore 中的 PVMF、Engine部分都在使用 OSCL ,而整个 OperCore 的调用者也需要使用 OSCL 。
在 OSCL 的实现中,很多典型的 C 语言函数被进行了简单的封装,例如: osclutil 中与数学相关的功能在 oscl_math.inl 中被定义成为了内嵌( inline )的函数:
OSCL_COND_EXPORT_REF OSCL_INLINE double oscl_log(double value)
{
          return (double) log(value);
}
OSCL_COND_EXPORT_REF OSCL_INLINE double oscl_log10(double value)
{
          return (double) log10(value);
}
OSCL_COND_EXPORT_REF OSCL_INLINE double oscl_sqrt(double value)
{
          return (double) sqrt(value);
}
          oscl_math.inl 文件又被 oscl_math.h 所包含,因此其结果是 oscl_log() 等功能的使用等价于原始的 log() 等函数。

      很多 C 语言标准库的句柄都被定义成为了 C++ 类的形式,实现由一些繁琐,但是复杂性都不是很高。以 oscllib 为例,其代码结构如下所示:
oscl/oscl/oscllib/
|-- Android.mk
|-- build
|   `-- make
|       `-- makefile
`-- src
    |-- oscl_library_common.h
    |-- oscl_library_list.cpp
    |-- oscl_library_list.h
    |-- oscl_shared_lib_interface.h
    |-- oscl_shared_library.cpp
    `-- oscl_shared_library.h
        oscl_shared_library.h 是提供给上层使用的动态库的接口功能,它定义的接口如下所示:
class OsclSharedLibrary
{
public:
         OSCL_IMPORT_REF OsclSharedLibrary();
         OSCL_IMPORT_REF OsclSharedLibrary(const OSCL_String& aPath);
         OSCL_IMPORT_REF ~OsclSharedLibrary();
         OSCL_IMPORT_REF OsclLibStatus LoadLib(const OSCL_String& aPath);
         OSCL_IMPORT_REF OsclLibStatus LoadLib();
         OSCL_IMPORT_REF void SetLibPath(const OSCL_String& aPath);
         OSCL_IMPORT_REF OsclLibStatus QueryInterface(const OsclUuid& aInterfaceId, OsclAny*& aInterfacePtr);
         OSCL_IMPORT_REF OsclLibStatus Close();
         OSCL_IMPORT_REF void AddRef();
         OSCL_IMPORT_REF void RemoveRef();
}
         这些接口显然都是与库的加载有关系的,而在 oscl_shared_library.cpp 中其具体的功能是使用 dlopen() 等函数来实现的。

 

 第四部分 文件格式处理和编解码部分简介

  在多媒体方面,文件格式的处理和编解码(Codec)是很基础的两个方面的内容。多媒体应用的两个方面是媒体的播放(PlayBack)和媒体的记录(Recording)。

  在媒体的播放过程中,通常情况是从对媒体文件的播放,必要的两个步骤为文件的解析和媒体流的解码。例如对于一个mp4的文件,其中可能包括AMR和AAC的音频流,H263、MPEG4以及AVC(H264)的视频 流,这些流被封装在3GP的包当中,媒体播放器要做的就是从文件中将这些流解析出来,然后对媒体流进行解码,解码后的数据才可以播放。

  在媒体的记录过程中,通过涉及到视频、音频、图像的捕获功能。对于将视频加音频录制成文件功能,其过程与播放刚好相反,首先从硬件设备得到视频和音频的媒体流,然后对其进行编码,编码号的流还需要被分层次写入到文件之中,最终得到组成好的文件。

  OpenCore有关文件格式处理和编解码部分两部分的内容,分别在目录fileformats和codecs_v2当中。这两部分都属于基础性的功能,不涉及具体的逻辑,因此它们被别的模块调用来使用,例如:构建各种Node。

  4.1 文件格式的处理

  由于同时涉及播放文件和记录文件两种功能,因此OpenCore中的文件格式处理有两种类型,一种是parser(解析器),另一种是composer(组成器)。

  fileformats的目录结构如下所示:fileformats
|-- avi

|   `-- parser
|-- common
|   `-- parser
|-- id3parcom
|   |-- Android.mk
|   |-- build
|   |-- include
|   `-- src
|-- mp3
|   `-- parser
|-- mp4
|   |-- composer
|   `-- parser
|-- rawaac
|   `-- parser
|-- rawgsmamr
|   `-- parser
`-- wav
    `-- parser

        
目录包含各个子目录中,它们对应的是不同的文件格式,例如 mp3 、 mp4 和 wav 等。

   4.2 编解码

         编解码部分主要针对 Audio 和 Video , codecs_v2 的目录结构如下所示:
codecs_v2
|-- audio
|   |-- aac
|   |-- gsm_amr
|   |-- mp3
|   `-- sbc
|-- omx
|   |-- factories
|   |-- omx_aac
|   |-- omx_amr
|   |-- omx_common
|   |-- omx_h264
|   |-- omx_m4v
|   |-- omx_mp3
|   |-- omx_proxy
|   `-- omx_queue
|-- utilities
|   |-- colorconvert
|   |-- m4v_config_parser
|   `-- pv_video_config_parser
`-- video
    |-- avc_h264
    `-- m4v_h263
         在 audio 和 video 目录中,对应了针对各种流的子目录,其中可能包含 dec 和 enc 两个目录,分别对应解码和编码。 video 目录展开后的内容如下所示:
`-- video
    |-- avc_h264
    |   |-- common
    |   |-- dec
    |   |-- enc
    |   `-- patent_disclaimer.txt
    `-- m4v_h263
        |-- dec
        |-- enc
        `-- patent_disclaimer.txt
         codecs_v2目录的子目录omx实现了一个khronos 
         OpenMAX 的功能。 OpenMAX是一个多媒体应用程序的框架标准,由NVIDIA公司和Khronos在2006年推出。OpenMAX IL 1.0(集成层)技术规格定义了媒体组件接口,以便在嵌入式器件的流媒体框架中快速集成加速式编解码器。
         OpenMAX的设计实现可以让具有硬件编辑码功能的平台提供统一的接口和框架,在OpenMAX中可以直接使用硬件加速的进行编解码乃至输出的功能,对外保持统一的接口。但是在此处的OpenMAX则是一个纯软件 的实现。

opencore-amr-android, android中的opencore amr编解码器.zip opencore-amr-android, android中的opencore amr编解码器 opencore-amr-android一种带有解释功能的opencore amr编解码器及其封装amr音频文件的。中文文档请移步 README_CN QQ部落帮助: 453503476背景opencore 是android的 立即下载

相关推荐

com.tencent.qb.plugin.embedded.widget.thumbplayer26.zip

com.tencent.qb.plugin.embedded.widget.thumbplayer26.zip

Android的多媒体框架OpenCore介绍

Android的多媒体框架OpenCore(PacketVideo)介绍  本文为个人总结,不代表官方观点。  分为几个阶段:  1、整个Android的多媒体框架OpenCore  2、Player和Author的详细介绍  2、OpenCore和Android其他部分的集成  第一部分 OpenCore概述:  OpenCore的另外一个常用的称呼是Packet

linux嵌入式驱动软件开发 2941

opencore框架实现wav和amr的转换

opencore框架实现wav和amr的转换 AmrInputStream AmrInputStream AmrInputStream

opencore amr android,苹果手机amr文件用什么打开,opencore框架进行语音

opencore框架可用于语音编码与解码,实现Android和ios语音互通,能实现类似微信语音对讲功能。andoird端可录音Amr格式文件,Amr格式语音文件的优势是文件大小比wav等其他音频格式文件小很多方便网络传输与存储,语音清晰度对于对讲来说也能接受。实现思路手机端录音->上传音频文件到服务器端->手机端下载音频文件播放;具体实现代码不在此处讨论仅说明思路。iPhone端iP...

weixin_34445112的博客 975

opencore-amr编译库支持64位,支持真机和模拟器

编译自opencore-amr-0.1.3,编译环境XCode6.1.1下iOS8 SDK。支持arm64 armv7s x86_64 i386 armv7。

Android的多媒体框架OpenCore(PacketVideo)介绍

Android的多媒体框架OpenCore(PacketVideo)介绍

音视频框架Opencore(PacketVideo) /Stagefright-【OpenMAX】;DRM,TinyAlsa

  音视频编码/解码过程及API. > 开源音频库OpenCore和Stagefright android媒体开发,OpenCore和Stagefright(一)- https://blog.youkuaiyun.com/xmc281141947/article/details/60766737 Android Multimedia框架总结(九)Stagefright- https://www.jian...

ShareUs的专栏 1528

宝塔部署若依前端出现502解决方法

若依系统是一个基于Java语言的开源项目,旨在帮助开发者减少开发时间,特别适用于需要快速开发出一套具有用户管理、菜单管理、权限管理、定时任务、日志管理等功能的简单系统。系统分为前后端分离、分布式等架构前后端分离部署教程然而通过宝塔来部署若依系统会遇见一些问题,特此在这里记录一下。

m0_74823683的博客 776

实现base64格式的amr音频文件在IOS、android微信内置浏览器的播放

实现base64格式的amr音频文件在IOS、android微信内置浏览器的播放

u010947098的专栏 8779

麒麟V10 x86_64系统下Qt 5.12.7安装全攻略(附常见报错解决方案)

本文详细介绍了在麒麟V10 x86_64系统上安装Qt 5.12.7的完整流程,包括在线和离线两种安装方案,并提供了常见报错的解决方案。从环境准备到项目配置优化,再到高级调试技巧,全面覆盖Qt开发在国产操作系统上的实践要点,帮助开发者高效搭建开发环境。

weixin_29294395的博客 508

如何使用ArcGIS自动矢量化建筑

在显示的重分类对话框内,输入栅格选择提取单波段后的栅格,重分类分为三个层级,旧值分别为100-249、250-251和252-255,对应新值为1、2和3,旧值的最小和最大值不用修改,保持和原有的一致。同样在ArcToolbox内点击Spatial Analyst工具点击“重分类\重分类”,在重分类对话框内输入栅格选择之前重分类过后的图片,将旧值3的新值设置为1,这样分类后就只有两类。在显示的新建Shapefile对话框内,名称命名为折线,要素类型选择折线,点击编辑,设置坐标系为WGS 1984。

2163

OpenCORE-AMR for Android 开源项目使用手册

OpenCORE-AMR for Android 开源项目使用手册 1. 项目目录结构及介绍 该项目是专门为了在Android平台上便于使用OpenCORE-AMR编解码库而设计的。下面是对主要目录和文件的简述: src: 包含核心源代码,其中可能分为多个子包,如main.java.io.kvh.amr,存放编解码的Java接口和底层JNI桥接代码。 jni: 这个目录存放C/C++源代...

gitblog_00947的博客 516

微腔光频梳仿真入门:MATLAB求解LLE方程全流程解析

光学频率梳在精密测量、光通信和微波光子学中有着广阔应用,而微环谐振腔中的Kerr非线性与四波混频效应能够紧凑地产生宽带梳齿。仿真这类系统的核心是求解Lugiato-Lefever方程(LLE),但直接从物理参数到数值代码往往让初学者无从下手。本文从微腔光频梳的物理图像出发,介绍LLE方程的推导与归一化方法,并重点讲解MATLAB数值实现的两种思路:基于ode45的频域耦合方程组求解与分裂步长RK4IP方法。同时讨论失谐扫描、孤子态识别、参数稳定性边界,以及如何将真实器件参数换算为无量纲仿真参数。无论你是刚接

weixin_32325225的博客 293

opencore amr android,opencore-amr-0.1

opencore-amr/opencore-amr/amrnb/opencore-amr/amrnb/interf_enc.hopencore-amr/amrnb/Makefileopencore-amr/amrnb/interf_dec.hopencore-amr/amrnb/wrapper.cppopencore-amr/build_osx.shopencore-amr/debian/open...

weixin_39629467的博客 426

Ubuntu Server 22.04.5系统安装教程

该教程主要是演示在服务器上安装Ubuntu server 22.04系统的详细步骤,主要包含,安装系统前的准备(镜像的下载,启动盘的制作),安装系统时的语言选择,网络设置,切换镜像源(可根据实际需求来配置,本文使用清华镜像源),手动分区,用户设置,ssh服务安装等。以上就是关于Ubuntu Server 22.04系统安装的详细过程。

逆水行舟,不进则退。 7761

Docker 安装 CentOS7

本文主要介绍了docker 下安装centos7。访问 CentOS 镜像库地址:https://hub.docker.com/_/centos?tab=tags&page=1。可以通过 Sort by 查看其他版本的 CentOS 。默认是最新版本 centos:latest 。 使用以下命令来查看是否已安装了 centos7: 启动centos容器,并把docker上centos的22端口映射到本机60001端口(端口号可以自己指定) 3、进入到Centos容器 4.安装ssh服务和网络必须软件

折腾java的博客 1万+

关于Android中将PCM转AMR的问题探讨

因为项目中用到了阿里的语音识别技术,但是返回的是PCM原始数据,这里就需要将PCM转为AMR的音频格式,这里将其中遇到的问题记录下来,有需要的小伙伴们可以参考一下。 这里的实现思路先大致说一下,将PCM先转为WAV,然后再由WAV转为AMR。 话不多说,直接上代码。 我们先PCM转为WAV,要注意的是16k的PCM一定要对采样率进行向下采样成8kPCM之后,再将PCM进行转换成WAV,否则后面转出来的8k的AMR就一塌糊涂了!!!重新采样用的是三方库JSSRC,我这里是对JSSRCResampler进

liwang_android的专栏 1025

伺服驱动器485通信

485通信使用方法,485通信在上位机和伺服驱动器之间的应用,根据需要驱动电机旋转。

haipi511715316的博客 1万+

opencore-amr-android: Android平台上的OPENCORE AMR编解码库使用教程

opencore-amr-android: Android平台上的OPENCORE AMR编解码库使用教程 1. 项目介绍 opencore-amr-android 是一个专为Android系统设计的OpenCORE AMR编解码库。此项目基于OpenCORE AMR开源库,它提供了对 Adaptive Multi-Rate (AMR) 音频格式的支持,包括AMR-Narrowband (NB) ...

gitblog_00154的博客 672

MATLAB 基于深度学习的步态识别算法仿真

步态识别是一种通过分析人体行走方式来识别身份的技术。基于深度学习的步态识别算法利用卷积神经网络 (CNN) 提取步态特征,并通过分类器进行身份识别。基于深度学习的步态识别算法是实现身份识别的重要手段,具有广泛的应用前景。MATLAB 提供了丰富的工具和函数,可以方便地进行算法仿真和性能评估。

走向CTO的路上... 518

文档:亲测可用解决vnc灰屏,黑屏,鼠标大黑叉情况

主要解决vnc-viewer灰屏,黑屏,鼠标大黑叉等现象,详细见文档。

linux多媒体框架,Android的多媒体框架OpenCore(PacketVideo)介绍

include $(BUILD_SHARED_LIBRARY)include $(PV_TOP)//engines/player/Android.mkinclude $(PV_TOP)//codecs_v2/audio/aac/dec/util/getactualaacconfig/Android.mkinclude $(PV_TOP)//codecs_v2/video/avc_h264/dec/...

weixin_36114355的博客 247

深度学习工具包 DeepLearningToolbox

深度学习工具包Deprecation notice.-----This toolbox is outdated and no longer maintained.There are much better tools available for deep learning than this toolbox, e.g. [Theano](http://deeplearning.net/software/theano/), [torch](http://torch.ch/) or [tensorflow](http://www.tensorflow.org/)I would suggest you use one of the tools mentioned above rather than use this toolbox.Best, Rasmus.DeepLearnToolbox================A Matlab toolbox for Deep Learning.Deep Learning is a new subfield of machine learning that focuses on learning deep hierarchical models of data.It is inspired by the human brain's apparent deep (layered, hierarchical) architecture.A good overview of the theory of Deep Learning theory is[Learning Deep Architectures for AI](http://www.iro.umontreal.ca/~bengioy/papers/ftml_book.pdf)For a more informal introduction, see the following videos by Geoffrey Hinton and Andrew Ng.* [The Next Generation of Neural Networks](http://www.youtube.com/watch?v=AyzOUbkUf3M) (Hinton, 2007)* [Recent Developments in Deep Learning](http://www.youtube.com/watch?v=VdIURAu1-aU) (Hinton, 2010)* [Unsupervised Feature Learning and Deep Learning](http://www.youtube.com/watch?v=ZmNOAtZIgIk) (Ng, 2011)If you use this toolbox in your research please cite [Prediction as a candidate for learning deep hierarchical models of data](http://www2.imm.dtu.dk/pubdb/views/publication_details.php?id=6284)```@MASTERSTHESIS\{IMM2012-06284, author = "R. B. Palm", title = "Prediction as a candidate for learning deep hierarchical models of data", year = "2012",}```Contact: rasmusbergpalm at gmail dot comDirectories included in the toolbox-----------------------------------`NN/` - A library for Feedforward Backpropagation Neural Networks`CNN/` - A library for Convolutional Neural Networks`DBN/` - A library for Deep Belief Networks`SAE/` - A library for Stacked Auto-Encoders`CAE/` - A library for Convolutional Auto-Encoders`util/` - Utility functions used by the libraries`data/` - Data used by the examples`tests/` - unit tests to verify toolbox is workingFor references on each library check REFS.mdSetup-----1. Download.2. addpath(genpath('DeepLearnToolbox'));Example: Deep Belief Network---------------------```matlabfunction test_example_DBNload mnist_uint8;train_x = double(train_x) / 255;test_x = double(test_x) / 255;train_y = double(train_y);test_y = double(test_y);%% ex1 train a 100 hidden unit RBM and visualize its weightsrand('state',0)dbn.sizes = [100];opts.numepochs = 1;opts.batchsize = 100;opts.momentum = 0;opts.alpha = 1;dbn = dbnsetup(dbn, train_x, opts);dbn = dbntrain(dbn, train_x, opts);figure; visualize(dbn.rbm{1}.W'); % Visualize the RBM weights%% ex2 train a 100-100 hidden unit DBN and use its weights to initialize a NNrand('state',0)%train dbndbn.sizes = [100 100];opts.numepochs = 1;opts.batchsize = 100;opts.momentum = 0;opts.alpha = 1;dbn = dbnsetup(dbn, train_x, opts);dbn = dbntrain(dbn, train_x, opts);%unfold dbn to nnnn = dbnunfoldtonn(dbn, 10);nn.activation_function = 'sigm';%train nnopts.numepochs = 1;opts.batchsize = 100;nn = nntrain(nn, train_x, train_y, opts);[er, bad] = nntest(nn, test_x, test_y);assert(er < 0.10, 'Too big error');```Example: Stacked Auto-Encoders---------------------```matlabfunction test_example_SAEload mnist_uint8;train_x = double(train_x)/255;test_x = double(test_x)/255;train_y = double(train_y);test_y = double(test_y);%% ex1 train a 100 hidden unit SDAE and use it to initialize a FFNN% Setup and train a stacked denoising autoencoder (SDAE)rand('state',0)sae = saesetup([784 100]);sae.ae{1}.activation_function = 'sigm';sae.ae{1}.learningRate = 1;sae.ae{1}.inputZeroMaskedFraction = 0.5;opts.numepochs = 1;opts.batchsize = 100;sae = saetrain(sae, train_x, opts);visualize(sae.ae{1}.W{1}(:,2:end)')% Use the SDAE to initialize a FFNNnn = nnsetup([784 100 10]);nn.activation_function = 'sigm';nn.learningRate = 1;nn.W{1} = sae.ae{1}.W{1};% Train the FFNNopts.numepochs = 1;opts.batchsize = 100;nn = nntrain(nn, train_x, train_y, opts);[er, bad] = nntest(nn, test_x, test_y);assert(er < 0.16, 'Too big error');```Example: Convolutional Neural Nets---------------------```matlabfunction test_example_CNNload mnist_uint8;train_x = double(reshape(train_x',28,28,60000))/255;test_x = double(reshape(test_x',28,28,10000))/255;train_y = double(train_y');test_y = double(test_y');%% ex1 Train a 6c-2s-12c-2s Convolutional neural network %will run 1 epoch in about 200 second and get around 11% error. %With 100 epochs you'll get around 1.2% errorrand('state',0)cnn.layers = { struct('type', 'i') %input layer struct('type', 'c', 'outputmaps', 6, 'kernelsize', 5) %convolution layer struct('type', 's', 'scale', 2) %sub sampling layer struct('type', 'c', 'outputmaps', 12, 'kernelsize', 5) %convolution layer struct('type', 's', 'scale', 2) %subsampling layer};cnn = cnnsetup(cnn, train_x, train_y);opts.alpha = 1;opts.batchsize = 50;opts.numepochs = 1;cnn = cnntrain(cnn, train_x, train_y, opts);[er, bad] = cnntest(cnn, test_x, test_y);%plot mean squared errorfigure; plot(cnn.rL);assert(er<0.12, 'Too big error');```Example: Neural Networks---------------------```matlabfunction test_example_NNload mnist_uint8;train_x = double(train_x) / 255;test_x = double(test_x) / 255;train_y = double(train_y);test_y = double(test_y);% normalize[train_x, mu, sigma] = zscore(train_x);test_x = normalize(test_x, mu, sigma);%% ex1 vanilla neural netrand('state',0)nn = nnsetup([784 100 10]);opts.numepochs = 1; % Number of full sweeps through dataopts.batchsize = 100; % Take a mean gradient step over this many samples[nn, L] = nntrain(nn, train_x, train_y, opts);[er, bad] = nntest(nn, test_x, test_y);assert(er < 0.08, 'Too big error');%% ex2 neural net with L2 weight decayrand('state',0)nn = nnsetup([784 100 10]);nn.weightPenaltyL2 = 1e-4; % L2 weight decayopts.numepochs = 1; % Number of full sweeps through dataopts.batchsize = 100; % Take a mean gradient step over this many samplesnn = nntrain(nn, train_x, train_y, opts);[er, bad] = nntest(nn, test_x, test_y);assert(er < 0.1, 'Too big error');%% ex3 neural net with dropoutrand('state',0)nn = nnsetup([784 100 10]);nn.dropoutFraction = 0.5; % Dropout fraction opts.numepochs = 1; % Number of full sweeps through dataopts.batchsize = 100; % Take a mean gradient step over this many samplesnn = nntrain(nn, train_x, train_y, opts);[er, bad] = nntest(nn, test_x, test_y);assert(er < 0.1, 'Too big error');%% ex4 neural net with sigmoid activation functionrand('state',0)nn = nnsetup([784 100 10]);nn.activation_function = 'sigm'; % Sigmoid activation functionnn.learningRate = 1; % Sigm require a lower learning rateopts.numepochs = 1; % Number of full sweeps through dataopts.batchsize = 100; % Take a mean gradient step over this many samplesnn = nntrain(nn, train_x, train_y, opts);[er, bad] = nntest(nn, test_x, test_y);assert(er < 0.1, 'Too big error');%% ex5 plotting functionalityrand('state',0)nn = nnsetup([784 20 10]);opts.numepochs = 5; % Number of full sweeps through datann.output = 'softmax'; % use softmax outputopts.batchsize = 1000; % Take a mean gradient step over this many samplesopts.plot = 1; % enable plottingnn = nntrain(nn, train_x, train_y, opts);[er, bad] = nntest(nn, test_x, test_y);assert(er < 0.1, 'Too big error');%% ex6 neural net with sigmoid activation and plotting of validation and training error% split training data into training and validation datavx = train_x(1:10000,:);tx = train_x(10001:end,:);vy = train_y(1:10000,:);ty = train_y(10001:end,:);rand('state',0)nn = nnsetup([784 20 10]); nn.output = 'softmax'; % use softmax outputopts.numepochs = 5; % Number of full sweeps through dataopts.batchsize = 1000; % Take a mean gradient step over this many samplesopts.plot = 1; % enable plottingnn = nntrain(nn, tx, ty, opts, vx, vy); % nntrain takes validation set as last two arguments (optionally)[er, bad] = nntest(nn, test_x, test_y);assert(er < 0.1, 'Too big error');```[![Bitdeli Badge](https://d2weczhvl823v0.cloudfront.net/rasmusbergpalm/deeplearntoolbox/trend.png)](https://bitdeli.com/free "Bitdeli Badge")

android mp3硬解码器,android硬解码只有音频没有视频

loadLibrary:225 Loading OMX library libOmxVideo.so.08-28 13:21:36.860: I/omx_core(3443): Core library has 20 components08-28 13:21:36.860: E/OMXMaster(3443): A component of name 'OMX.google.alac.decod...

weixin_35319894的博客 1061

Camera2Demo

在Camera2 的基础上进行封装,使得Camera2一堆初始化逻辑与Activity分离,降低耦合度,完成预览拍照并保存的操作

Devexpress16.2.6破解工具

Devexpress16.2.6破解工具Devexpress16.2.6破解工具Devexpress16.2.6破解工具Devexpress16.2.6破解工具

OMX大量内存泄漏问题分析

正常LOG,OMX的关键字makeComponentInstance跟destroyComponentInstance是一一对应的。系统service产生内训消耗,多是使用系统service接口的应用产生。先找到异常使用的地方,再从异常使用的地方往前找异常的应用。二,分析OMX模块业务,在此不再冗述。推测当时使用OMX接口的音频或者视频模块可能因为没有释放句柄、资源等造成内存泄漏。找每份LOG中,make跟destroy数量不一致的LOG。确认了是omx@1.0-service 模块内存一直在消耗。

漂流瓶の海岸 822

omx 笔记

这些都是标准OMX的接口头文件和数据类型,从最底层看起,能够更容易理解OMX得各种数据类型,抛砖引玉,希望大家多多谈论自己的经验!! /platform/external/opencore/extern_libs_v2/khronos/openmax/include/OMX_Types.h OMX_Types头文件包含使用原始类型的定义核心,应用程序和组件。如用在不同操作系统上此文件可

zhangwenyang2005的专栏 1197

Android音频开发(5):音频数据的编解码

前面四篇文章分别介绍了音频开发必备的基础知识、如何采集一帧音频、如何播放一帧音频、如何存储和解析wav格式的文件,建议有兴趣的小伙伴们先读一读,本文则重点关注如何对一帧音频数据进行编码和解码。1. Android 官方的 MediaCodec API首先,我们了解一下 Android 官方提供的音频编解码的 API,即 MediaCodec 类,该 API 是在 Andorid 4.1 (API ...

weixin_34238633的博客 2892
上一篇: android的binder机制研究二
下一篇: 设计模式解析和实现(C++, java)之二十--状态(state)模式
landerluu
博客等级 码龄20年 22粉丝 13原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值