Android--使用开源vitamio做万能视频播放器

简介: 版权声明:本文为博主原创文章,转载请标明出处。 https://blog.csdn.net/chaoyu168/article/details/51180095 Vitamio 是什么?Vitamio 是一款 Android 与 iOS 平台上的全能多媒体开发框架,全面支持硬件解码与 GPU 渲染。
版权声明:本文为博主原创文章,转载请标明出处。 https://blog.csdn.net/chaoyu168/article/details/51180095

Vitamio 是什么?

Vitamio 是一款 Android 与 iOS 平台上的全能多媒体开发框架,全面支持硬件解码与 GPU 渲染。Vitamio 凭借其简洁易用的 API 接口赢得了全球众多开发者的青睐。到目前,全球已经有超过 一万 种应用在使用 Vitamio,覆盖用户超过 5亿 。

Vitamio 能够流畅播放720P甚至1080P高清MKV,FLV,MP4,MOV,TS,RMVB等常见格式的视频,还可以在 Android 与 iOS 上跨平台支持 MMS, RTSP, RTMP, HLS(m3u8) 等常见的多种视频流媒体协议,包括点播与直播。

资源下载:http://download.csdn.net/detail/chaoyu168/9494680

流媒体支持 

Vitamio 支持各种常见的流媒体协议,可以点播或者直播音频和视频,例如如下常见协议均能无缝支持:

  • MMS
  • RTSP (RTP, SDP), RTMP
  • HTTP progressive streaming
  • HLS - HTTP live streaming (M3U8)

音频和视频格式 

Vitamio 使用了 FFmpeg 做为媒体解析器和最主要的解码器,同时开发了针对不同移动平台的硬解码方案,能够完美支持 H.264/AVC、H.263、 MPEG4 等常见的视频编码,覆盖上百种多媒体格式。下表只是一些最常见的视频格式支持,除特殊标明,全部支持硬件加速:

  • DivX/Xvid
  • WMV (一般只有软解码)
  • FLV
  • TS/TP
  • RMVB (只有软解码)
  • MKV
  • MOV
  • M4V
  • AVI
  • MP4
  • 3GP

字幕支持 

Vitamio 对字幕的支持很优秀,包括各种常见外挂字幕与很多视频格式的内嵌字幕,同多个字幕等特性的支持也非常完善。比如:

  • SubRip(.srt)
  • Sub Station Alpha(.ssa) / Advanced Sub Station Alpha(.ass)
  • SAMI(.smi/.sami)
  • MicroDVD(.sub/.txt)
  • SubViewer2.0(.sub)
  • MPL2(.mpl/.txt)
  • Matroska (.mkv) 内置字幕

更多特性 

除了上面列出的常见功能之外,Vitamio 还做了相当多人性化的工作:

  • 多音轨与字幕支持
  • 细致的 CPU 与 GPU 优化
  • 支持手机到平板各种设备
  • 流媒体播放缓冲支持
  • 播放画面比例大小随手调节
  • 自动文字编码检测,拒绝乱码

还有更多新特性没有被列出,请参考开发文档。

导入使用 

1、导入。下载回来后大家可能发现没有.project工程文件,可以通过File -> Import -> Android -> Existing Android Code Into Workspace来导入工程,然后改一下工程名称即可。

2、将VitamioBundle工程作为Android Library引入Demo工程使用即可。

注意:
     如果是Windows用户,请将VitamioBundle与Demo工程放在同一个文件夹下,否则添加Android Library可能失败,其他问题一般clean一下重新编译一下就好了。其他问题请参考错误大全。

Vitamio 4.0 changed API for Android

  1. New API

    ?
    1
    2
    3
    4
    5
    6
    getMetadata()
    getTrackInfo()
    setPlaybackSpeed(<span class = "predefined-type" > float </span> speed)
    setSurface(Surface surface)
    setDataSource(Context context, Uri uri, String headers)
    setAudioAmplify(<span class = "predefined-type" > float </span> ratio)
  2. Changed API

    ?
    1
    2
    3
    4
    OnSubtitleListener -> OnTimedTextListener
    setSubtitleShown -> setTimedTextShown
    setSubtitleShown -> setTimedTextEncoding
    setAudioTrack -> selectTrack()

Vitamio API for Android : MediaPlayer

类概述 

public class MediaPlayer
MediaPlayer可控制播放音乐/视频和网络流。可以从VideoView找到使用这个类的方法。
这个类与android.media.MediaPlayer的作用大部分相同。请参阅开发者指南音频和视频使用MediaPlayer。

常量 

public static final int MEDIA_ERROR_UNKNOWN
播放错误,未知错误。
常量值:0

public static final int MEDIA_ERROR_NOT_VALID_FOR_PROGRESSIVE_PLAYBACK
播放错误(一般视频播放比较慢或视频本身有问题会引发)。
常量值:200

public static final int MEDIA_INFO_VIDEO_TRACK_LAGGING
视频过于复杂,无法解码:不能快速解码帧。此时可能只能正常播放音频。参见MediaPlayer.OnInfoListener。
常量值:700

public static final int MEDIA_INFO_BUFFERING_START
MediaPlayer暂停播放等待缓冲更多数据。
常量值:701

public static final int MEDIA_INFO_BUFFERING_END
MediaPlayer在缓冲完后继续播放。
常量值:702

public static final int MEDIA_INFO_NOT_SEEKABLE
媒体不支持Seek,例如直播流。
常量值:801

public static final int MEDIA_INFO_DOWNLOAD_RATE_CHANGED
av_read_frame()的速度(KB/s)。
常量值:901

public static final int VIDEOQUALITY_LOW
视频质量——流畅。
常量值:-16

public static final int VIDEOQUALITY_MEDIUM
视频质量——普通。
常量值:0

public static final int VIDEOQUALITY_HIGH
视频质量——高质。
常量值:16

public static final int SUBTITLE_INTERNAL
字幕显示来自内置字幕。
常量值:0

public static final int SUBTITLE_EXTERNAL
字幕显示来自外置字幕。
常量值:1

public static final String[] SUB_TYPES
Vitamio支持的外置字幕类型。
常量值:{ “.srt”, “.ssa”, “.smi”, “.txt”, “.sub”, “.ass” }

公共方法
public static final boolean isLibraryLoaded()
动态链接库(so)是否已经成功加载完成。

public void setDisplay(SurfaceHolder sh)
设置用于显示媒体视频的SurfaceHolder。这个调用是可选的。只显示音频而不显示视频时不调用这个方法(例如后台播放)。
参数
sh 用户显示视频的SurfaceHolder

