介绍App开发常见的多媒体技术,主要包括如何使用各种图像控件实现自定义相册、如何使用几种主要的音频播放技术、如何使用几种常见的视频播放控件、如何在屏幕上划分多窗口进行特殊处理。

一、相    册  

介绍自定义相册的实现过程,首先说明使用画廊或循环视图如何实现简单相册;接着阐述使用图像切换器如何实现相册的左右滑动功能;然后分别介绍卡片视图与调色板的用法

1.画廊Gallery

           在电脑上,通过查看一组图片的缩略图列表,很容易找到想要的图片。

           在手机上可以使用相应的图像控件做出缩略图展示的相册效果。

           画廊Gallery是专门用于展示图片列表的控件,左右滑动手势即可展示内嵌的图片列表,画面效果类似于一个平面                      万花筒。

如何使用画廊

         下面是Gallery的常用方法说明。

                setSpacing:设置图片之间的间隔大小。

                setUnselectedAlpha:设置未选定图片的透明度。

                setAdapter:设置画廊的适配器。

                getSelectedItemId:获取当前选中的视图序号。

                setSelection:设置当前选中第几个视图。

                setOnItemClickListener:设置单项的点击监听器。

使用画廊的编码步骤

               (1)首先在布局文件中放置一个框架布局FrameLayout,里面放一个画廊控件与一个图像视图控件,                                     ImageView设置为充满整个屏幕,Gallery放在屏幕下方;

               (2)然后监听Gallery控件的单项点击事件,当用户点击指定图片项时,使用ImageView控件填充该图片,也就                       是点小图看大图。

                 如果想用其他控件替换Gallery,可以考虑采取水平方向线性布局管理器的循环视图RecyclerView。

画廊的展示效果

android多媒体(十五)

2.图像切换器ImageSwitcher

             图像切换器ImageSwitcher能够实现前后图片的切换动画,它继承自视图动画器ViewAnimator。

             同样源于ViewAnimator的有下列3种切换器:

            (1)图像切换器ImageSwitcher,用来承载前后两个图像的变换动画;

            (2)文本切换器TextSwitcher,用来承载前后两个文本的变换动画。

            (3)飞掠视图ViewFlipper,用来承载前后两个视图的变换动画。

如何使用图像切换器

            下面介绍ImageSwitcher的常用方法。

                    setFactory:设置一个视图工厂。

                    setImageResource:设置当前图像的资源ID。

                    setImageDrawable:设置当前图像的图形对象。

                    setImageURI:设置当前图像的URI地址。

                    setInAnimation:设置后一个图像的进入动画。

                    setOutAnimation:设置前一个图像的退出动画。

使用图像切换器的编码步骤

          (1)首先,对前后图片的切换动画可以事先设置好集合动画,通过setInAnimation和setOutAnimation方法完成动                      画调用;

          (2)其次,根据手势的左滑和右滑触发图片切换操作,因此可通过检测左滑手势和右滑手势自动轮播图片。

            注意:视图工厂由ViewFactory派生而来,需重写makeView方法返回工厂的具体视图。对于ImageSwitcher来说,                   工厂返回的是ImageView对象。

图像切换器的播放效果

android多媒体(十五)

3.图片查看器——青青相册

           CardView拥有一个卡片式的圆角边框,边框外缘有一圈阴影,边框内缘有一圈空白。

           CardView实际上是一个布局视图,继承自Framelayout,可以当作具有边框效果的特殊布局。

           CardView的常用属性与方法的说明见下表。

android多媒体(十五)

卡片视图的展示效果

android多媒体(十五)

调色板Palette

              调色板把多种颜色混合在一起,调和均匀后显示出新颜色。 根据每幅图片的色彩情况自动计算该图片的总体色调,通过          调色板控件Palette就能完成。

             下面是Palette的常用方法说明。

                    from:从位图对象中获得调色板的构建对象。

                    Builder.generate:给构建对象注册调色板的调色监听器。

                    getVibrantSwatch:获取偏亮色调的色板对象。

                    getSwatches:获取所有色板对象。

装饰后的相册效果

android多媒体(十五)

二、音频播放

          介绍了音频播放的几种方式,首先说明了铃声工具的适用场合与简单用法;接着阐述了声音池的运用场景,它的优缺点,以及基本用法;然后说明了音轨的产生背景,以及如何进行音轨的录制和播放。

