Android4.2.2启动动画前播放视频

首先声明測试平台为瑞芯微的rk3168,Android4.2.2,Android版本号非常重要,由于Android4.0和Android4.2.2的代码有些地方就有差别,并不通用!

首先接到任务不知怎样下手,由于我了解中Android启动时没有出现过播放视频的,特别是在启动动画之前,Linux企鹅之后,而动画也是一幅幅的图片,根本不是啥视频如mp4,3gp等!

由于启动动画时能够播放声音,并且上层应用的mediaplayer也能够播放声音,结合surface能够播放视频!这就是入口点~

动画播放的关键文件在:Z:\Backup\rk3168_v4.2\frameworks\base\cmds\bootanimation下!

1、了解Android显示开机画面的原理!

1. Linux 系统启动,出现Linux小企鹅画面(reboot)(Android 1.5及以上版本号已经取消载入图片);

2. Android平台启动初始化,出现"A N D R I O D"文字字样画面;

3. Android平台图形系统启动,出现含闪动的ANDROID字样的动绘图片(start)。

4、原理參考资料:

http://blog.csdn.net/luoshengyang/article/details/7691321

http://blog.csdn.net/conowen/article/details/7884009

http://www.cnblogs.com/jqyp/archive/2012/03/07/2383973.html

http://blog.csdn.net/backgarden_straw/article/details/8571992

http://www.eoeandroid.com/thread-114742-1-1.html

1、播放音乐:

在瑞芯微提供的源代码中事实上能够支持播放音乐了,仅仅是没有提供音乐文件!声音移植

a、首先在BootAnimation.h加入方法的声明和头文件的引用


1

2

#include
<media/AudioSystem.h>

#include
<media/mediaplayer.h>

b、在 class BootAnimation : public Thread, public IBinder::DeathRecipient中

加入方法 void
playMusic();

c、然后在BootAnimation.cpp中实现这种方法:

#define BOOTMUSIC_FILE "/system/media/audio/alarms/gx.mp4"

void BootAnimation::playMusic()

{

sp<MediaPlayer> mp = new MediaPlayer();

if ((0 == access(BOOTMUSIC_FILE, F_OK)) && mp != NULL) {

mp->setDataSource(BOOTMUSIC_FILE, NULL)
//设置资源

mp->prepare();                                                                 //准备,同步

mp->start();                                                                      //播放

}                                                                                           //事实上mediaplayer还有

非常多方法,能够查看mediaplayer类

}

d、调用并启动声音

bool BootAnimation::threadLoop()

{

bool r;

playMusic()

if (mAndroidAnimation) {

r = android();

} else {

r = movie();

}

.......

}

e、Android.mk的改动

由于播放声音还须要引入库

LOCAL_SHARED_LIBRARIES := \

libcutils \

libandroidfw \

libutils \

libbinder \

libui \

libskia \

libEGL \

libGLESv1_CM \

libmedia \

libgui

请注意,libmedia是新加入的;

f、声音文件的加入

源代码文件夹在声音在:

Z:\source\rk3168_v4.2\frameworks\base\data\sounds

视频在:

Z:\source\rk3168_v4.2\frameworks\base\data\videos

至于编译完毕后放到什么地方了那是AllAudio.mk文件上配置的

$(LOCAL_PATH)/XXXX.mp3:system/etc/xxxx.mp3 \

g、将音频放到此文件夹编译,就有开机声音了!

2、视频移植

a、事实上看了前面的资料了解动画的启动过程和对上层应用播放视频的方法事实上非常easy了!

事实上动画的播放也是用surface来展示的,然后用OpenGL将图片绘制上去的!

联系上层应用播放视频的步骤(mediaplayer+surfaceview):

player=new MediaPlayer();
player.setAudioStreamType(AudioManager.STREAM_MUSIC);
player.setDisplay(surfaceHolder);
player.setDataSource("/sdcard/gx.mp4");
player.prepare();
player.start();

。。。。。。。

所以假设你做了声音播放后是不是非常自然想到,就差player.setDisplay(surfaceHolder);

既然如此就倒推这方法做了什么:

由于setdisplay是mediaplayer的方法

base\media\java\android\media\mediaplayer.Java--->

public void setDisplay(SurfaceHolder sh) {

mSurfaceHolder = sh;

Surface surface;

if (sh != null) {

surface = sh.getSurface();

} else {

surface = null;

}

_setVideoSurface(surface);//重点设置一个surface

updateSurfaceScreenOn();

}

private native void _setVideoSurface(Surface surface); //本地方法

base\media\jni\android_media_MediaPlayer.cpp ----->
{"_setVideoSurface",    "(Landroid/view/Surface;)V",        (void *)android_media_MediaPlayer_setVideoSurface},

---->android_media_MediaPlayer_setVideoSurface(JNIEnv *env, jobject thiz, jobject jsurface)
{
    setVideoSurface(env, thiz, jsurface, true /* mediaPlayerMustBeAlive */);
}

------------>
static void
setVideoSurface(JNIEnv *env, jobject thiz, jobject jsurface, jboolean mediaPlayerMustBeAlive)
{
    sp<MediaPlayer> mp = getMediaPlayer(env, thiz);
    if (mp == NULL) {
        if (mediaPlayerMustBeAlive) {
            jniThrowException(env, "java/lang/IllegalStateException", NULL);
        }
        return;
    }

    decVideoSurfaceRef(env, thiz);

    sp<ISurfaceTexture> new_st;
    if (jsurface) {
        sp<Surface> surface(android_view_Surface_getSurface(env, jsurface));
        if (surface != NULL) {
            new_st = surface->getSurfaceTexture();
            if (new_st == NULL) {
                jniThrowException(env, "java/lang/IllegalArgumentException",
                    "The surface does not have a binding SurfaceTexture!");
                return;
            }
            new_st->incStrong(thiz);
        } else {
            jniThrowException(env, "java/lang/IllegalArgumentException",
                    "The surface has been released");
            return;
        }
    }

    env->SetIntField(thiz, fields.surface_texture, (int)new_st.get());

    // This will fail if the media player has not been initialized yet. This
    // can be the case if setDisplay() on MediaPlayer.java has been called
    // before setDataSource(). The redundant call to setVideoSurfaceTexture()
    // in prepare/prepareAsync covers for this case.
    mp->setVideoSurfaceTexture(new_st);                //重点
}
分析到这里我们心里基本有数了,就是要活的一个surface就可以!

b、分析动画中surface 的构建过程:
在base\cmds\bootanimation\BootAnimation.cpp的status_t BootAnimation::readyToRun()中有对surface的初始化,到了就完毕了大半获取这个surface在调用上面的方法就大功告成!



Android4.2.2启动动画前播放视频

时间: 2024-12-21 23:38:05

Android4.2.2启动动画前播放视频的相关文章

iOS 关于启动app循环播放视频功能(常用于登录时)

摘自:http://www.jianshu.com/p/85786fce9234 附上DEMO的地址需要的话可以看一下:https://github.com/zhangyqyx/startMovie 我们经常会看到我们在第一次使用app的时候,会播放一段视频,以便我们来了解app.本文章就是应用于此处的...

[Swift通天遁地]八、媒体与动画-(2)实现视频文件的播放和画中画

本文将演示使用AVPlayerViewController播放视频并实现画中画. 往项目中导入了一个视频文件. 在左侧的项目导航区,打开视图控制器的代码文件[ViewController.swift] 1 import UIKit 2 //在当前的类文件中, 3 //引入需要用到的相关类库 4 import AVFoundation 5 import AVKit 6 7 class ViewController: UIViewController, AVPlayerViewControllerD

[Xcode10 实际操作]六、媒体与动画-(16)使用MediaPlayer框架播放视频

本文将演示视频的播放功能. 在项目名称上点击鼠标右键,弹出右键菜单, 选择[Add Files to "DemoApp"],往项目中导入文件命令. 点击选择一个影片素材->[Add] 在项目导航区,打开视图控制器的代码文件[ViewController.swift] 1 import UIKit 2 //AVFoundation框架用来处理基于时间的媒体数据. 3 //可以用来检查.创建.编辑或是重新编码媒体文件. 4 //也可以从设备中获取输入流 5 //在视频实时播放时操作和

朋友圈滚动播放视频功能

欢迎Follow我的GitHub, 关注我的CSDN. 在应用的信息流中, 用户会分享视频, 连续展示, 这就需要处理视频滚动播放. 然而, 在列表视图(RecyclerView)中使用MediaPlayer播放视频时, 会产生一些问题, 即无法同步控制视频的播放和停止. 使用控件库可以解决这一问题. 滚动播放功能: 在页面中, 判断视频的可视比例, 最大视频项开始播放, 其余视频项关闭, 滚动中自动控制切换视频状态. 让我们来看看如何实现这一功能. 本文示例的Github下载地址. 使用的视频

ckplayer插件播放视频

官网:超酷网页视频 本篇介绍:插件播放视频,  添加插件(额外的功能),  视频格式之间的转换 PC端一般都是利用插件(Flash)来播放视频,可以支持很多格式.网上很多说这个插件的,这里只是做个记录. 下载好,移动到我们的项目,开始测试.因为里面的功能有点多,你可以去看文档完成自己需要的需求,这里只是简单的记录. 我们PC一般会存放FLV格式视频,而MP4则使用与很多场景. FLV体积小,速度快这也是为什么网站都选选择使用这个格式. 最简单的版本: <div id="a1"&g

Android 视频播放器 (一):使用VideoView播放视频

一.简介 作为Android开发,我们不可避免的会接触到视频播放,VideoView做为最简单的播放器,我们是不应该不会的. 下面简单介绍一下VideoView: VideoView是使用MediaPlayer来对视频文件进行控制的. VideoView只支持mp4.avi.3gp格式的视频,支持格式相对单一,VideoView支持的格式可以参考MediaPlayer. VideoView可以播放网络视频,支持的网络视频的协议为:Http协议和RTSP协议两种. 二.VideoView常用方法

Unity中实现播放视频

突然想着在一个cube物体上播放视频会是怎样的情景.今天终于有时间来尝试下了.结果=>成功 下面来说说详细的步骤吧 准备阶段: 1.unity pro 专业版 =>  需正版(当然破解版也ok,你懂的). 2.安装QuickTime Player.必须要安装,否则导入movie资源时,unity会自动报错提醒的. 3.安装格式化工厂软件=>movie格式转换.其他工具也ok.我这里默认转换为MOV格式.100M的avi转换后大概7M. ====================== uni

播放视频的框架Vitamio的使用问题

以前用过这个牛逼的框架,后来又随意搞了下,发现播放不了视频了,搞了老半天才搞好,今天又随便整了下,发现又不行了,我勒个插! 现在终于又搞出来了,发现我总是把步骤搞错或少写了些东西 总的步骤: 一:导入vitamio_lib包 二:xml布局中的videoView要替换 三:java文件中的所有包导入的都是vitamio_lib下的东西 四:在java文件的setContentView前要加判断!!!<易遗忘> 五:在清单文件中要加入io.vov.vitamio.activity.InitAct

Firefox 无法播放视频

网上有很多介绍Firefox无法播放视频的解决方案,最常见的问题就是:为正确安装flash插件.其他的插件与flash插件冲突. 系统Win8.1(64位)下新安装了Firefox 29,flash插件也已正常安装,访问视频网站始终播放不了视频. 进入系统如下目录: C:\Windows\SysWOW64\Macromed\Flash\mms.cfg 1 SilentAutoUpdateEnable=1 2 AutoUpdateDisable=0 3 ProtectedMode=0 在文件尾部增