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. 在一篇文章里找了一张表,列举出了这几种传输协议的特点如下

传输协议对比

视频编码##


视频流传输中最为重要的编解码标准有国际电联的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#312issue#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...

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 194,524评论 5 460
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 81,869评论 2 371
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 141,813评论 0 320
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 52,210评论 1 263
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 61,085评论 4 355
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 46,117评论 1 272
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 36,533评论 3 381
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 35,219评论 0 253
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 39,487评论 1 290
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 34,582评论 2 309
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 36,362评论 1 326
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 32,218评论 3 312
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 37,589评论 3 299
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 28,899评论 0 17
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 30,176评论 1 250
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 41,503评论 2 341
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 40,707评论 2 335

推荐阅读更多精彩内容

  • Android 自定义View的各种姿势1 Activity的显示之ViewRootImpl详解 Activity...
    passiontim阅读 171,059评论 25 707
  • RTSP SDP RTP/RTCP 介绍应用层 RTSP、SDP; 传输层 RTP、TCP、UDP; 网络层 IP...
    Atom_Woo阅读 3,787评论 0 7
  • 前言 随着音视频领域的火热,在很多领域(教育,游戏,娱乐,体育,跑步,餐饮,音乐等)尝试做音视频直播/点播功能,那...
    passiontim阅读 3,244评论 1 46
  • 我就想睡一会儿,闭会眼。用得着这么着急嘛?我又不是不在了… 毕业后,还会像从前一样对嘛?我们会去一个城市。会...
    homies阅读 180评论 1 2
  • 姓名:巢环环 公司:宁波大发化纤有限公司 期数:第264期六项精进 组名:努力一组 【日精进打卡第50天】共50天...
    巢环环阅读 179评论 0 0