AndroidStudio上⼿,基于VideoView的本地⽂件及流媒体播放
器
既然是第⼀个Android程序。少不了要Hello World。
1. 新建安卓project
2. 输⼊project名称
3. 选择平台版本号
4. 选择⼀个空的Activity
5. 定制⾃⼰的Activity
点击Finish后,便⽣成了可以直接执⾏的Hello World程序。
以下開始讨论如何使这个仅仅能打印Hello World的程序可以播放本地和⽹络视频。
此处附上功能⽂件夹结构:
6. 布局⽂件
⾸先须要⼜⼀次布局。
设计器的设计结果是保存在“activity_video_l”这个XML⽂件⾥的。所以,略微花⼀点时间看下这个XML⽂件。就⾮常easy看懂。
<RelativeLayout xmlns:android="schemas.android/apk/res/android"
xmlns:tools="schemas.android/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. 源代码
ample.chenth.videoviewdemo;
import android.app.Activity;
import android.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;
android模拟点击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) {
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()) {
EditableText().toString());
}
else if (radioFile.isChecked()){
EditableText().toString());
}
}
});
videoView = (VideoView)this.findViewById(sp_player);
}
//play rtsp stream
private void PlayRtspStream(String rtspUrl){
videoView.setVideoURI(Uri.parse(rtspUrl));
videoView.start();
}
//play rtsp stream
private void PlayLocalFile(String filePath){
videoView.ExternalStorageDirectory() + "/" + filePath);
videoView.start();
}
}
在on鞥的Create函数中依据ID从布局中获取控件,当playButton点击时依据RadioButton的选择(取⽹络流还是播放本地⽂件)调⽤不同的函数。(主要是⽤到了Android原⽣的VideoView。⽽这个控件播放⽹络流使⽤ videoView.setVideoURI()函数,播放本地⽂件使⽤setVideoPath()函数)。
8. 添加权限
在调试这个程序的时候,总是出现“Can't Play This Video”或者“⽆法播放该视频”的错误。我也为此花费了⾮常多时间。最后发现是由于没有给这个APP赋予訪问⽹络和本地⽂件的权限。
权限配置在l这个⽂件⾥。
<?xml version="1.0" encoding="utf-8"?>
<manifest xmlns:android="schemas.android/apk/res/android"
package="ample.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秒。各位看官假设知道什么好的办法。欢迎留⾔告知,谢谢!
版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系QQ:729038198,我们将在24小时内删除。
发表评论