Android--使用開源vitamio作萬能視頻播放器

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) 等常見的多種視頻流媒體協議,包括點播與直播。html

資源下載:http://download.csdn.net/detail/chaoyu168/9494680java

流媒體支持 

Vitamio 支持各類常見的流媒體協議,能夠點播或者直播音頻和視頻,例如以下常見協議均能無縫支持:android

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

音頻和視頻格式 

Vitamio 使用了 FFmpeg 作爲媒體解析器和最主要的解碼器,同時開發了針對不一樣移動平臺的硬解碼方案,可以完美支持 H.264/AVC、H.26三、 MPEG4 等常見的視頻編碼,覆蓋上百種多媒體格式。下表只是一些最多見的視頻格式支持,除特殊標明,所有支持硬件加速:git

  • DivX/Xvid
  • WMV (通常只有軟解碼)
  • FLV
  • TS/TP
  • RMVB (只有軟解碼)
  • MKV
  • MOV
  • M4V
  • AVI
  • MP4
  • 3GP

字幕支持 

Vitamio 對字幕的支持很優秀,包括各類常見外掛字幕與不少視頻格式的內嵌字幕,同多個字幕等特性的支持也很是完善。好比:github

  • 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 優化
  • 支持手機到平板各類設備
  • 流媒體播放緩衝支持
  • 播放畫面比例大小隨手調節
  • 自動文字編碼檢測,拒絕亂碼

還有更多新特性沒有被列出,請參考開發文檔。緩存

導入使用 

一、導入。下載回來後你們可能發現沒有.project工程文件,能夠經過File -> Import -> Android -> Existing Android Code Into Workspace來導入工程,而後改一下工程名稱便可。安全

二、將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() 是否處於正在播放的狀態。

相關文章
相關標籤/搜索