Android Studio上手,基於VideoView的本地檔案及流媒體播放器

來源:互聯網
上載者:User

標籤:android studio   rtsp   videoview   

既然是第一個Android程式,少不了要Hello World。


1. 建立安卓工程



2. 輸入工程名稱



3. 選擇平台版本



4. 選擇一個空的Activity



5. 定製自己的Activity


點擊Finish後,便產生了可以直接啟動並執行Hello World程式。下面開始討論怎樣使這個只能列印Hello World的程式能夠播放本地和網路視頻。

此處附上功能目錄結構:



6. 布局檔案

首先需要重新布局。設計器的設計結果是儲存在“activity_video_view_demo.xml”這個XML檔案中的,所以,稍微花一點時間看下這個XML檔案,就很容易看懂。

<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"    xmlns:tools="http://schemas.android.com/tools" android:layout_width="match_parent"    android:layout_height="match_parent" android:paddingLeft="@dimen/activity_horizontal_margin"    android:paddingRight="@dimen/activity_horizontal_margin"    android:paddingTop="@dimen/activity_vertical_margin"    android:paddingBottom="@dimen/activity_vertical_margin" tools:context=".VideoViewDemo">    <TextView        android:layout_width="wrap_content"        android:layout_height="wrap_content"        android:textAppearance="?android:attr/textAppearanceLarge"        android:text="= Stream Player ="        android:id="@+id/textView"        android:layout_alignParentTop="true"        android:layout_alignParentLeft="true"        android:layout_alignParentStart="true"        android:layout_alignParentRight="true"        android:layout_alignParentEnd="true"        android:textIsSelectable="false"        android:layout_alignParentBottom="false"        android:gravity="center_horizontal" />    <EditText        android:layout_width="wrap_content"        android:layout_height="wrap_content"        android:id="@+id/url"        android:layout_below="@+id/textView"        android:layout_alignParentTop="false"        android:layout_alignParentLeft="true"        android:text="rtsp://ipaddr:port/domain"        android:layout_alignRight="@+id/textView"        android:layout_alignEnd="@+id/textView" />    <RadioGroup        android:id="@+id/radioGroup1"        android:layout_width="wrap_content"        android:layout_height="wrap_content"        android:orientation="horizontal"        android:layout_below="@+id/url"        android:layout_alignParentLeft="true"        android:layout_alignParentStart="true"        android:layout_alignParentTop="false">        <RadioButton            android:layout_width="wrap_content"            android:layout_height="wrap_content"            android:text="Stream"            android:id="@+id/radioButtonStream"            android:layout_below="@+id/url"            android:layout_alignParentLeft="true"            android:layout_alignParentStart="true"            android:checked="false"            android:layout_alignBottom="@+id/start_play" />        <RadioButton            android:layout_width="wrap_content"            android:layout_height="51dp"            android:text="File"            android:id="@+id/radioButtonFile"            android:checked="false"            android:layout_alignBottom="@+id/radioButtonStream"            android:layout_toRightOf="@+id/radioButtonStream"            android:layout_below="@+id/url" />    </RadioGroup>    <Button        android:layout_width="wrap_content"        android:layout_height="wrap_content"        android:text="PLAY"        android:id="@+id/start_play"        android:layout_below="@+id/url"        android:layout_alignRight="@+id/url"        android:layout_alignEnd="@+id/url"        android:layout_toRightOf="@+id/radioGroup1"        android:layout_toEndOf="@+id/radioGroup1" />    <VideoView        android:layout_width="match_parent"        android:layout_height="match_parent"        android:id="@+id/rtsp_player"        android:layout_below="@+id/start_play"        android:layout_alignRight="@+id/url"        android:layout_alignEnd="@+id/url" /></RelativeLayout>
布局設計器效果:

對照XML檔案,最外層是一個關係布局。裡面依次是TextView(用於顯示標題);EditText(用於輸入檔案名稱或流媒體的URL);一個RadioGroup,其中包含兩個RadioButton(用於區分是區網路流還是讀本地檔案);一個Button(單擊開始播放);一個VideoView(視頻播放區)。

其中的layout_width可以是wrap_content(根據內容自適應),fill_parent(填充整個外部空間),match_parent(根據外部空間自適應),這個當視頻播放區載入視頻後會看出差別。android:id這個屬性非常重要,是Java程式中調用布局控制項的關鍵。


7. 源碼

package com.example.chenth.videoviewdemo;import android.app.Activity;import android.net.Uri;import android.os.Bundle;import android.os.Environment;import android.view.View;import android.widget.Button;import android.widget.EditText;import android.widget.RadioButton;import android.widget.VideoView;public class VideoViewDemo extends Activity {    /** Called when the activity is first created. */    Button playButton ;    VideoView videoView ;    EditText rtspUrl ;    RadioButton radioStream;    RadioButton radioFile;    @Override    public void onCreate(Bundle savedInstanceState) {        super.onCreate(savedInstanceState);        setContentView(R.layout.activity_video_view_demo);        rtspUrl = (EditText)this.findViewById(R.id.url);        playButton = (Button)this.findViewById(R.id.start_play);        radioStream = (RadioButton)this.findViewById(R.id.radioButtonStream);        radioFile = (RadioButton)this.findViewById(R.id.radioButtonFile);        playButton.setOnClickListener(new Button.OnClickListener(){            public void onClick(View v) {                if (radioStream.isChecked()) {                    PlayRtspStream(rtspUrl.getEditableText().toString());                }                else if (radioFile.isChecked()){                    PlayLocalFile(rtspUrl.getEditableText().toString());                }            }        });        videoView = (VideoView)this.findViewById(R.id.rtsp_player);    }    //play rtsp stream    private void PlayRtspStream(String rtspUrl){        videoView.setVideoURI(Uri.parse(rtspUrl));        videoView.requestFocus();        videoView.start();    }    //play rtsp stream    private void PlayLocalFile(String filePath){        videoView.setVideoPath(Environment.getExternalStorageDirectory() + "/" + filePath);        videoView.requestFocus();        videoView.start();    }}
在on鞥的Create函數中根據ID從布局中擷取控制項,當playButton點擊時根據RadioButton的選擇(取網路流還是播放本地檔案)調用不同的函數。(主要是用到了Android原生的VideoView,而這個控制項播放網路流使用 videoView.setVideoURI()函數,播放本地檔案使用setVideoPath()函數)。

8. 增加許可權

在調試這個程式的時候,總是出現“Can‘t Play This Video”或者“無法播放該視頻”的錯誤,我也為此花費了很多時間,最後發現是因為沒有給這個APP賦予訪問網路和本地檔案的許可權。許可權配置在AndroidManifest.xml這個檔案中。

<?xml version="1.0" encoding="utf-8"?><manifest xmlns:android="http://schemas.android.com/apk/res/android"    package="com.example.chenth.videoviewdemo" >    <uses-permission android:name="android.permission.INTERNET"/>    <uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE"/>    <application        android:allowBackup="true"        android:icon="@mipmap/ic_launcher"        android:label="@string/app_name"        android:theme="@style/AppTheme" >        <activity            android:name=".VideoViewDemo"            android:label="@string/app_name" >            <intent-filter>                <action android:name="android.intent.action.MAIN" />                <category android:name="android.intent.category.LAUNCHER" />            </intent-filter>        </activity>    </application></manifest>
注意"uses-permission"的兩行,分別表示該應用需要訪問網路,以及讀寫本地檔案,這兩個許可權對應了播放網路流和本地檔案。
加了這兩行以後,打包安裝時,就可以看到APP想Android系統申請許可權的提示了。


9. 在模擬器上調試

點擊Run app,會出現選擇裝置的視窗,沒有現成裝置的話就新增一個。





因為我不知道模擬器對應的根目錄在PC的什麼位置,所以無法在模擬器中直接測試播放本地檔案。另外,在模擬器中測試播放網路流也不成功,猜測應該是模擬器許可權未設定好。所以,直接進入最後一步吧。


10. 打包發布

點擊功能表列的Build -> Generate Signed APK。第一次使用時會要求建立一個Key,就建立吧。然後一路Next 就可以了。最後把產生的apk檔案拷貝到手機,安裝,搞定!

最後上手機截屏效果:一張是播放RTSP即時資料流,另一張是我家小盆友的錄影。




11. 附:Android原生VideoView的播放緩衝大小好像是不能調整的,導致網路RTSP流的延時達到了9-10秒。各位看官如果知道什麼好的辦法,歡迎留言告知,謝謝!


Android Studio上手,基於VideoView的本地檔案及流媒體播放器

相關文章

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.