Android 之流媒体播放器,广播侧下方这么简单。
在這里,與大家分享。
首先要明白的概念:什么是流媒體?轉載請注明出處http://blog.csdn.net/gaoshouxiaodi/article/details/41259351
流媒體:所謂流媒體是指採用流式傳輸的方式在Internet播放的媒體格式。
流媒體又叫流式媒體,它是指商家用一個視頻傳送server把節目當成數據包發出,傳送到網絡上。用戶通過解壓設備對這些數據進行解壓后,節目就會像發送前那樣顯示出來。
常見的流媒體的格式:mov .asf .3gp .viv .swf .rt .rp .ra .rm。每一種格式都有各自的優缺點。大家能夠依據實際情況須要來決定。
通俗上講,通常實現流媒體的方法大致有三種。
一。講音視頻文件拆分成若干多個小文件。在播放時。逐個下載。然后播放。也叫偽流媒體。
二,將視頻通過轉換軟件,在server端轉換成流媒體格式文件。然后client進行播放。
三。在本地錄制視頻的過程中。
直接編解碼為流媒體格式文件。(興許的博客中我會單獨講這里)
而實際上,流媒體的實現原理,也就跟第一點類似,僅僅只是能夠理解為,拆分的包很多其它,更小。而仍然是一個總體。它的網絡傳輸,相同是若干多得包單通道或者多通道下發的。
我們熟知的安卓手機支持的視頻格式并不多,3GP。mp4等。可針對廣大需求來講,這點支持確實少的可憐。那假設想在Android手機上播放其它格式的怎么辦。這就涉及到視頻的編解碼。
視頻解碼,分為軟解碼和硬解碼。可惜兩種我都不會。
臨時也不想會。
還好。有那么一批人,他們無私奉獻,在他們的字典里,他們的時間就是我們的時間。他們的金錢就是我們的金錢,他們的媳婦。。。哼。。
他們叫做開源。
我在網上找到了一個非常好的開源項目,vitamio 。這么好的東西,我之前居然不知道。于是我開始下載他們的sdk。Demo,開發文檔等實用的東東。。
可惜,,沒看懂。。給我的感覺是他們提供的東西雜亂無章,可又確實是好東西,怎么辦,耐著性子,搞!
https://www.vitamio.org/docs/Tutorial/2014/0210/29.html粘上他們的介紹鏈接。
感興趣的朋友能夠看一下。
據不全然統計。vitamio框架支持不下百種視頻格式。
以下介紹下簡單播放實現:
首先是界面:
<p></p> <pre name="code" class="html"><?
xml version="1.0" encoding="utf-8"?> <LinearLayout xmlns:android="http://schemas.android.com/apk/res/android" android:layout_width="match_parent" android:layout_height="match_parent" android:orientation="vertical" > <io.vov.vitamio.widget.CenterLayout android:layout_width="match_parent" android:layout_height="match_parent" android:orientation="vertical" > <io.vov.vitamio.widget.VideoView android:id="@+id/surface_view" android:layout_width="match_parent" android:layout_height="match_parent" android:layout_centerHorizontal="true" android:layout_centerVertical="true" /> </io.vov.vitamio.widget.CenterLayout> </LinearLayout>
非常easy的一個現形布局界面,io.vov.vitamio.widget.VideoView是它的自己定義視頻展示控件。然后是activity的實現:
public class VideoViewDemo extends Activity {/*** TODO: Set the path variable to a streaming video URL or a local media file* path.*///視頻路徑private String path = "";private VideoView mVideoView;@Overridepublic void onCreate(Bundle icicle) {super.onCreate(icicle);//對vitamio框架進行初始化。
返回值用來做相關操作。通常沒有要作的事情。初始化一定要在顯示界面之前。 if (!LibsChecker.checkVitamioLibs(this)) return; //顯示界面 setContentView(R.layout.videoview); //初始化組件 mVideoView = (VideoView) findViewById(R.id.surface_view); //設置的兩個網絡流媒體地址,大家能夠直接進行測試。 // path = "http://devimages.apple.com/iphone/samples/bipbop/bipbopall.m3u8"; path = "http://www.modrails.com/videos/passenger_nginx.mov"; if (path == "") { // Tell the user to provide a media file URL/path. Toast.makeText(VideoViewDemo.this, "Please edit VideoViewDemo Activity, and set path" + " variable to your media file URL/path", Toast.LENGTH_LONG).show(); return; } else { /* * 也能夠用這種方法來播放流媒體 * mVideoView.setVideoURI(Uri.parse(URLstring)); */ //設置videoview播放的路徑 mVideoView.setVideoPath(path); //創建視頻播放時的控制器,這個控制器能夠自己定義。此處是默認的實現 mVideoView.setMediaController(new MediaController(this)); //請求焦點 mVideoView.requestFocus(); //設置播放監聽 mVideoView.setOnPreparedListener(new MediaPlayer.OnPreparedListener() { @Override public void onPrepared(MediaPlayer mediaPlayer) { // optional need Vitamio 4.0 //設置重放速度 mediaPlayer.setPlaybackSpeed(1.0f); } }); //載入結束后開始播放,這行代碼能夠控制視頻的播放。 mVideoView.start(); } } }
在使用之前。須要看一下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()
是否處于正在播放的狀態。
實時證明。開源才是人類社會進步的階梯。轉載請注明出處。
vitamio庫下載地址
對于流媒體編解碼器。ffmpeg等待,下一次說起。
轉載于:https://www.cnblogs.com/lcchuguo/p/5047195.html
總結
以上是生活随笔為你收集整理的Android 之流媒体播放器,广播侧下方这么简单。的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 《定位》艾·里斯 杰克·特劳特.pdf
- 下一篇: 备案用的云服务器需要长期,域名备案必须买