android 多媒体框架中mediaplay与opencore的衔接调用过程

OpenMax多媒体引擎 摘自《Android系统级深入开发—移植与调试》 18.1  OpenMax系统结构和移植内容 OpenMax是一个多媒体应用程序的框架标准。其中,OpenMax IL(集成层)技术规格定义了媒体组件接口,以便在嵌入式器件的流媒体框架中快速集成加速编解码器。 在Android中,OpenMax IL层,通常可以用于多媒体引擎的插件,Android的多媒体引擎OpenCore和StageFri 阅读详情
本文从代码的角度来分析Android多媒体框架中mediaplay是如何调用opencore的。

一 摘要
    对于Android 多媒体框架,Google 在 Android 2.2中就已经实现了stagefright,但还是保留了opencore;
在新推出的2.3版本中,正式抛弃了opencore,而采用stagefright。网上关于Android opencore架构的文章有很多,例如下面的链接: http://www.360doc.com/content/10/0207/22/155970_15398760.shtml。但大都是基于框架的,而没有更加细致的给出代码的实现过程,本文从MediaPlayer::setDataSource开始,分析一下整个opcncore的初始化过程。

二 引子
    在播放一个视频文件的时候,往往会这样做:
    第一步,创建一个MediaPlayer对象;
    第二步,依次调用MediaPlayer的setDataSource,prepare,start函数;
    本文仅仅分析setDataSource(opencore的初始化就是在这个函数中完成的)。

三 代码分析
1. MediaPlayer::setDataSource(int fd, int64_t offset, int64_t length)

    当我们在java层调用setDataSource函数时,最终,它会通过jni调用到C++层的MediaPlayer::setDataSource(int fd, int64_t offset, int64_t length)函数。它的实现如下:
status_t MediaPlayer::setDataSource(int fd, int64_t offset, int64_t length) ;
  1) getMediaPlayerService()   
        1.1  getService(String16("media.player")
  2) service->create(getpid(), this, fd, offset, length)
        2.1  c = new Client, //这是一个MediaPlayerService::Client对象,参考MediaPlayerService类图
        2.2  c->setDataSource(fd, offset, length)
               getPlayerType
               sp<MediaPlayerBase> p = createPlayer(playerType);  // 真正的是实例PVPlayer, MidiFile or VorbisPlayer
                   android::createPlayer(playerType, this, notify)
                        sp<MediaPlayerBase> p;
                        case 1: p = new PVPlayer();  // defined media/PVPlayer.h
                        case 2: p = new MidiFile();   // defined libmediaplayerservice/PVPlayer.h
                        case 3: p = new VorbisPlayer();// same as MidiFile
                        case 4: p = new stagefright;   // 2.2开始加入的,2.3中就彻底用它了。


  3) setDataSource(player): 保存player的引用到MediaPlayer中.

以上三步,简要分析如下:
首先, 得到MediaPlayerService;
其次, 通过MediaPlayerService这个service来创建Client,再通过Client去创建Player(即调用createPlayer函数),事实上,创建的真正的是实例PVPlayer, MidiFile or VorbisPlayer,这就是opencore于mediaplayer的真正的唯一的桥梁。
最后, 通过调用setDataSource(这个是MediaPlayer类的函数)就创建的适配层的实例保存在MediaPlayer类的成员对象mPlayer中(详见setDataSource函数)。

2. PVPlayer的初始化
  1) 相关文件分布: 
     既然createPlayer(playerType)函数中最创建PVPlayer(即调用new PVPlayer()),那么,就有必要看一下PVPlayer的构造的实现:
     PVPlayer的头文件是PVPlayer.h,路径为:base/include/media,而实现是在Playerdriver.cpp中,路径为:opencore/android.
     从这个小小的文件分布来看,也能得出PVPlayer是衔接C++层的mediaserver与opencore的桥梁。
  2) 然而,为什么头文件和实现不是相同的前缀名呢?
     答:看Playerdriver.cpp的代码就知道,原来,最终的与opencore打交道的任务都落在了Playerdriver这个类上,
     而它也是PVPlayer类的一个数据成员。所以,为了与上层的MediaPlayer(要注意,PVPlayer类是MediaPlayer类的数据成员->其实是sp<IMediaPlayer>       mPlayer,这里,因为PVPlayer继承了sp<IMediaPlayer>)衔接,头文件取名为PVPlayer; 另外,真正与opencore 打交道的是Playerdriver,所以,实现的Cpp文件就是Playerdriver.cpp了。笔者认为,为了更加代码更加清晰,完全可以写一个PVPlayer.cpp,将PVPlayer.cpp相关代码写在这个PVPlayer.cpp中,尽管代码不是特别多。
  3) 是该看一下PVPlayer的初始化过程了:

    看PVPlayer的构造函数,最主要的就就创建了Playerdriver对象( mPlayerDriver = new PlayerDriver(this);),所以,PlayerDriver的构造才是核心。

3. PlayerDriver的构造

在 PlayerDriver 的构造过程中,最主要做了 3 件事情:
1) Semaphore(信号量)的创建:
    mSyncSem = new OsclSemaphore();
    mSyncSem->Create();
2) load libopencorehw.so:
    mLibHandle = ::dlopen(MIO_LIBRARY_NAME, RTLD_NOW); //MIO_LIBRARY_NAME = "libopencorehw.so";
3) 开始 player thread
    createThreadEtc(PlayerDriver::startPlayerThread , this, "PV player");
4. PlayerDriver::playerThread的实现

startPlayerThread会call playerThread,playerThread是真正创建PV thread的函数。

int PlayerDriver::playerThread()
{
    int error;

    LOGV("InitializeForThread");
    if (!InitializeForThread())
    {
        LOGV("InitializeForThread fail");
        mPlayer = NULL;
        mSyncSem->Signal();
        return -1;
    }

    LOGV("OMX_MasterInit");
    OMX_MasterInit();

    LOGV("OsclScheduler::Init");
    OsclScheduler::Init("AndroidPVWrapper");

    LOGV("CreatePlayer");
    OSCL_TRY(error, mPlayer = PVPlayerFactory::CreatePlayer(this, this, this));
    if (error) {
        // Just crash the first time someone tries to use it for now?
        mPlayer = NULL;
        mSyncSem->Signal();
        return -1;
    }

    LOGV("AddToScheduler");
    AddToScheduler();
    LOGV("PendForExec");
    PendForExec();

    LOGV("OsclActiveScheduler::Current");
    OsclExecScheduler *sched = OsclExecScheduler::Current();
    LOGV("StartScheduler");
    error = OsclErrNone;
    OSCL_TRY(error, sched->StartScheduler(mSyncSem));
    OSCL_FIRST_CATCH_ANY(error,
                         // Some AO did a leave, log it
                         LOGE("Player Engine AO did a leave, error=%d", error)
                        );

    LOGV("DeletePlayer");
    PVPlayerFactory::DeletePlayer(mPlayer);

    delete mDownloadContextData;
    mDownloadContextData = NULL;

    delete mDataSource;
    mDataSource = NULL;
    delete mAudioSink;
    PVMediaOutputNodeFactory::DeleteMediaOutputNode(mAudioNode);
    delete mAudioOutputMIO;
    delete mVideoSink;
    if (mVideoNode) {
        PVMediaOutputNodeFactory::DeleteMediaOutputNode(mVideoNode);
        delete mVideoOutputMIO;
    }

    mSyncStatus = OK;
    mSyncSem->Signal();
    // note that we only signal mSyncSem. Deleting it is handled
    // in enqueueCommand(). This is done because waiting for an
    // already-deleted OsclSemaphore doesn't work (it blocks),
    // and it's entirely possible for this thread to exit before
    // enqueueCommand() gets around to waiting for the semaphore.

    // do some of destructor's work here
    // goodbye cruel world
    delete this;

    //Moved after the delete this, as Oscl cleanup should be done in the end.
    //delete this was cleaning up OsclSemaphore objects, eventually causing a crash
    OsclScheduler::Cleanup();
    LOGV("OsclScheduler::Cleanup");

    OMX_MasterDeinit();
    UninitializeForThread();
    return 0;
}
简析:
1) OMX_MasterInit 的调用,这正好是OMX协议定义中规定的要调用的第一个函数。
2) OsclScheduler::Init("AndroidPVWrapper");
3) OSCL_TRY(error, mPlayer = PVPlayerFactory::CreatePlayer(this, this, this)); 通过Factory模式来创建Player.
   在pv_player_factory.cpp中,有:
OSCL_EXPORT_REF PVPlayerInterface *PVPlayerFactory::CreatePlayer(PVCommandStatusObserver* aCmdStatusObserver,
        PVErrorEventObserver *aErrorEventObserver,
        PVInformationalEventObserver *aInfoEventObserver,
        bool aHwAccelerated)
{
    return PVPlayerEngine::New(aCmdStatusObserver, aErrorEventObserver, aInfoEventObserver, aHwAccelerated);  // 会创建PVPlayerEngine的实例。
}
4) AddToScheduler();
5) PendForExec();
6) OSCL_TRY(error, sched->StartScheduler(mSyncSem));
   StartScheduler的实现:
      (1) call BlockingLoopL
            A. call CallRunExec(pvactive);  // PVActiveBase *pvactive, 真正的对象是PlayerDriver实例。
                 a. call pvactive->Run() // 调用PlayerDriver的run.
   分析:在PlayerDriver的run函数中,根据command的命令来执行相应的handle函数。
7) 可以看到,与OSCl层的调用,创建Engine的代码,具体,请读者自己看源码来理解吧。

5 PVPlayerDriver中command的定义与理解
对PVPlayerDriver的各种操作使用各种命令来完成,这些命令在playerdriver.h 中进行的定义。
enum player_command_type {
    PLAYER_QUIT = 1,
    PLAYER_SETUP = 2,
    PLAYER_SET_DATA_SOURCE = 3,
    PLAYER_SET_VIDEO_SURFACE = 4,
    PLAYER_SET_AUDIO_SINK = 5,
    PLAYER_INIT = 6,
    PLAYER_PREPARE = 7,
    PLAYER_START = 8,
    PLAYER_STOP = 9,
    PLAYER_PAUSE = 10,
    PLAYER_RESET = 11,
    PLAYER_SET_LOOP = 12,
    PLAYER_SEEK = 13,
    PLAYER_GET_POSITION = 14,
    PLAYER_GET_DURATION = 15,
    PLAYER_GET_STATUS = 16,
    PLAYER_REMOVE_DATA_SOURCE = 17,
    PLAYER_CANCEL_ALL_COMMANDS = 18,
    PLAYER_CHECK_LIVE_STREAMING = 19
};
    这些命令一般实现的是PVPlayerInterface 各个接口的简单封装,例如对于较为简单的暂停播放这个操作,整个系统执行的过程如下所示:
(1) 在PVPlayer中的pause 函数(在playerdriver.cpp 文件中)
status_t PVPlayer::pause()
{
    LOGV("pause");
    return mPlayerDriver->enqueueCommand(new PlayerPause(0,0));
}
这时调用其成员mPlayerDriver(PlayerDriver 类型)的函数,将一个PlayerPause 命令加入了命令序列,具体的各种命令功能在playerdriver.h 文件中。
(2) PlayerDriver 类的enqueueCommand 将间接调用各个以handle 为开头的函数,对于PlayerPause 命令,调用的函数是handlePause
void PlayerDriver::handlePause(PlayerPause* ec)
{
    LOGV("call pause");
    mPlayer->Pause(0);
    FinishSyncCommand(ec);
}
    这里的mPlayer 是一个PVPlayerInterface 类型的指针,使用这个指针调用到了OpenCore 的 Player Engine 中的PVPlayerEngine类。
    在这个播放器适配器的实现中,一个主要的工作是将Android框架中定义的媒体的输出(包括Audio 的输出和Video 的输出)转换成,OpenCore的Player Engine需要的形 式。在这里两个重要的类是android_surface_output.cpp 实现的AndroidSurfaceOutput,android_audio_output.cpp实现的AndroidAudioOutput 。
    对于Video 输出的设置过程,在类PlayerDriver 中定义了3 个成员:
    PVPlayerDataSink *mVideoSink;
    PVMFNodeInterface *mVideoNode;
    PvmiMIOControl *mVideoOutputMIO;
    这里的mVideoSink 的类型为PVPlayerDataSink,这是Player Engine 中定义的类接口,mVideoNode 的类型为PVMFNodeInterface,在pvmi/pvmf/include的pvmf_node_interface.h 中定义,这是所有的PVMF 的NODE 都需要继承的统一接口,mVideoOutputMIO 的类型为PvmiMIOControl也在pvmi/pvmf/include 中定义,这是媒图输出控制的接口类。
(1) 在PVPlayer 的setVideoSurface 用以设置一个Video 输出的界面,这里使用的参数的类型是ISurface指针:
status_t PVPlayer::setVideoSurface(const sp<ISurface>& surface)
{
    LOGV("setVideoSurface(%p)", surface.get());
    mSurface = surface;
    return OK;
}
setVideoSurface 函数设置的是PVPlayer 中的一个成员mSurface ,真正设置Video 输出的界面的功能在run_set_video_surface() 函数中实现:
void PVPlayer::run_set_video_surface(status_t s, void *cookie)
{
    LOGV("run_set_video_surface s=%d", s);
    if (s == NO_ERROR) {
        PVPlayer *p = (PVPlayer*)cookie;
        if (p->mSurface == NULL) {
            run_set_audio_output(s, cookie);
        } else {
            p->mPlayerDriver->enqueueCommand(new PlayerSetVideoSurface(p->mSurface, run_set_audio_output, cookie));
        }
    }
}
这时使用的命令是PlayerSetVideoSurface ,最终将调用到PlayerDriver 中的handleSetVideoSurface 函数。
(2) handleSetVideoSurface 函数的实现如下所示:
void PlayerDriver::handleSetVideoSurface(PlayerSetVideoSurface* ec)
{
    int error = 0;
    mVideoOutputMIO = new AndroidSurfaceOutput(ec->surface());
    mVideoNode = PVMediaOutputNodeFactory::CreateMediaOutputNode(mVideoOutputMIO);
    mVideoSink = new PVPlayerDataSinkPVMFNode;
 
    ((PVPlayerDataSinkPVMFNode *)mVideoSink)->SetDataSinkNode(mVideoNode);
    ((PVPlayerDataSinkPVMFNode *)mVideoSink)->SetDataSinkFormatType(PVMF_YUV420);
 
    OSCL_TRY(error, mPlayer->AddDataSink(*mVideoSink, ec));
    OSCL_FIRST_CATCH_ANY(error, commandFailed(ec));
}
    在这里首先建立的创建成员mVideoOutputMIO(类型为PvmiMIOControl),这时建立的类是类AndroidSurfaceOutput ,这个类继承了PvmiMIOControl ,所以可以作为PvmiMIOControl 使用。然后调用PVMediaOutputNodeFactory::CreateMediaOutputNode 建立了PVMFNodeInterface 类型的mVideoNode 。随后创建PVPlayerDataSinkPVMFNode 类型的mVideoSink ,PVPlayerDataSinkPVMFNode 本身继承了PVPlayerDataSink ,因此可以作为PVPlayerDataSink 使用。调用SetDataSinkNode 函数将mVideoNode 设置为mVideoSink 的数据输出节点。

结语:再次说一下,opencore将在2.3版本中彻底消失,但是OMX还会在stagefright中继续使用。不过对于上层应用来说,不用管这些,因为接口没有变化。

在mk文件,没有看到具体的连接库的代码。如libmediaplayerservice的mk只看到链libopencore_player这个,
而opencore/android目录下mk文件写这个模块编译生成的是libandroidpv。在opencore/Android.mk中,有:
include $(PV_TOP)/build_config/opencore_dynamic/Android_opencore_common.mk
include $(PV_TOP)/build_config/opencore_dynamic/Android_opencore_author.mk
include $(PV_TOP)/build_config/opencore_dynamic/Android_opencore_player.mk
在第三个mk文件,即文件opencore/build_config/opencore_dynamic/Android_opencore_player.mk中,有
LOCAL_MODULE := libopencore_player。
在libmediaplayerservice中用的,正是上面这个mk文件编译出来的libopencore_player.so。

http://blog.youkuaiyun.com/liranke/article/details/6167043

海康威视摄像头调用Android源码示例.zip 一个简单的demo源码,通过填写局域网中海康威视摄像头的ip地址,端口号(默认8000),用户名(默认admin)和密码(海康的默认密码是“admin”+机身验证码),可以在登录后浏览摄像头,还有回放、捕获、对讲等简单功能。在我的荣耀V20手机上验证成功。 立即下载

相关推荐

HPE磁盘阵列管理04——MSA事件

本文介绍了HPE MSA存储系统的事件处理机制,重点分析了常见磁盘故障事件及其解决方案。文章首先定义了MSA事件的五个严重级别(严重、错误、警告、信息和解决),然后详细列举了多个典型事件案例(如事件1、3、6、8、172等),包括每种事件的触发条件、对系统的影响以及具体修复步骤。针对磁盘故障场景,文章提供了更换磁盘、重建磁盘组、取消隔离等操作建议,并强调应及时配置备用磁盘以降低数据风险。最后指出更详细的事件说明可参考《MSA事件描述参考指南》,并提供了HPE官方手册下载链接。全文为技术人员处理MSA存储故障

