手机影音第十一天,显示视频缓冲,显示卡顿时的网速,播放系统视频时调用播放器的选择...
代碼已經(jīng)托管到碼云,有興趣的小伙伴可以下載看看
https://git.oschina.net/joy_yuan/MobilePlayer
一、設(shè)置視頻緩沖進(jìn)度
顯示視頻播放進(jìn)度的效果圖如下:灰色的是緩沖的進(jìn)度。
原理:只有播放網(wǎng)絡(luò)視頻時,才有緩沖這個說法,所以要先判斷視頻資源是否為網(wǎng)絡(luò)資源
/***?判斷是否是網(wǎng)絡(luò)的資源*?@param?uri*?@return*/ public?boolean?isNetUri(String?uri)?{boolean?reault?=?false;if?(uri?!=?null)?{if?(uri.toLowerCase().startsWith("http")?||?uri.toLowerCase().startsWith("rtsp")?||?uri.toLowerCase().startsWith("mms"))?{reault?=?true;}}return?reault; }因此在前面,不管是單個的URI還是通過list傳來的mediaitem數(shù)組,都要根據(jù)地址來去判斷,然后在handler里去設(shè)置進(jìn)度條。
????進(jìn)度條很簡單,只需要設(shè)置seekbarVideo.setSecondaryProgress(int progress);即可達(dá)到設(shè)置進(jìn)度。那么這個緩沖值怎么獲取的呢,這個是一個統(tǒng)一的寫法,沒有什么原因,如下代碼:
????
//網(wǎng)絡(luò)資源緩沖 if?(isNetUri){//只有網(wǎng)絡(luò)資源有緩沖int?bufferPercentage?=?videoview.getBufferPercentage();??//0~100int?totalbuffer?=?bufferPercentage?*?seekbarVideo.getMax();int?secordProgress=totalbuffer/100;seekbarVideo.setSecondaryProgress(secordProgress); }else{//本地進(jìn)度條沒有緩沖,即第二條進(jìn)度條為灰色seekbarVideo.setSecondaryProgress(0); }二、使播放本地視頻時,可以跳出來選擇自定義播放器的方法。當(dāng)我們手機(jī)里裝了多個播放器后,如果要播放本地視頻,系統(tǒng)會跳出來一個選擇框,讓用戶選擇播放哪個視頻這里用到里隱式意圖,只要給SystemVideoPlayer這個activity在AndroidManifext.xml里配置隱式意圖即可:<activityandroid:name=".activity.SystemVideoPlayer"android:configChanges="keyboardHidden|screenSize|orientation"android:screenOrientation="landscape"><intent-filter><action?android:name="android.intent.action.VIEW"?/><category?android:name="android.intent.category.DEFAULT"?/><category?android:name="android.intent.category.BROWSABLE"?/><data?android:scheme="rtsp"?/></intent-filter><intent-filter><action?android:name="android.intent.action.VIEW"?/><category?android:name="android.intent.category.DEFAULT"?/><data?android:mimeType="video/*"?/><data?android:mimeType="application/sdp"?/></intent-filter><intent-filter><action?android:name="android.intent.action.VIEW"?/><category?android:name="android.intent.category.DEFAULT"?/><category?android:name="android.intent.category.BROWSABLE"?/><data?android:scheme="http"?/><data?android:mimeType="video/mp4"?/><data?android:mimeType="video/3gp"?/><data?android:mimeType="video/3gpp"?/><data?android:mimeType="video/3gpp2"?/></intent-filter><intent-filter><action?android:name="android.intent.action.VIEW"?/><category?android:name="android.intent.category.LAUNCHER"?/><category?android:name="android.intent.category.DEFAULT"?/><category?android:name="android.intent.category.BROWSABLE"?/><dataandroid:mimeType="video/*"android:scheme="http"?/><dataandroid:mimeType="video/*"android:scheme="rtsp"?/><dataandroid:mimeType="video/*"android:scheme="rtmp"?/><dataandroid:mimeType="video/*"android:scheme="udp"?/><dataandroid:mimeType="video/*"android:scheme="tcp"?/><dataandroid:mimeType="video/*"android:scheme="file"?/><dataandroid:mimeType="video/*"android:scheme="content"?/><dataandroid:mimeType="video/*"android:scheme="mms"?/><data?android:mimeType="application/octet-stream"?/><data?android:mimeType="application/x-mpegurl"?/><data?android:mimeType="application/vnd.apple.mpegurl"?/></intent-filter><intent-filter><action?android:name="android.intent.action.VIEW"?/><category?android:name="android.intent.category.DEFAULT"?/><data?android:scheme="content"?/></intent-filter><intent-filter><action?android:name="android.intent.action.VIEW"?/><category?android:name="android.intent.category.DEFAULT"?/><category?android:name="android.intent.category.BROWSABLE"?/><dataandroid:mimeType="application/x-mpegurl"android:scheme="http"?/></intent-filter><intent-filter><action?android:name="android.intent.action.VIEW"?/><category?android:name="android.intent.category.DEFAULT"?/><category?android:name="android.intent.category.BROWSABLE"?/><data?android:scheme="rtsp"?/><data?android:scheme="rtmp"?/><data?android:scheme="mms"?/><data?android:scheme="tcp"?/><data?android:scheme="udp"?/></intent-filter><intent-filter><action?android:name="android.intent.action.VIEW"?/><action?android:name="android.intent.action.SEND"?/><action?android:name="android.intent.action.SENDTO"?/><category?android:name="android.intent.category.DEFAULT"?/><data?android:mimeType="video/*"?/><data?android:mimeType="application/sdp"?/><data?android:mimeType="application/octet-stream"?/></intent-filter><intent-filter><action?android:name="android.intent.action.VIEW"?/><category?android:name="android.intent.category.DEFAULT"?/><category?android:name="android.intent.category.BROWSABLE"?/><data?android:scheme="http"?/><data?android:mimeType="video/*"?/></intent-filter><intent-filter><action?android:name="android.intent.action.VIEW"?/><category?android:name="android.intent.category.DEFAULT"?/><category?android:name="android.intent.category.BROWSABLE"?/><data?android:scheme="file"?/><data?android:scheme="content"?/><data?android:scheme="http"?/><data?android:scheme="https"?/><data?android:scheme="ftp"?/><data?android:scheme="rtsp"?/><data?android:scheme="rtmp"?/><data?android:scheme="mms"?/><data?android:scheme="tcp"?/><data?android:scheme="udp"?/><data?android:scheme="gopher"?/><data?android:mimeType="video/*"?/><!--?<data?android:mimeType="audio/*"?/>?--></intent-filter><intent-filter><action?android:name="android.intent.action.VIEW"?/><category?android:name="android.intent.category.DEFAULT"?/><category?android:name="android.intent.category.BROWSABLE"?/><data?android:scheme="file"?/><data?android:scheme="content"?/><data?android:scheme="http"?/><data?android:scheme="https"?/><data?android:scheme="ftp"?/><data?android:scheme="rtsp"?/><data?android:scheme="rtmp"?/><data?android:scheme="mms"?/><data?android:scheme="tcp"?/><data?android:scheme="udp"?/><data?android:scheme="gopher"?/><data?android:host="*"?/><data?android:pathPattern=".*\\.avi"?/><data?android:pathPattern=".*\\.asf"?/><data?android:pathPattern=".*\\.f4v"?/><data?android:pathPattern=".*\\.flv"?/><data?android:pathPattern=".*\\.mkv"?/><data?android:pathPattern=".*\\.mpeg"?/><data?android:pathPattern=".*\\.mpg"?/><data?android:pathPattern=".*\\.mov"?/><data?android:pathPattern=".*\\.rm"?/><data?android:pathPattern=".*\\.vob"?/><data?android:pathPattern=".*\\.wmv"?/><data?android:pathPattern=".*\\.ts"?/><data?android:pathPattern=".*\\.tp"?/><data?android:pathPattern=".*\\.m3u"?/><data?android:pathPattern=".*\\.m3u8"?/><data?android:pathPattern=".*\\.m4v"?/><data?android:pathPattern=".*\\.mp4"?/></intent-filter><intent-filter><action?android:name="android.intent.action.VIEW"?/><category?android:name="android.intent.category.DEFAULT"?/><category?android:name="android.intent.category.BROWSABLE"?/><data?android:scheme="rtsp"?/><data?android:mimeType="video/*"?/></intent-filter><intent-filter><action?android:name="android.intent.action.VIEW"?/><category?android:name="android.intent.category.DEFAULT"?/><category?android:name="android.intent.category.BROWSABLE"?/><data?android:scheme="rtsp"?/></intent-filter><intent-filter><action?android:name="android.intent.action.VIEW"?/><category?android:name="android.intent.category.DEFAULT"?/><category?android:name="android.intent.category.BROWSABLE"?/><data?android:scheme="http"?/><data?android:mimeType="video/*"?/></intent-filter><intent-filter><action?android:name="android.intent.action.VIEW"?/><category?android:name="android.intent.category.DEFAULT"?/><data?android:mimeType="video/*"?/></intent-filter><intent-filter><action?android:name="android.intent.action.VIEW"?/><category?android:name="android.intent.category.DEFAULT"?/><data?android:scheme="file"?/><data?android:mimeType="video/*"?/></intent-filter><intent-filter><action?android:name="android.intent.action.SEARCH"?/><category?android:name="android.intent.category.DEFAULT"?/></intent-filter></activity>三、監(jiān)聽視頻播放卡頓時,彈出一個progressbar并提示用戶當(dāng)前網(wǎng)速
????在這里就要寫一個布局,與視頻播放布局在同一個布局,同樣是include進(jìn)來
????在system_video_player.xml里加入
<include?layout="@layout/buffering"?android:id="@+id/buffering"/>? ? 3.1 buffering.xml
????
<?xml?version="1.0"?encoding="utf-8"?> <LinearLayout?xmlns:android="http://schemas.android.com/apk/res/android"android:layout_width="wrap_content"android:layout_height="wrap_content"android:orientation="horizontal"android:gravity="center"android:visibility="gone"android:padding="3dp"android:layout_centerInParent="true"android:background="#33000000"><ProgressBarandroid:layout_width="30dp"android:layout_height="30dp"/><TextViewandroid:gravity="center"android:id="@+id/tv_netspeed"android:text="緩沖中...30kb/s"android:layout_width="wrap_content"android:layout_height="wrap_content"/></LinearLayout>? ? 3.2 視頻卡頓時,在Android4.2.2后,系統(tǒng)集成進(jìn)到了videoview里了,作為一個監(jiān)聽,那么我們只要實(shí)現(xiàn)了這個監(jiān)聽就可以在里面獲取卡頓時與不卡頓時的回調(diào)方法:
????
//監(jiān)聽網(wǎng)絡(luò)播放卡頓現(xiàn)象 if?(Build.VERSION.SDK_INT?>=?Build.VERSION_CODES.JELLY_BEAN_MR1)?{videoview.setOnInfoListener(new?MyOnInfoListener()); }/***?視頻播放卡頓時的監(jiān)聽,Android4.2.2后封裝到了videoview里了已經(jīng)*/ public?class?MyOnInfoListener?implements?MediaPlayer.OnInfoListener{@Overridepublic?boolean?onInfo(MediaPlayer?mp,?int?what,?int?extra)?{switch?(what){case?MediaPlayer.MEDIA_INFO_BUFFERING_START:?//開始卡頓//顯示卡頓的布局buffering.setVisibility(View.VISIBLE);break;case?MediaPlayer.MEDIA_INFO_BUFFERING_END:??//結(jié)束卡頓buffering.setVisibility(View.GONE);break;}return?true;} }這時候,只要是卡頓了,那么就會彈出一個progressbar在視頻中央
? 3.3 在上面的這個,是系統(tǒng)集成好的判斷是否卡頓的方法,那么我們也可以自定義判斷視頻是否卡頓,
????原理是:在handler每一秒循環(huán)的消息體中,去判斷當(dāng)前視頻進(jìn)度和上一次循環(huán)消息時的視頻進(jìn)度相減,如果進(jìn)度小魚500ms,那么就判斷是卡頓了,否則就不卡。
????
if?(videoview.isPlaying()){int?buffer=currentPosition-preCurrentPosition;if?(buffer<500){//視頻卡了buffering.setVisibility(View.VISIBLE);}else{buffering.setVisibility(View.GONE);}}else{buffering.setVisibility(View.GONE); }preCurrentPosition=currentPosition;????上面的代碼也能判斷視頻卡頓時,顯示progressbar。
四、視頻播放前的loading布局與獲取系統(tǒng)的網(wǎng)速
????原理:寫一個布局,與視頻播放頁面system_video_player.xml在一個布局里,寬高都是match_parent即覆蓋整個屏幕。這樣當(dāng)點(diǎn)擊播放視頻時,會先顯示這個布局,然后我們再在視頻準(zhǔn)備好播放時,讓這個布局消失,即可達(dá)到效果
????4.1 system_video_player.xml
4.2 在systemVideoPlayer.java里
????
public?void?onPrepared(MediaPlayer?mp)?{videoview.start();?//開始播放duration?=?videoview.getDuration();??//獲取視頻總時長seekbarVideo.setMax(duration);???//設(shè)置播放進(jìn)度的最大值//發(fā)送消息,來更新視頻進(jìn)度handler.sendEmptyMessage(PROGRESS);//設(shè)置顯示的視頻總時長tvDuration.setText(utils.stringForTime(duration));//默認(rèn)進(jìn)入播放時,隱藏media_controller.setVisibility(View.GONE);isShow=false;??//設(shè)置為隱藏//獲取播放器播放視頻的寬度和高度videoHeight=mp.getVideoHeight();videoWidth=mp.getVideoWidth();//?videoview.setVideoSize(mp.getVideoWidth(),mp.getVideoHeight());setVideoType(DEFAULTSCREEN);//當(dāng)準(zhǔn)備好播放時,把loading頁面消失掉ll_loading.setVisibility(View.GONE);}4.2 獲取網(wǎng)速
????原理是:每次handler2秒循環(huán)一次獲取網(wǎng)速消息,在2秒內(nèi),獲取的數(shù)據(jù)量/時間,即可得到網(wǎng)速。
具體代碼如下:
/***?得到網(wǎng)絡(luò)速度*?每隔兩秒調(diào)用一次*?@param?context*?@return*/ public?String?getNetSpeed(Context?context)?{String?netSpeed?=?"0?kb/s";long?nowTotalRxBytes?=?TrafficStats.getUidRxBytes(context.getApplicationInfo().uid)==TrafficStats.UNSUPPORTED???0?:(TrafficStats.getTotalRxBytes()/1024);//轉(zhuǎn)為KB;long?nowTimeStamp?=?System.currentTimeMillis();long?speed?=?((nowTotalRxBytes?-?lastTotalRxBytes)?*?1000?/?(nowTimeStamp?-?lastTimeStamp));//毫秒轉(zhuǎn)換lastTimeStamp?=?nowTimeStamp;lastTotalRxBytes?=?nowTotalRxBytes;netSpeed??=?String.valueOf(speed)?+?"?kb/s";Log.d(TAG,?"當(dāng)前總的數(shù)據(jù)"+nowTotalRxBytes);return??netSpeed; }這里要在loading布局聲明好時,就立刻發(fā)消息,去handler處理,來獲取網(wǎng)速,以便loading界面也出現(xiàn)網(wǎng)速顯示。
????
//加載布局時的布局與網(wǎng)速顯示 ll_loading=?(LinearLayout)?findViewById(R.id.ll_loading); tv_loading_netspeed=?(TextView)?findViewById(R.id.tv_loading_netspeed);handler.sendEmptyMessage(SPEED);??//控件只要一聲明好就發(fā)消息去獲取網(wǎng)速發(fā)完聲明后,就在handler里去處理消息,獲取網(wǎng)速,然后在loading和卡頓時,顯示網(wǎng)速,不卡頓時,隱藏對應(yīng)的布局
????
public?Handler?handler=new?Handler(){@Overridepublic?void?handleMessage(Message?msg)?{super.handleMessage(msg);switch?(msg.what){case?SPEED:??//顯示當(dāng)前網(wǎng)速//得到網(wǎng)速String?netSpeed?=?utils.getNetSpeed(SystemVideoPlayer.this);System.out.println("當(dāng)前網(wǎng)速"+netSpeed);//顯示網(wǎng)速tv_loading_netspeed.setText("玩命加載中"+netSpeed);??//loading時的速度顯示tv_netspeed.setText("緩沖中"+netSpeed);??//緩沖時的速度顯示removeMessages(SPEED);handler.sendEmptyMessageDelayed(SPEED,2000);??//一定要隔2秒才能去獲取網(wǎng)速break;}};轉(zhuǎn)載于:https://blog.51cto.com/cm0425/1950630
總結(jié)
以上是生活随笔為你收集整理的手机影音第十一天,显示视频缓冲,显示卡顿时的网速,播放系统视频时调用播放器的选择...的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: php文件引用问题,Php引用文件引起的
- 下一篇: 37款机型升级鸿蒙系统,华为终于想通,为