1.铃声Ringtone

         MediaPlayer存在某些播音方面的不足之处,主要包括:

        (1)MediaPlayer的初始化比较消耗资源,尤其是播放短小铃音时反应偏慢;

        (2)一个MediaPlayer同时只能播放一个媒体文件,无法同时播放多个声音;

        (3)MediaPlayer只能播放已经完成编码的音频文件,无法直接播放原始音频,也不能流式播放(即边录边播);

         对第一个问题来说,Android提供了铃声工具Ringtone处理铃音的播放。

如何使用Ringtone

铃声管理器支持的系统铃音类型取值说明见下表。

android多媒体(十五)

下面是Ringtone的常用方法说明:

           play:开始播放铃声。

           stop:停止播放铃声。

           isPlaying:判断铃声是否正在播放。

2.声音池SoundPool

        对于MediaPlayer无法同时播放多个声音的问题,Android提供了声音池工具SoundPool,使用声音池即可对多个声                   音的播放进行调度。 使用SoundPool可以事先加载多个音频,在需要时再播放指定音频,这样有几个好处:

     (1)资源占用量小,不像MediaPlayer那么耗资源;

     (2)相对MediaPlayer来说,延迟时间非常小;

      (3)可以同时播放多个音频,从而实现游戏过程中多个声音叠加的情景;

如何使用SoundPool

      下面是SoundPool的常用方法说明:

             构造函数:可设置最大音频个数、音频类型、音频质量。

            load:加载指定的音频文件。

            unload:卸载指定编号的音频。

            play:播放指定编号的音频。

            pause:暂停播放指定编号的音频。

            resume:恢复播放指定编号的音频。

            stop:停止播放指定编号的音频。

            release:释放所有音频资源。

            setOnLoadCompleteListener:设置音频加载完毕的监听器。

3.音轨录播AudioTrack

        语音通话功能要求实时传输,但是MediaRecorder与MediaPlayer组合只能整句话都录完编码好了,才能传给对方去               播放,这个实效性就太差了。

       音频录制器AudioRecord与音轨播放器AudioTrack组合起来可用于实时音频处理,该组合的音频格式为原始的二进制              音频数据,没有文件头和文件尾,故而可以实现边录边播的实时语音对话。

如何使用AudioRecord

                  下面是AudioRecord的录音方法说明:

                           getMinBufferSize:根据采样频率、声道配置、音频格式获得缓冲区大小。

                           构造函数:可设置录音来源、采样频率、声道配置、音频格式与缓冲区大小。

                           startRecording:开始录音。

                           read:从缓冲区中读取音频数据。

                           stop:停止录音。

                           release:停止录音并释放资源。

                           setNotificationMarkerPosition:设置需要通知的标记位置。

                           setPositionNotificationPeriod:设置需要通知的时间周期。

                           setRecordPositionUpdateListener:设置录制位置变化的监听器对象。

     如何使用AudioTrack

               下面是AudioTrack的播音方法说明:

                           getMinBufferSize:根据采样频率、声道配置、音频格式获得缓冲区大小。

                           构造函数:可设置音频类型、采样频率、声道配置、音频格式、播放模式与缓冲区大小。

                           play:开始播音。

                           write:把缓冲区的音频数据写入音轨。

                           stop:停止播音。

                           release:停止播音并释放资源。

                           setNotificationMarkerPosition:设置需要通知的标记位置。

                           setPositionNotificationPeriod:设置需要通知的时间周期。

                           setPlaybackPositionUpdateListener:设置播放位置变化的监听器对象。

三、视频播放

                          介绍视频播放的相关技术,首先说明视频视图的工作原理,并结合拖动条实现简单的视频播放器;接着阐述媒                       体控制条的用法,以及媒体控制条与视频视图的两种绑定方式;最后演示了如何实现自定义样式的视频播放控制                           条。

1.视频视图VideoView

              视频视图VideoView内部集成了SurfaceView和MediaPlayer,从而实现视频画面与视频操作的统一管理。 由于                   VideoView只是一个播放界面,本身不会显示进度条,因此实际开发中至少得给它配备一个拖动条SeekBar,一方面用                来展示当前的播放进度,另一方面用来拖动播放位置。

如何使用VideoView(上)

             下面是VideoView的常用设置方法说明。

                   setVideoPath:设置视频文件的路径。

                   setMediaController:设置媒体控制条的对象。

                   setOnPreparedListener:设置预备播放监听器。

                   setOnCompletionListener:设置结束播放监听器。

                   setOnErrorListener:设置播放异常监听器。

                   setOnInfoListener:设置播放信息监听器。

                   requestFocus:请求获得焦点。

如何使用VideoView(下)

           下面是VideoView的常用播放方法说明。

                   start:开始播放视频。

                   pause:暂停播放视频。

                   resume:恢复播放视频。

                   suspend:结束播放并释放资源。

                   seekTo:拖动视频到指定进度开始播放。

                   getDuration:获得视频的总时长。

                   getCurrentPosition:获得当前的播放位置。

                   isPlaying:判断是否正在播放。

                   getBufferPercentage:获得已缓冲的比例。

视频视图的播放效果

android多媒体(十五)

2.媒体控制条MediaController

            MediaController支持下列基本的播放控制操作:

                (1)显示当前的播放进度。

                (2)拖动到指定位置播放。

                (3)暂停播放与恢复播放。

                (4)查看视频的总时长和已播放时长。

                (5)对视频做快进或快退操作。

如何使用MediaController

          下面是MediaController的常用方法说明。

                  setMediaPlayer:设置媒体播放器的对象。

                  setAnchorView:设置绑定的主视图。

                  show:显示媒体控制条。

                  hide:隐藏媒体控制条。

                  isShowing:判断媒体控制条是否正在显示。

                  setPrevNextListeners:设置前一个按钮与后一个按钮的点击监听器。

     注意: setMediaPlayer和setAnchorView只能同时调用其中一个方法。

如何集成VideoView与MediaController

          VideoView与MediaController的集成方式有两种:

               (1). 在布局文件中声明VideoView 视频视图对象的使用步骤不变,即:

                                  1)先调用setVideoPath方法指定视频文件,

                                  2)然后调用setMediaController方法指定控制条,

                                  3)最后调用start方法开始播放。

               (2). 在代码中动态添加VideoView 视频视图对象需要在代码中构建并添加,其余使用步骤同上。

媒体控制条的播放效果

android多媒体(十五)

3.自定义播放控制条

            MediaController只提供基本的播放控制,却无法进行其它个性化的定制,比如以下功能就不支持:

                   (1)控制条分上下两行,上面是控制按钮,下面是进度条,高度太宽了,有碍观瞻;

                   (2)按钮样式无法定制,且不能增加新按钮,也无法删除按钮;

                   (3)进度条与播放时间的样式也不能定制;

视频控制条的定制要求

              自定义的视频控制条需要提供以下控件:

                  (1)一个播放按钮,点击按钮暂停播放,再点击恢复播放;

                  (2)一个拖动条,动态显示当前的播放进度,并允许把视频拖动到指定位置开始播放;

                  (3)两个文本控件,一个显示视频的总时长,另一个显示视频的已播放时长;

如何关联视频视图和视频控制条

             视频控制条的难点在于如何跟VideoView同步当前的播放进度,解决办法如下。

                 (1)对于视频视图向控制条通知播放进度,可以设置定时器持续刷新播放进度;

                 (2)对于控制条向视频视图通知播放动作,可以监听播放按钮的点击事件,以及拖动条的拖动事件,并将事                            件处理结果传给VideoView。

视频控制条的播放效果

android多媒体(十五)

四、多  窗  口

为了实现将屏幕分窗口运行的功能,可采取分屏、画中画、自定义悬浮窗等技术手段,下面分别进行详细介绍。

1.分屏——多窗口模式

            Android从7.0开始推出了分屏功能,也称作多窗口模式。

            比如把竖长的手机屏幕分成上下两个窗口,一边在上面的窗口中观看电影,一边在下面的窗口中聊天。

           按下任务键,屏幕左上角就出现“分屏模式”的按钮,点击该按钮即可启用分屏模式。

android多媒体(十五)

分屏模式的演示效果

android多媒体(十五)

分屏模式的注意事项

           (1) App默认允许分屏模式。

           (2) App页面从全屏模式切换到分屏模式,它的Activity生命周期会经历销毁后重建的过程。

           (3)对于视频播放页面,Activity代码应当在onStop方法中暂停播放,并在onStart方法中恢复播放视频。

           (4)调用isInMultiWindowMode方法可获知当前是否处于分屏模式。

           (5)重载onMultiWindowModeChanged方法,可以实时收到分屏与全屏的切换通知。

