視頻傳輸協(xié)議
DASH
Dynamic Adaptive Streaming over HTTP,基于HTTP的動態(tài)自適應(yīng)流
例子:優(yōu)酷土豆之類的視頻網(wǎng)站的PC在線視頻基本上都是 http + mp4 或者 http + flv/f4v... 赏廓,使用flash播放器涵紊,編碼H264
HTTP progressive streaming
客戶端需要在硬盤上緩存所有前面已經(jīng)下載的媒體數(shù)據(jù),對本地存儲空間的需求較大幔摸。播放過程中用戶只能在前面已經(jīng)下載媒體數(shù)據(jù)的時間范圍內(nèi)進行進度條搜索和快進摸柄、快退等操作,而無法在整個媒體文件時間范圍內(nèi)執(zhí)行這些操作抚太。RTP/RTSP
RTSP/RTP是目前業(yè)界最為流行和廣為采用的實時流媒體協(xié)議塘幅。它實際上由一組在IETF中標準化的協(xié)議所組成,包括RTSP(實時流媒體會話協(xié)議)尿贫,
SDP(會話描述協(xié)議)电媳,RTP(實時傳輸協(xié)議),以及針對不同編解碼標準的RTP凈載格式等庆亡,共同協(xié)作來構(gòu)成一個流媒體協(xié)議棧匾乓。
例子:芒果TV在線HLS
HTTP Live Streaming允許內(nèi)容提供者通過普通Web服務(wù)器向上述客戶端提供接近實時的音視頻流媒體服務(wù),包括直播和點播又谋。HTTP Live Streaming支持將同一節(jié)目編碼為不同碼率的多個替換流拼缝,客戶端軟件可以根據(jù)網(wǎng)絡(luò)帶寬的變化在這些不同碼率的替換流之間進行智能切換。此外彰亥,HTTP Live Streaming還支持通過媒體加密和用戶認證等方式來達到媒體版權(quán)保護咧七。
例子:手機上的一些視頻播放在一篇文章里找了一張表,列舉出了這幾種傳輸協(xié)議的特點如下
視頻編碼##
視頻流傳輸中最為重要的編解碼標準有國際電聯(lián)的H.261任斋、H.263继阻、H.264,運動靜止圖像專家組的M-JPEG和國際標準化組織運動圖像專家組的MPEG系列標準废酷,此外在互聯(lián)網(wǎng)上被廣泛應(yīng)用的還有Real-Networks的RealVideo瘟檩、微軟公司的WMV以及Apple公司的QuickTime等。
Vitamio
支持協(xié)議
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+
字幕支持澈蟆,支持多種格式的外掛字幕
流媒體播放緩沖支持
播放畫面比例大小隨手調(diào)節(jié)
細致的 CPU 與 GPU 優(yōu)化
某些優(yōu)缺點
體積太墨辛。可能是因為它對本地視頻的播放做了很多工作(比方說字幕的支持趴俘,多音軌的支持睹簇,CPU 與 GPU 優(yōu)化)奏赘,所以如果想要用它來做在線視頻播放的框架的話,應(yīng)該把它某些針對于本地播放的優(yōu)化給砍掉(個人看法)带膀。
支持2.1及以上的android版本志珍。比其他的一些庫支持的范圍廣(如 ExoPlayer和ijkplayer,依賴Android的 MediaCodec接口垛叨,該接口發(fā)布于Android4.1。因此它們不能工作于之前的Android版本),但這個可能算不上突出的優(yōu)點柜某,因為還在用2.x的版本的人已經(jīng)很少了而且會越來越少嗽元。
不支持視頻縮略圖。
不支持兩個視頻同時播放喂击。
有一個Vitamio不支持特性列表在這剂癌。
Bug
1、我在寫demo的時候翰绊,發(fā)現(xiàn)當targetSdkVersion設(shè)定為23時候佩谷,程序一定會崩潰,出現(xiàn)LOAD FFMPEG ERROR: dlopen failed: libffmpeg.so: has text relocations
的錯誤监嗜。當把targetSdkVersion設(shè)定為22及以下的時候谐檀,就不會出現(xiàn)問題。這個bug在issue#312和issue#323出現(xiàn)過裁奇。在最新版本Vitamio5.0.1中仍然存在該問題桐猬。
2、當拖動的視頻的時候刽肠,偶有聲音與畫面出現(xiàn)不同步的情況溃肪。我自己也出現(xiàn)過。在issue#269中有類似描述音五。
3惫撰、一些其他rtsp和hls時候出現(xiàn)問題。沒細看躺涝。
大小
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棍郎,方便使用,直接設(shè)置視頻路徑就行了银室。
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是差不多的汽抚。
所以使用方法也差不多。比如要播放一個視頻伯病,用一下的代碼段就可以簡單的實現(xiàn):
`mMediaPlayer = new MediaPlayer(this);
mMediaPlayer.setDataSource(path);
mMediaPlayer.setDisplay(holder);
mMediaPlayer.prepareAsync(); `
我找了一些本地視頻和在線視頻來播放試了一下造烁,基本上都可以播放出來。有少數(shù)放不了的應(yīng)該是其他原因(比如網(wǎng)絡(luò)不好)午笛。
ExoPlayer
支持協(xié)議
RTSP (RTP, SDP), RTMP
由于android自身就支持RTSP惭蟋,所以ExoPlayer自然就支持HTTP progressive streaming/DASH Smooth Streaming
HLS
支持高級的HLS特性,例如正確處理 EXT-X-DISCONTINUITY 標簽
可以看到药磺,ExoPlayer基本上也都支持市面上常規(guī)的傳輸協(xié)議告组。
音頻和視頻格式
在ExoPlayer主頁的列表里可以查到所支持的格式,看上去沒有Vitamio所支持的廣泛癌佩,但是我想rmvb這種格式都是本地播放的木缝,在線播放也不用這樣的格式,所以這些格式不支持也沒什么關(guān)系围辙。
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接口酌畜,該接口發(fā)布于Android4.1(API 等級16)怎囚。因此它不能工作于之前的Android版本。
便于隨著App的升級而升級桥胞。因為ExoPlayer是一個包含在你的應(yīng)用中的庫恳守,對于你使用哪個版本有完全的控制權(quán),并且你可以簡單的跟隨應(yīng)用的升級而升級
ExoPlayer可以支持DRM技術(shù),Digital Rights Managment (DRM)數(shù)字版權(quán)管理贩虾。
ExoPlayer 支持一些 Android MediaPlayer API 無法提供的特性催烘,包括 DASH 和 SmoothStreaming 自適應(yīng)回放,持久的高速緩存和自定義渲染器缎罢。
它使用了一些額外的庫伊群,有okhttp,Hamcrest策精,okio舰始,objenesis,dexmaker
大小
由于直接依賴Android的 MediaCodec接口咽袜,所以沒有額外的jniLib丸卷,體積比Vitamio要小一些,具體約是 4.5M询刹,包括1.87M(exoplayer自身大忻占怠)+2.59M(它使用的一些其他的庫的和)萎坷。
Bug
1、聲音與畫面不同步沐兰。我這里發(fā)現(xiàn)過一次哆档。發(fā)現(xiàn)在issue#1416中有類似描述。
2住闯、拖動視頻進度條的后瓜浸,屏幕出現(xiàn)類似馬賽克的雪花點。
使用方法
看了一下ExoPlayer項目的demo中的PlayerActivity和DemoPlayer比原,其中詳細的示范了如何使用ExoPlayer來進行視頻播放斟叼。ExoPlayer中有三個重要的部分,TrackRender,SampleSource和DataSource春寿,這些在ExoPlayer的Developer guide里面有詳細描述。我今天看了一點忽孽,還沒看完看明白绑改,這個接下來再看一下。先把大致的脈絡(luò)捋了一下兄一。Developer guide有一個中文翻譯版本在這厘线。
用標準的TrackRenderer 實現(xiàn)視頻,音頻播放需要的步驟大致有:
player = ExoPlayer.Factory.newInstance(RENDERER_COUNT);//1.初始化播放器
MediaCodecVideoTrackRender videoRender = ...
MediaCodecAudioTrackRender audioRender = ...//2.構(gòu)建渲染器
player.prepare(videoRender,audioRender);//3.通過prepare注入渲染器
player.sendMessage(videoRender,MediaCodecVideoTrackRenderer.MSG_SET_SURFACE,surface);//4.將surface傳遞到渲染器
player.setPlayWhenReady(true);//5.開始播放
....
player.release(); //當播放完成出革,釋放
ExoPlayer庫提供MediaCodecVideoTrackRenderer作為默認的實現(xiàn)用于渲染視頻造壮,MediaCodecAudioTrackRender渲染音頻。兩種實現(xiàn)都是利用Android的 MediaCodec去解碼每個媒體樣本骂束。
vlc-android
支持協(xié)議 和 支持的音頻和視頻格式 與上面的兩個框架差不多耳璧,基本上常見的都支持。沒有什么特殊的展箱。
大小
jniLibs里面的.so比vitamio的還要大旨枯。不同平臺不同版本的總大小在11-14M左右。
特性
字幕支持混驰,包括ASS 和 DVD 字幕
多聲道攀隔,多字幕
支持多核解碼
支持開啟全硬件加速
支持手勢控制,耳機控制
聲音均衡器
問題
我發(fā)現(xiàn)在android上栖榨,用這個框架進行自己的開發(fā)的項目沒有上面兩種框架多昆汹,相關(guān)資料和問題都很少。
api經(jīng)常變
幾個框架的一些比較
Vitamio | ExoPlayer | vlc-android | |
---|---|---|---|
支持協(xié)議 | 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設(shè)定為23時一定會崩潰 2假残、拖動的視頻的時候缭贡,偶有聲音與畫面出現(xiàn)不同步 |
1、聲音與畫面不同步 2辉懒、拖動視頻進度條現(xiàn)類似馬賽克的雪花點 |
暫未發(fā)現(xiàn) |
封裝程度 | 有直接封裝好的VideoView使用 也可以與TextureView或SurfaceView結(jié)合 |
需要與TextureView或SurfaceView結(jié)合 | 有直接封裝好的VideoView使用阳惹,也可以與TextureView或SurfaceView結(jié)合 |
其他 | 使用自身的.so文件,支持android2.1+ | 1耗帕、依賴 MediaCodec接口穆端,支持android4.1+ 2、依賴于okhttp仿便,Hamcrest体啰,okio,objenesis嗽仪,dexmaker |
使用自身的.so文件荒勇,支持android2.2+ |
bug列表有待增加,上面列出的bug均在我的手機上復(fù)現(xiàn)過闻坚。有些bug的具體的描述見上文每個框架條目下的BUG項及其給出的issue鏈接沽翔。
To Be Continue...