istrangeboy&begin zero的博客 1118

android媒体开发--OpenCore和Stagefright(一)

我2013年进入安卓车载行业,到现在将近4年时间。   车载行业涉及到“行车记录”(Camera、MediaRecorder),本地资源SD卡、U盘“媒体播放器”(MediaPlayer、MediaScanner、AudioManager),所谓近朱者赤,几年下来不能说是安卓媒体开发的砖家,但大部分流程和要点也都是了然于胸的,算是大半个媒体开发者吧。  从android4.2版本之后,媒体的相关源

阿德的博客 3703

实战指南:基于华为Ascend NPU的大模型W8A8量化调优与精度提升

本文提供了一份基于华为Ascend NPU进行大模型W8A8量化的实战调优指南。详细介绍了从环境搭建、使用msmodelslim框架进行基础量化,到通过离群值抑制、校准集优化和量化回退等关键技术提升精度的全流程。旨在帮助开发者在华为NPU硬件上实现模型推理的显著加速,同时有效控制精度损失。

weixin_29227425的博客 271

OpenCore学习-OpenCore介绍及与stagefright的对比

一、OpenCore简介         OpenCore是Android的多媒体核心,采用C++实现,定义了全功能的操作系统移植层(OSCL),各种基本的功能均被封装成类的形式,各层次之间的接口多使用继承等方式。         从宏观上来看,它主要包含了两大方面的内容: PVPlayer:提供媒体播放器的功能,完成各种音频(Audio)、视频(Video)流的回放(Playback)

sensenxiangshang 2250

YOLOv8中的C2f模块代码详解

在YOLOv8网络结构中,C2f模块(CSP Bottleneck with 2 Convolutions)是一个关键组件,用于实现跨阶段部分聚合

zzzyyy8的博客 3万+

Stagefright&&Opencore(好文)

原址

Android系统攻城狮 488

别再模拟IIC了!用STM32F103C8T6的硬件IIC驱动AT24C64,CubeMX配置+避坑指南

本文详细介绍了如何使用STM32F103C8T6的硬件IIC驱动AT24C64 EEPROM,通过CubeMX配置和HAL库函数解析,提供从模拟IIC到硬件IIC的完整解决方案。内容包括硬件IIC与模拟IIC的核心差异、CubeMX工程配置详解、HAL库驱动实战以及典型问题诊断与优化,帮助开发者构建更稳定高效的存储系统。

weixin_27038245的博客 188

Android多媒体框架初步分析

Android多媒体框架初步分析<br />邹德文<br /> Android 系统整体架构:<br />我们先看一下多媒体框架在整个Android系统所处的位置<br /><br /> <br /> <br />从框架图可以看出Media Framework处于Libraries这一层,这层的Library不是用Java实现,一般是C/C++实现,它们通过Java的JNI方式调用。<br /> <br /> <br />多媒体架构:<br />基于第三方PacketVideo 公司的OpenCORE pl

gracioushe的专栏 424

Ubuntu虚拟机磁盘扩容实战:5分钟搞定gparted分区调整(附常见错误修复)

本文详细介绍了在Ubuntu虚拟机中使用gparted工具进行磁盘扩容的实战步骤。针对常见的交换分区阻碍问题,提供了从禁用交换空间、删除旧分区、调整主分区大小到重建交换分区并更新系统配置的完整解决方案,帮助用户在5-10分钟内安全高效地解决磁盘空间不足的难题。

1a2s3d4f5g的博客 670

Hypermesh静力学仿真分析与模态分析-02

hypermesh中对较复杂实体进行静力学分析和模态分析,包含材料属性添加,载荷设置等等

Look_forward_的博客 6776

Android多媒体之Media Player

 多媒体,现代手机不可或缺的一部分,它包含了音视频播放器、照相机、录音机、摄像机、FM、移动电视、Gallery等等。在中国10年以前手机中的添加这些功能模块或许是想都不敢想的,但是10年之中各种专用功能的手机的出现,如带FM的手机、音乐手机、摄像手机、带移动电视的手机,让我们越来越觉得一部强大的手机理所当然应该包含这些功能。没错,我们可以细数一下,好像这些功能许多山寨机都已经支持,托山寨机的福,

arm10504的专栏 1386

Spring Framework 7.002.Spring IoC 容器与 Bean 简介(Introduction to the Spring IoC Container and Beans)

摘要:Spring框架的核心技术包括IoC容器和AOP技术。IoC容器通过依赖注入实现控制反转,提供Bean管理和配置功能。ApplicationContext作为BeanFactory的扩展,增加了企业级特性。文档详细介绍了容器配置、Bean定义、依赖注入、作用域等核心概念,以及基于注解的配置方式。AOP框架支持80%的AOP需求,并可集成AspectJ。此外还涵盖环境抽象、容器扩展点等高级特性,为Java企业应用开发提供全面支持。(150字)

无 212

Android音视频API - MediaCodec/MediaMuxer/MediaStore/MediaController等

AudioTrack播放音频PCM。[Android] 混音器AudioMixer。 MediaPlayer/MediaRecorder, AudioTrack/AudioRecorder, MediaCodec。 -- 使用MediaCodec和MediaMuxer的过程中遇到的问题,总结下需要注意主要有以下几点: 1.MediaCodec是Android4.1新增API,MediaMuxe...

ShareUs的专栏 2191

IEM模型,地表粗糙度模拟

利用微波反演土壤水分时候,利用IEM模型可以实现对随机地表的模拟

NTscan扫描工具

ntscan是一个扫描器,可以扫描没有密码和弱密码的共享,先到配置文件中填写猜测的用户名和密码,扫描过程中右侧出现的是扫描日志。

stagefright与opencore对比

  stagefright与opencore对比 收藏<br /><br />本文转自:http://blog.chinaunix.net/u2/61880/showart_2339481.html1引言<br /><br /> Android froyo版本多媒体引擎做了变动,新添加了stagefright框架,并且默认情况android选择stagefright,弃用之前的 opencore,仅仅对opencore中的omx-component部分做了引用。<br /

yzhchenliang的专栏 527

大中型超市收银系统(可直接运行)

光步前台收银系统系统功能:商品销售、商品退货、挂单、收银员权限、会员销售、单品取消、整单取消、商品查询、脱机销售、脱机数据上传,基本资料下载,开钱箱、小票打印、收款结算,支持多币种付款方式(现金、储值卡、礼券、微信等),支持多种促销。运行环境:.net 4.0登陆信息用户名:1001 密码:123456内置商品信息,商品编码可输入00001000 - 00010000,测试效果相关功能键F5 结算 F9挂单 F11商品查询 F8退货 Insert单品取消 Del整单取消 F12开钱箱F2 会员 Ctrl+Z退出系统 Home 锁屏 相关源码待公开

D435i启动遇到control_transfer returned error, index: 768, error: No data available, number: 61

这是我今天准备用D435i跑vins-mono遇到的情况,主要是启动rs_camera.launch有这个问题。 百度只能搜到一个,但是他给的方法没用,就是卸载,坑我。 用Bing搜这个报错倒是搜到不少 而且基本都是在realsense的github里面说的,看来遇到这种问题的不止我一个。 ...

自主无人机 PX4 ROS SLAM 路径规划 MVS等技术分享 8826

深度学习工具包 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")

Weeks 4、5 --论文部分(学习IP核的使用)Nios II的使用

下载到100%,回到Nios II(也就是eclipse),点击“Run”-“Run Configurations”,选择New Configuration,点击“Target Configurations”。3、添加JTAG_UART,连clk和reset,以及avalon_jtag_slave和data_master,连线,以及irq连线。8、双击nios-ii,设置nios-ii的偏移向量为“on-chip ram.s1”,非常重要,要不然会报错。6、添加sysid,连线。

m0_46305695的博客 662

GStreamer 支持的几种video sink解析

ximagesink:使用XWindow输出,基本都支持xvimagesink:使用XVideo extension输出,在ubuntu下要装一大堆库才支持sdlvideosink:使用sdl库输出,需要装sdl库dfbvideosink:用DirectFB库输出,需要apt-get install directfb* 安装后才能使用cacasink:使用的是libcaca库,

wstarx的专栏 1万+

Android 视频编辑解析库 MP4Parser

音视频领域的小白,一不小心遇到很牛叉的需求。各种渠道看到这个库,研究的不够深,简单记录。作者:JustDo23来源:https://www.jianshu.com/p/c87ada9b0f65库地址:https://github.com/sannies/mp4parser01. README 在 GitHub 上找到这个库后从README开始。官方写到A Java API...

音视频开发进阶 3437
上一篇: Android的MediaPlayer架构介绍
下一篇: opencore内部调度
eustoma
博客等级 码龄18年 79粉丝 54原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

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

抵扣说明:

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

余额充值