public void setDataSource(Context context, Uri uri)
设置多媒体数据源,例如context Uri。(支持raw资源访问,例如:android.resource://com.your.package/R.raw.your_resource_id)
参数
context 获取ContentResolver时要使用的Context
uri 你要播放的uri
异常
IllegalArgumentException 状态无效时引发(uri或context为空时引发)

public native void setDataSource(String path)
设置数据源(文件路径或http/rtsp/mms URL)。

public native void setDataSource(FileDescriptor fd)
设置数据源(FileDescriptor)。调用者在调用后要自行关闭FileDescriptor,最安全的做法是一返回就马上关闭。

public native void prepare()
预处理播放器为播放做准备,方法是同步执行。
设置完数据源和显示的Surface后,你需要调用prepare()或prepareAsync()。对于文件,你可以直到媒体播放器准备播放时再调用prepare。

public native void prepareAsync()
预处理播放器为播放做准备,方法是异步执行。
设置完数据源和显示的Surface后,你需要调用prepare()或prepareAsync()。对于流,你应该调用prepareAsync(),立即返回,而不是阻塞,直到足够的数据被缓冲。

public void start()
开始或继续播放。如果此前已暂停播放,那么就从暂停的地方播放。如果已经停止播放或还未开始播放,播放将从头开始。

public void stop()
与pause()相同。

public void pause()
暂停播放。调用start()恢复。

public void setWakeMode(Context context, int mode)
设置MediaPlayer的底层电源管理。可以在MediaPlayer没有通过SurfaceHolder 设置setDisplay播放时使用,从而使用高级别的setScreenOnWhilePlaying特性。
本方法在MediaPlayer访问低级别电源管理控制设备电源时使用。参数是一个android.os.PowerManager唤醒组合标识。使用这个方法需要WAKE_LOCK权限。默认情况下不使用以保持设备唤醒播放。
参数
context
mode 设置PowerManger电源/锁定模式

public void setScreenOnWhilePlaying(boolean screenOn)
控制是否使用附加SurfaceHolder保持屏幕高亮持续播放视频。本方法可能优于使用setWakeMode,因为它不需要应用程序访问底层唤醒锁的权限。
参数
screenOn 设置true将保持屏幕高亮,反之允许它关闭。

public native int getVideoWidth()
获取视频宽度。
返回值
返回视频的宽度,没有视频或宽度尚未确定时返回0。可以通过注册OnVideoSizeChangedListener当宽度有效时获得一个通知。

public native int getVideoHeight()
获取视频高度。
返回值
返回视频的高度,没有视频或高度尚未确定时返回0。可以通过注册OnVideoSizeChangedListener当高度有效时获得一个通知。

public native boolean isPlaying()
检测MediaPlayer是否正在播放。

public native void seekTo(long msec)
设置到指定时间位置播放。
参数
msec 从开始位置到msec的偏移量(以毫秒为单位)
异常
IllegalStateException 内部播放引擎未初始化引发

public native long getCurrentPosition()
获取当前播放位置。

public native Bitmap getCurrentFrame()
获取当前视频帧。(可用于截图)

public native long getDuration()
获取多媒体播放持续时间。

public void release()
释放与MediaPlayer相关的资源。当你使用完MediaPlayer完后调用此方法是一个好的编程习惯。

public void reset()
复位(reset)MediaPlayer至未初始化状态。调用此方法后,你需要再次设置数据源,并通过prepare()来初始化。

public native void setVolume(float leftVolume, float rightVolume))
设置音量。(范围0.0~1.0之间)

public void setOnPreparedListener(OnPreparedListener listener))
注册一个回调函数,在视频预处理完成后调用。

public void setOnCompletionListener(OnCompletionListener l)
注册一个回调函数,视频播放完成后调用。

public void setOnErrorListener(OnErrorListener l)
注册一个回调函数,在异步操作调用过程中发生错误时调用。例如视频打开失败。

public void setOnBufferingUpdateListener(OnBufferingUpdateListener l)
注册一个回调函数,在网络视频流缓冲变化时调用。

public void setOnSeekCompleteListener(OnSeekCompleteListener l)
注册一个回调函数,在seek操作完成后调用。

public void setOnVideoSizeChangedListener(OnVideoSizeChangedListener listener)
注册一个回调函数,在视频大小已知或更新后调用。

public void setOnSubtitleUpdateListener(OnSubtitleUpdateListener l)
注册一个回调函数,在字幕需要显示时调用。

public void setOnInfoListener(OnInfoListener l)
注册一个回调函数,在有警告或错误信息时调用。例如:开始缓冲、缓冲结束、下载速度变化。

public void releaseDisplay()
在播放音频的时候调用这个有效果。

public native float getVideoAspectRatio()
获取视频宽高比例。
返回值
返回视频的宽高比。没有视频或者宽高不正确返回0。参见VideoView.setVideoLayout。

public native void setVideoQuality(int quality)
设置视频质量。如果播放延迟比较严重,你可以尝试使用VIDEOQUALITY_LOW(流畅),默认VIDEOQUALITY_LOW(流畅)。
参数
quality 参见MediaPlayer的常量:VIDEOQUALITY_LOW(流畅)、VIDEOQUALITY_MEDIUM(普通)、VIDEOQUALITY_HIGH(高质)。

public native void setDeinterlace(boolean deinterlace)
设置视频反交错。

public native void setBufferSize(int bufSize)
设置视频缓冲大小(默认1024KB)单位Byte。

public native boolean isBuffering()
检测是否缓冲完毕。

public native int getBufferProgress()
参见OnBufferingUpdateListener。

public native void setMetaEncoding(String encoding)
设置元数据编码。例如:UTF-8

public native String getMetaEncoding()
获取元数据编码。

public HashMap getAudioTrackMap(String encoding)
获取视频中嵌入的音轨。例如:English

public native int getAudioTrack()
设置播放音轨编号。

public native void setAudioTrack(int audioIndex)
设置音轨编号,必须使用getAudioTrackMap的返回值。

public void setInitialAudioTrack(int audioIndex)
设置初始化音轨。

public void setInitialSubTrack(int subIndex)
设置初始化字幕。

public native void setSubShown(boolean shown)
设置是否显示字幕。
参数
shown true表示显示字幕

public native void setSubEncoding(String encoding)
设置字幕编码。
参数
encoding 字幕编码。如果为null将自动检测。

public native int getSubLocation()
获取字幕位置类型。0为内嵌字幕,1为外挂字幕。

public native void setSubPath(String subPath)
设置外挂字幕路径。必须是本地文件路径。

public native String getSubPath()
获取外挂字幕路径。

public native void setSubTrack(int trackId)
设置字幕编号。必须是getSubTrackMap的返回值。

public native int getSubTrack()
获取字幕编号。

public HashMap getSubTrackMap(String encoding)
获取视频内嵌字幕集合。
参数
encoding 格式化字符串编码。如果为null将自动检测。
返回值
返回字幕名称和字幕编号组成的Map。

受保护方法 

protected void finalize()
调用了native_finalize。


MediaPlayer内部接口 

public interface OnBufferingUpdateListener
void onBufferingUpdate(MediaPlayer mp, int percent)
更新流媒体缓存状态。
参数
mp 要更新的MediaPlayer
percent 已缓冲的百分比数(0 ~ 100)

public interface OnErrorListener
boolean onError(MediaPlayer mp, int what, int extra)
错误信息。
参数
mp 错误相关的MediaPlayer
what 错误类型,参见MEDIA_ERROR_UNKNOWN、MEDIA_ERROR_NOT_VALID_FOR_PROGRESSIVE_PLAYBACK
extra 额外具体的错误code。通常依赖于实现。
返回值
如果处理了错误返回true,否则返回false。返回false或没有设置OnErrorListener将引发OnCompletionListener被调用。

public interface OnInfoListener
boolean onInfo(MediaPlayer mp, int what, int extra)
信息或警告。
参数
mp 信息相关的MediaPlayer
what 信息或警告类型,参见MEDIA_INFO_VIDEO_TRACK_LAGGING、MEDIA_INFO_BUFFERING_START、MEDIA_INFO_BUFFERING_END、MEDIA_INFO_NOT_SEEKABLE、MEDIA_INFO_DOWNLOAD_RATE_CHANGED
extra 额外具体的信息code。通常依赖于实现。

返回值
如果处理了错误返回true,否则返回false。返回false或没有设置OnInfoListener将丢弃信息或警告。

public interface OnSubtitleUpdateListener
public void onSubtitleUpdate(String text)
需要显示文字字幕。

public void onSubtitleUpdate(byte[] pixels, int width, int height)
需要显示图片字幕。
参数
pixels 图片字幕像素
width 图片字幕宽度
height 图片字幕高度

Vitamio API for Android: VideoView

类概述 

public class VideoView extends SurfaceView implements MediaController.MediaPlayerControl
用于播放视频文件。VideoView可以加载各种来源的图像(如资源或ContentProvider),注意计算视频尺寸,以便在任意布局管理器中使用,它还提供了诸如缩放等显示选项。
VideoView也提供封装了许多MediaPlayer的方法,例如getVideoWidth、setSubShown。

常量 

public static final int VIDEO_LAYOUT_ORIGIN
缩放参数,原始画面大小。
常量值:0

public static final int VIDEO_LAYOUT_SCALE
缩放参数,画面全屏。
常量值:1

public static final int VIDEO_LAYOUT_STRETCH
缩放参数,画面拉伸。
常量值:2

public static final int VIDEO_LAYOUT_ZOOM
缩放参数,画面裁剪。
常量值:3

公共方法 

public void setVideoLayout(int layout, float aspectRatio)
获取扫描视频的Uri。
参数
layout 缩放参数
aspectRation 宽高比,为0将自动检测。

public boolean isValid()
Surface是否有效。 参见Surface的isValid方法。

public void setVideoPath(String path)
设置视频路径。

public void setVideoURI(Uri uri)
设置视频URI。(可以是网络视频地址)

public void stopPlayback()
停止视频播放,并释放资源。

public void setMediaController(MediaController controller)
设置媒体控制器。
参数
controller 媒体控制器,注意是io.vov.vitamio.widget.MediaController。

public void setOnPreparedListener(OnPreparedListener l)
注册一个回调函数,在视频预处理完成后调用。在视频预处理完成后被调用。此时视频的宽度、高度、宽高比信息已经获取到,此时可调用seekTo让视频从指定位置开始播放。

public void setOnCompletionListener(OnCompletionListener l)
注册一个回调函数,视频播放完成后调用。

public void setOnErrorListener(OnErrorListener l)
注册一个回调函数,在异步操作调用过程中发生错误时调用。例如视频打开失败。

public void setOnBufferingUpdateListener(OnBufferingUpdateListener l)
注册一个回调函数,在网络视频流缓冲变化时调用。

public void setOnSeekCompleteListener(OnSeekCompleteListener l)
注册一个回调函数,在seek操作完成后调用。

public void setOnSubtitleUpdateListener(OnSubtitleUpdateListener l)
注册一个回调函数,在字幕需要显示时调用。

public void setOnInfoListener(OnInfoListener l)
注册一个回调函数,在有警告或错误信息时调用。例如:开始缓冲、缓冲结束、下载速度变化。

public boolean onTouchEvent(MotionEvent ev)
处理显示/隐藏MediaController。

public void start()
开始播放。

public void pause()
暂停播放。

public void suspend()
挂起(暂时没有实现功能)

public void resume()
恢复播放。

public long getDuration()
获取视频播放时长。

public long getCurrentPosition()
获取当前播放位置。

public void seekTo(long msec)
设置播放位置。
参数
msec 位置

public boolean isPlaying()
是否正在播放。

public int getBufferPercentage()
获取缓冲百分比。

public void setVolume(float leftVolume, float rightVolume)
设置音量。
参数
leftVolume 左声道
rightVolume 右声道

public int getVideoWidth()
获取视频宽度。

public int getVideoHeight()
获取视频高度。

public float getVideoAspectRatio()
设置视频宽高比例。没有视频或者宽高不正确返回0。

public void setVideoQuality(int quality)
设置视频质量。
参数
quality 参见MediaPlayer的常量:VIDEOQUALITY_LOW(流畅)、VIDEOQUALITY_MEDIUM(普通)、VIDEOQUALITY_HIGH(高质)。

public void setBufferSize(int bufSize)
设置视频缓冲大小(默认1024KB)单位Byte。

public boolean isBuffering()
检测是否缓冲完毕。

public void setMetaEncoding(String encoding)
设置元数据编码。例如:UTF-8

public String getMetaEncoding()
获取元数据编码。

public HashMap getAudioTrackMap(String encoding)
获取视频中嵌入的音轨。例如:English

public int getAudioTrack()
设置播放音轨编号。

public void setAudioTrack(int audioIndex)
设置音轨编号,必须使用getAudioTrackMap的返回值。

public void setSubShown(boolean shown)
设置是否显示字幕。
参数
shown true表示显示字幕

public void setSubEncoding(String encoding)
设置字幕编码。
参数
encoding 字幕编码。如果为null将自动检测。

public int getSubLocation()
获取字幕位置类型。0为内嵌字幕,1为外挂字幕。

public void setSubPath(String subPath)
设置外挂字幕路径。必须是本地文件路径。

public String getSubPath()
获取外挂字幕路径。

public void setSubTrack(int trackId)
设置字幕编号。必须是getSubTrackMap的返回值。

public int getSubTrack()
获取字幕编号。

public HashMap getSubTrackMap(String encoding)
获取视频内嵌字幕集合。
参数
encoding 格式化字符串编码。如果为null将自动检测。
返回值
返回字幕名称和字幕编号组成的Map。

public boolean canPause()
是否可暂停。(暂时没有实现功能)

public boolean canSeekBackward()
(暂时没有实现功能)

public boolean canSeekForward()
(暂时没有实现功能)

受保护方法 

protected boolean isInPlaybackState()
是否处于正在播放的状态。


目录
相关文章
|
7月前
|
XML Android开发 数据安全/隐私保护
Android 自定义开源库 EasyView
Android 自定义开源库 EasyView
|
Java API Android开发
Android TV 开发之 TV视频播放器(上)
Android TV 开发之 TV视频播放器(上)
1014 0
Android TV 开发之 TV视频播放器(上)
|
4月前
|
监控 Java API
Android经典实战之OkDownload:一个经典强大的文件下载开源库,支持断点续传
本文介绍的 OkDownload 是一个专为 Android 设计的开源下载框架,支持多线程下载、断点续传和任务队列管理等功能,具备可靠性、灵活性和高性能特点。它提供了多种配置选项和监听器,便于开发者集成和扩展。尽管已多年未更新,但依然适用于大多数文件下载需求。
381 1
|
6月前
|
存储 API 开发工具
kotlin安卓开发,如何获取设备的唯一id, 有哪些开源库
在Kotlin的Android开发中,获取设备唯一ID的方法包括不稳定的ANDROID_ID、需要权限的IMEI、使用UUID与SharedPreference结合,以及考虑隐私的Firebase Installations ID和Advertising ID。由于隐私问题和Google Play政策,IMEI和ANDROID_ID不推荐作为长期唯一标识。推荐使用UUID(首次安装时生成并存储),或在涉及广告时使用Advertising ID(需用户同意),而Firebase Installations ID则提供了一种合规的设备标识选项。在选择方法时,必须遵守隐私指南和政策。
|
小程序 JavaScript API
支付宝微信小程序连接蓝牙兼容IOS和安卓(开源)
支付宝微信小程序连接蓝牙兼容IOS和安卓(开源)
205 0
|
Android开发
Android图片加载开源库对比
Android图片加载开源库对比
109 0
|
Java 测试技术 Android开发
Sonic 开源移动端云真机测试平台 - 设备中心接入安卓设备实例演示,Agent端服务部署过程详解(下)
Sonic 开源移动端云真机测试平台 - 设备中心接入安卓设备实例演示,Agent端服务部署过程详解
424 0
|
Web App开发 JavaScript Java
Sonic 开源移动端云真机测试平台 - 设备中心接入安卓设备实例演示,Agent端服务部署过程详解(上)
Sonic 开源移动端云真机测试平台 - 设备中心接入安卓设备实例演示,Agent端服务部署过程详解
506 0
|
存储 ARouter Java
Android开源系列-组件化框架Arouter-(三)APT技术详解
最近组里需要进行**组件化框架**的改造,用到了**ARouter**这个开源框架,为了更好的对项目进行改造,笔者花了一些时间去了解了下ARouter
|
存储 缓存 ARouter
Android开源系列-组件化框架Arouter-(二)深度原理解析
最近组里需要进行**组件化框架**的改造,用到了**ARouter**这个开源框架,为了更好的对项目进行改造,笔者花了一些时间去了解了下ARouter