android简单视频播放器

来源:互联网 发布:python os fork exec 编辑:程序博客网 时间:2024/05/16 17:02
 

Android为视频播放提供了VideoView 和 MediaController 两个现成的组件,让我们可以方便的实现MP4、3GP等视频的播放。下面我们通过一个例子来看一下:

1、新建一个项目 Lesson28_Video

2、使用 Format Factory 这个软件压缩一个视频备用,我这里压缩的参数如下:

image

注意,如果播放时完全无法播放或者只有声音没有图像,你就需要换压缩软件和调整压缩参数重新压缩视频了,暂时只能这样,我也是折腾了2-3小时都是黑屏,郁闷中(似乎得出一个答案,是否黑屏和机器设备的性能有关,我降低压缩分辨率和每秒帧数,出图像音画同步,如果提高每秒帧数,声音出来后十几秒图像才会出来,但是出来后音画还是同步的,有兴趣的朋友可以多测试测试给出一个结论)。

用命令行的方式拷贝此视频到存储卡(sdcard)中,为什么不用eclipse中的可视化工具拷贝呢?因为那个方式靠大文件的时候经常失败,而命令行方式我没拷贝失败一次过。命令就是 adb push ,具体截个图给你看:

image

3、res\layout\main.xml的内容如下:

1<?xmlversion="1.0"encoding="utf-8"?>
2<LINEARLAYOUTxmlns:android="http://schemas.android.com/apk/res/android"android:layout_height="match_parent"android:layout_width="match_parent"android:orientation="vertical"android:layout_gravity="top">
3<VIDEOVIEWandroid:layout_height="fill_parent"android:layout_width="fill_parent"android:id="@+id/VideoView01">
4</VIDEOVIEW>
5</LINEARLAYOUT>

4、MainVideo.java的内容如下:

01packageandroid.basic.lesson28;
03importandroid.app.Activity;
04importandroid.net.Uri;
05importandroid.os.Bundle;
06importandroid.view.Window;
07importandroid.view.WindowManager;
08importandroid.widget.MediaController;
09importandroid.widget.VideoView;
11publicclassMainVideo extendsActivity {
12    /** Called when the activity is first created. */
13    @Override
14    publicvoidonCreate(Bundle savedInstanceState) {
15        super.onCreate(savedInstanceState);
16        //全屏
17        this.getWindow().setFlags(WindowManager.LayoutParams.FLAG_FULLSCREEN, WindowManager.LayoutParams.FLAG_FULLSCREEN);
18        //标题去掉
19        this.requestWindowFeature(Window.FEATURE_NO_TITLE);
20        //要在全屏等设置完毕后再加载布局
21        setContentView(R.layout.main);
23        //定义UI组件
24        VideoView videoView = (VideoView) findViewById(R.id.VideoView01);
25        //定义MediaController对象
26        MediaController mediaController =newMediaController(this);
27        //把MediaController对象绑定到VideoView上
28        mediaController.setAnchorView(videoView);
29        //设置VideoView的控制器是mediaController
30        videoView.setMediaController(mediaController);
32        //这两种方法都可以 videoView.setVideoPath("file:///sdcard/love_480320.mp4");
33        videoView.setVideoURI(Uri.parse("/sdcard/love_480320.mp4"));
34        //启动后就播放
35        videoView.start();
36    }
37}

5、运行效果如下:

image

image

三、简单录音程序

1、新建一个一个项目 Tip_Recorder,主activity名字是  MainActivity

2、其布局文件main.xml的代码是:

1<?xmlversion="1.0"encoding="utf-8"?>
2<LINEARLAYOUTxmlns:android="http://schemas.android.com/apk/res/android"android:layout_height="fill_parent"android:layout_width="fill_parent"android:orientation="vertical"android:gravity="center">
3  
4    <BUTTONandroid:layout_height="wrap_content"android:layout_width="wrap_content"android:text="录音"android:textsize="30sp"android:id="@+id/Button01"></BUTTON>
5    <BUTTONandroid:layout_height="wrap_content"android:layout_width="wrap_content"android:text="停止"android:textsize="30sp"android:id="@+id/Button02"android:layout_margintop="20dp"></BUTTON>
6</LINEARLAYOUT>

3、主程序文件 MainActivity.java的代码如下:

01packageandroid.tip.yaoyao;
03importjava.io.File;
04importjava.io.IOException;
05importjava.util.Calendar;
06importjava.util.Locale;
07  
08importandroid.app.Activity;
09importandroid.media.MediaRecorder;
10importandroid.os.Bundle;
11importandroid.text.format.DateFormat;
12importandroid.view.View;
13importandroid.widget.Button;
14importandroid.widget.Toast;
16publicclassMainActivity extendsActivity {
18    privateButton recordButton;
19    privateButton stopButton;
21    privateMediaRecorder mr;
23    @Override
24    publicvoidonCreate(Bundle savedInstanceState) {
25        super.onCreate(savedInstanceState);
26        setContentView(R.layout.main);
28        recordButton = (Button)this.findViewById(R.id.Button01);
29        stopButton = (Button)this.findViewById(R.id.Button02);
31        // 录音按钮点击事件
32        recordButton.setOnClickListener(newView.OnClickListener() {
34            @Override
35            publicvoidonClick(View v) {
37                File file =newFile("/sdcard/"
38                        +"YY"
39                        +newDateFormat().format("yyyyMMdd_hhmmss",
40                                Calendar.getInstance(Locale.CHINA)) +".amr");
41  
42                Toast.makeText(getApplicationContext(),"正在录音,录音文件在"+file.getAbsolutePath(), Toast.LENGTH_LONG)
43                        .show();
45                // 创建录音对象
46                mr =newMediaRecorder();
48                // 从麦克风源进行录音
49                mr.setAudioSource(MediaRecorder.AudioSource.DEFAULT);
51                // 设置输出格式
52                mr.setOutputFormat(MediaRecorder.OutputFormat.DEFAULT);
54                // 设置编码格式
55                mr.setAudioEncoder(MediaRecorder.AudioEncoder.DEFAULT);
57                // 设置输出文件
58                mr.setOutputFile(file.getAbsolutePath());
60                try{
61                    // 创建文件
62                    file.createNewFile();
63                    // 准备录制
64                    mr.prepare();
65                }catch(IllegalStateException e) {
66                    e.printStackTrace();
67                }catch(IOException e) {
68                    e.printStackTrace();
69                }
70                // 开始录制
71                mr.start();
72                recordButton.setText("录音中……");
73            }
74        });
76        // 停止按钮点击事件
77        stopButton.setOnClickListener(newView.OnClickListener() {
79            @Override
80            publicvoidonClick(View v) {
82                if(mr != null) {
83                    mr.stop();
84                    mr.release();
85                    mr =null;
86                    recordButton.setText("录音");
87                    Toast.makeText(getApplicationContext(),"录音完毕", Toast.LENGTH_LONG).show();
88                }
89            }
90        });
92    }
94}

4、因为录音和写存储卡都需要权限声明,所以这里也把AndroidManifest.xml代码提供出来:

01<?xmlversion="1.0"encoding="utf-8"?>
02<MANIFESTxmlns:android="http://schemas.android.com/apk/res/android"android:versionname="1.0"android:versioncode="1"package="android.tip.yaoyao">
03    <APPLICATIONandroid:icon="@drawable/icon"android:label="@string/app_name"android:debuggable="true">
04        <ACTIVITYandroid:label="@string/app_name"android:configchanges="orientation|keyboardHidden|keyboard"android:screenorientation="portrait"android:name=".MainActivity">
05            <INTENT-filter>
06                <ACTIONandroid:name="android.intent.action.MAIN"/>
07                <CATEGORYandroid:name="android.intent.category.LAUNCHER"/>
08            </INTENT>
09        </ACTIVITY>
11    </APPLICATION>
12    <USESandroid:minsdkversion="4"-sdk />
14<USESandroid:name="android.permission.RECORD_AUDIO"-permission></USES>
15<USESandroid:name="android.permission.WRITE_EXTERNAL_STORAGE"-permission></USES>
16</MANIFEST>

5、编译并运行程序,查看结果。

image

点击录音:

image

录音文件在存储卡的根目录几个以YY开头的amr文件

image

6、这个例子要用到录音设备,而模拟器并不能把电脑声卡模拟出来使用,因此这个例子必须在真机上进行测试。 真机上测试方法也很简单。

  1. 在真机上把USB调试模式打开,
  2. 把真机用USB线与电脑连接
  3. 设置电脑和手机的连接方式为 ”仅充电“(此时手机可以操作存储卡)
  4. 打开Eclipse,在不选择模拟器的情况下运行程序,此时,Eclipse会自动找到真机,并使用它运行程序,最完美的是他可以把真机运行程序的输出信息,照样输出在Eclipse中的Logcat日志中。
    上面的真机截图也是通过Eclipse的DDMS窗口直接抓取的,下图中右上角颜色最深的图标就是抓取真机截图的按钮:

未命名

原创粉丝点击