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

資源下載: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()
是否處於正在播放的狀態。



免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM