android平台视频框架小调研笔记

视频传输协议


  1. DASH
    Dynamic Adaptive Streaming over HTTP,基于HTTP的动态自适应流
    例子:优酷土豆之类的视频网站的PC在线视频基本上都是 http + mp4 或者 http + flv/f4v... ,使用flash播放器,编码H264
    HTTP progressive streaming
    客户端需要在硬盘上缓存所有前面已经下载的媒体数据,对本地存储空间的需求较大。播放过程中用户只能在前面已经下载媒体数据的时间范围内进行进度条搜索和快进、快退等操作,而无法在整个媒体文件时间范围内执行这些操作。

  2. RTP/RTSP
    RTSP/RTP是目前业界最为流行和广为采用的实时流媒体协议。它实际上由一组在IETF中标准化的协议所组成,包括RTSP(实时流媒体会话协议),
    SDP(会话描述协议),RTP(实时传输协议),以及针对不同编解码标准的RTP净载格式等,共同协作来构成一个流媒体协议栈。
    例子:芒果TV在线

  3. HLS
    HTTP Live Streaming允许内容提供者通过普通Web服务器向上述客户端提供接近实时的音视频流媒体服务,包括直播和点播。HTTP Live Streaming支持将同一节目编码为不同码率的多个替换流,客户端软件可以根据网络带宽的变化在这些不同码率的替换流之间进行智能切换。此外,HTTP Live Streaming还支持通过媒体加密和用户认证等方式来达到媒体版权保护。
    例子:手机上的一些视频播放

  4. 在一篇文章里找了一张表,列举出了这几种传输协议的特点如下

android平台视频框架小调研笔记_第1张图片
传输协议对比

视频编码##


视频流传输中最为重要的编解码标准有国际电联的H.261、H.263、H.264,运动静止图像专家组的M-JPEG和国际标准化组织运动图像专家组的MPEG系列标准,此外在互联网上被广泛应用的还有Real-Networks的RealVideo、微软公司的WMV以及Apple公司的QuickTime等。

Vitamio


支持协议

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

音频和视频格式

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

其他特性

支持Android2.1+
字幕支持,支持多种格式的外挂字幕
流媒体播放缓冲支持
播放画面比例大小随手调节
细致的 CPU 与 GPU 优化

某些优缺点

体积太。可能是因为它对本地视频的播放做了很多工作(比方说字幕的支持,多音轨的支持,CPU 与 GPU 优化),所以如果想要用它来做在线视频播放的框架的话,应该把它某些针对于本地播放的优化给砍掉(个人看法)。

支持2.1及以上的android版本。比其他的一些库支持的范围广(如 ExoPlayer和ijkplayer,依赖Android的 MediaCodec接口,该接口发布于Android4.1。因此它们不能工作于之前的Android版本),但这个可能算不上突出的优点,因为还在用2.x的版本的人已经很少了而且会越来越少。

不支持视频缩略图。
不支持两个视频同时播放。

有一个Vitamio不支持特性列表在这。

Bug
1、我在写demo的时候,发现当targetSdkVersion设定为23时候,程序一定会崩溃,出现LOAD FFMPEG ERROR: dlopen failed: libffmpeg.so: has text relocations的错误。当把targetSdkVersion设定为22及以下的时候,就不会出现问题。这个bug在issue#312和issue#323出现过。在最新版本Vitamio5.0.1中仍然存在该问题。

2、当拖动的视频的时候,偶有声音与画面出现不同步的情况。我自己也出现过。在issue#269中有类似描述。

3、一些其他rtsp和hls时候出现问题。没细看。

大小
jniLibs里面的.so文件普遍比较大,最大的x86的libffmpeg.so有7.2M,最小的armeabi-v7a的libffmpeg.so也有4.91M

总大小视不同的平台而定,普遍在6M-9M之间。
x86:9M
arm64-v8a:7.9M
armeabi-v7a:6.5M
...

使用方法

我拿官方给的sample看了一下,其使用方法同Android本身的MediaPlayer用法很类似。
vitamio本身封装了一个VideoView,方便使用,直接设置视频路径就行了。
mVideoView.setVideoPath(path); mVideoView.setMediaController(new MediaController(this));

当然也可以直接使用MediaPlayer,这样就需要在外面套一层TextureView或者SurfaceView。
io.vov.vitamio包下的MediaPlayer的方法大致有:
public void setDataSource(String path) 这个DataSource 可以是一个文件路径或一个 http/rtsp URL
public native void prepare()
public native void prepareAsync()
public void start()
public void stop()
public void pause()
public native void seekTo(long msec)
public void release()
public void reset()
......

还有一些常用接口,例如:

`private OnHWRenderFailedListener `
`private interface OnPreparedListener` 
`private interface OnCompletionListener` 
`private interface OnBufferingUpdateListener` 
`private interface OnCachingUpdateListener `
`private interface OnSeekCompleteListener` 
`private interface OnVideoSizeChangedListener`
`private interface OnErrorListener`

可以看到,上面列举的基本上与Android本身的MediaPlayer是差不多的。
所以使用方法也差不多。比如要播放一个视频,用一下的代码段就可以简单的实现:

`mMediaPlayer = new MediaPlayer(this);  
mMediaPlayer.setDataSource(path);  
mMediaPlayer.setDisplay(holder);  
mMediaPlayer.prepareAsync(); `

我找了一些本地视频和在线视频来播放试了一下,基本上都可以播放出来。有少数放不了的应该是其他原因(比如网络不好)。

ExoPlayer


支持协议

RTSP (RTP, SDP), RTMP
由于android自身就支持RTSP,所以ExoPlayer自然就支持HTTP progressive streaming/DASH Smooth Streaming

HLS
支持高级的HLS特性,例如正确处理 EXT-X-DISCONTINUITY 标签

可以看到,ExoPlayer基本上也都支持市面上常规的传输协议。

音频和视频格式

在ExoPlayer主页的列表里可以查到所支持的格式,看上去没有Vitamio所支持的广泛,但是我想rmvb这种格式都是本地播放的,在线播放也不用这样的格式,所以这些格式不支持也没什么关系。

3GPP (.3gp)
MPEG-4 (.mp4)
MPEG-TS (.ts, AAC 只支持音频, Android 3.0+)
Matroska (.mkv, Android 4.0+)
WebM (.webm)
MPEG-PS (Android 3.0+)
OGG
FLV
WAV
mov(这个在列表上没有看到,但是我自己试了一下,是可以的)

其他特性

ExoPlayer的音频和视频组件依赖Android的 MediaCodec接口,该接口发布于Android4.1(API 等级16)。因此它不能工作于之前的Android版本。
便于随着App的升级而升级。因为ExoPlayer是一个包含在你的应用中的库,对于你使用哪个版本有完全的控制权,并且你可以简单的跟随应用的升级而升级

ExoPlayer可以支持DRM技术,Digital Rights Managment (DRM)数字版权管理。

ExoPlayer 支持一些 Android MediaPlayer API 无法提供的特性,包括 DASH 和 SmoothStreaming 自适应回放,持久的高速缓存和自定义渲染器。

它使用了一些额外的库,有okhttp,Hamcrest,okio,objenesis,dexmaker

大小

由于直接依赖Android的 MediaCodec接口,所以没有额外的jniLib,体积比Vitamio要小一些,具体约是 4.5M,包括1.87M(exoplayer自身大小)+2.59M(它使用的一些其他的库的和)。

Bug
1、声音与画面不同步。我这里发现过一次。发现在issue#1416中有类似描述。
2、拖动视频进度条的后,屏幕出现类似马赛克的雪花点。

使用方法

看了一下ExoPlayer项目的demo中的PlayerActivity和DemoPlayer,其中详细的示范了如何使用ExoPlayer来进行视频播放。ExoPlayer中有三个重要的部分,TrackRender,SampleSource和DataSource,这些在ExoPlayer的Developer guide里面有详细描述。我今天看了一点,还没看完看明白,这个接下来再看一下。先把大致的脉络捋了一下。Developer guide有一个中文翻译版本在这。

用标准的TrackRenderer 实现视频,音频播放需要的步骤大致有:

player = ExoPlayer.Factory.newInstance(RENDERER_COUNT);//1.初始化播放器
MediaCodecVideoTrackRender videoRender = ...
MediaCodecAudioTrackRender audioRender = ...//2.构建渲染器
player.prepare(videoRender,audioRender);//3.通过prepare注入渲染器
 player.sendMessage(videoRender,MediaCodecVideoTrackRenderer.MSG_SET_SURFACE,surface);//4.将surface传递到渲染器
player.setPlayWhenReady(true);//5.开始播放
....
player.release(); //当播放完成,释放

ExoPlayer库提供MediaCodecVideoTrackRenderer作为默认的实现用于渲染视频,MediaCodecAudioTrackRender渲染音频。两种实现都是利用Android的 MediaCodec去解码每个媒体样本。

vlc-android


支持协议支持的音频和视频格式 与上面的两个框架差不多,基本上常见的都支持。没有什么特殊的。

大小
jniLibs里面的.so比vitamio的还要大。不同平台不同版本的总大小在11-14M左右。

特性
字幕支持,包括ASS 和 DVD 字幕
多声道,多字幕
支持多核解码
支持开启全硬件加速
支持手势控制,耳机控制
声音均衡器

问题
我发现在android上,用这个框架进行自己的开发的项目没有上面两种框架多,相关资料和问题都很少。
api经常变

几个框架的一些比较


Vitamio ExoPlayer vlc-android
支持协议 MMS、RTSP 、HTTP、HLS RTSP 、HTTP、HLS RTSP 、HTTP、HLS
支持格式 3gp、mp4、mp4、mkv
webm、FLV、WAV、AVI
3gp、mp4、mp4、mkv
webm、FLV、WAV
3gp、mp4、mp4、mkv
webm、FLV、WAV、AVI
体积 不同平台6M-9M 约4.5M 不同平台11M-14M
bug 1、targetSdkVersion设定为23时一定会崩溃
2、拖动的视频的时候,偶有声音与画面出现不同步
1、声音与画面不同步
2、拖动视频进度条现类似马赛克的雪花点
暂未发现
封装程度 有直接封装好的VideoView使用
也可以与TextureView或SurfaceView结合
需要与TextureView或SurfaceView结合 有直接封装好的VideoView使用,也可以与TextureView或SurfaceView结合
其他 使用自身的.so文件,支持android2.1+ 1、依赖 MediaCodec接口,支持android4.1+
2、依赖于okhttp,Hamcrest,okio,objenesis,dexmaker
使用自身的.so文件,支持android2.2+

bug列表有待增加,上面列出的bug均在我的手机上复现过。有些bug的具体的描述见上文每个框架条目下的BUG项及其给出的issue链接。

To Be Continue...

你可能感兴趣的:(android平台视频框架小调研笔记)