2.画中画——特殊的多窗口

           分屏模式之下,分屏的区域是固定的,要么在屏幕的上半部分,要么在屏幕的下半部分,不但尺寸无法调整而且                    还不能拖动。

           Android8.0带来另一种更高级的多窗口模式,号称“Picture in Picture”(简称PIP,即“画中画”)。

         应用一旦进入画中画模式,就会缩小为屏幕上的一个小窗口,该窗口既可拖动还可调整大小,非常适合用来播放视                 频。

画中画模式的注意事项

       (1)App页面从全屏模式切换到画中画模式,它的Activity生命周期也会经历销毁后重建的过程。

        (2)对于视频播放页面,Activity代码应当在onStop方法中暂停播放,并在onStart方法中恢复播放视频。

        (3)调用isInPictureInPictureMode方法可获知当前是否处于画中画模式。

        (4)重载onPictureInPictureModeChanged方法,可以实时收到画中画与全屏的切换通知。

        (5)不能直接把应用拖入画中画,只能通过代码切到画中画。

画中画模式的演示效果

android多媒体(十五)

 

3.自定义悬浮窗

        不管是分屏还是画中画,都存在着局限性:

       (1)一方面窗口的位置和大小比较固定;

       (2)另一方面只有Android7乃至Android8系统才支持。

        要想拥有一种更灵活的窗口形式,并且不受系统版本的限制,就得通过自定义悬浮窗来实现。

如何使用WindowManager(上)

       每个App页面都是一个Window窗口,在手机屏幕上新增或删除页面窗口,都可以归结为WindowManager的管理操                  作。

     下面是WindowManager的常用方法说明:

                 getDefaultDisplay:获取默认的显示屏信息。

                 addView:往窗口添加视图。

                 updateViewLayout:更新指定视图的布局参数。

                 removeView:从窗口移除指定视图。

如何使用WindowManager(下)

      下面是窗口布局参数WindowManager.LayoutParams的属性说明:

                alpha:窗口的透明度。

                gravity:内部视图的对齐方式。

                x和y:分别表示窗口左上角的X坐标和Y坐标。

                width:窗口的宽度。

                height:窗口的高度。

                format:窗口的像素点格式。

                type:窗口的显示类型。

                flags:窗口的行为准则。

悬浮窗与对话框的区别

               自定义的悬浮窗有点类似对话框,它们都是独立于Activity页面的窗口,但是悬浮窗又有一些与众不同的特性,                              例如:

             (1)悬浮窗是可以拖动的,对话框则不可拖动。

             (2)悬浮窗不妨碍用户触摸窗外的区域,对话框则不让用户操作框外的控件。

             (3)悬浮窗独立于Activity页面,即当页面退出后,悬浮窗仍停留在屏幕上;而对话框与Activity页面是共存关                         系,一旦页面退出则对话框也消失了。

悬浮窗的展示效果

android多媒体(十五)

4.截图和录屏

           Android5.0之后开放了屏幕捕捉的API,开发者可以直接调用公开方法来截图与录屏。

          屏幕捕捉的功能由MediaProjectionManager媒体投影管理器实现,主要用途是截图和录屏。

         截图和录屏用到了以下三个工具类:

          (1)图像读取器ImageReader,获得最近的一幅图像数据。

          (2)媒体编码器MediaCodec,把媒体数据编码写入缓冲区。

          (3)媒体转换器MediaMuxer,把缓冲区中的数据进行转换并生成视频文件。

如何使用MediaCodec

      下面是媒体编码器MediaCodec的主要方法说明:

               createEncoderByType:静态函数,根据编码格式构造一个媒体编码器。

               configure:设置媒体编码的参数,包括视频格式、宽高、位率、帧率等。

              createInputSurface:创建一个用于输入的表面对象。

              start:开始给媒体编码。

             dequeueOutputBuffer:给输出缓冲区排队。

             getOutputFormat:获取输出格式。

             getOutputBuffer:根据索引位置获取输出缓冲区的数据。

             releaseOutputBuffer:释放指定索引位置的输出缓冲区。

             stop:停止给媒体编码。

             release:释放媒体编码资源。

如何使用MediaMuxer

            下面是媒体转换器MediaMuxer的主要方法说明:

                    构造函数:根据文件路径与文件格式构造一个媒体转换器。

                   addTrack:把指定格式添加到转换轨道上,并返回轨道的索引位置。

                   start:开始媒体转换工作。

                   writeSampleData:把编码转换后的数据写入索引位置的轨道。

                   stop:停止媒体转换工作。

                   release:释放媒体转换资源。

 

相关文章: