android简单视频播放器

本博客详细介绍了如何在Android应用中使用VideoView和MediaController组件播放视频,以及如何实现基本的录音功能。包括视频播放器的配置、全屏显示、全屏设置、布局设计、MediaController的使用、视频路径设置、启动播放、停止录音等功能的实现。同时,提供了在真机上的测试方法,确保功能在实际设备上正常工作。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

 

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<?xml version="1.0" encoding="utf-8"?>
2<LINEARLAYOUT xmlns: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<VIDEOVIEW android:layout_height="fill_parent" android:layout_width="fill_parent" android:id="@+id/VideoView01">
4</VIDEOVIEW>
5</LINEARLAYOUT>

4、MainVideo.java的内容如下:

01package android.basic.lesson28;
03import android.app.Activity;
04import android.net.Uri;
05import android.os.Bundle;
06import android.view.Window;
07import android.view.WindowManager;
08import android.widget.MediaController;
09import android.widget.VideoView;
11public class MainVideo extends Activity {
12    /** Called when the activity is first created. */
13    @Override
14    public void onCreate(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 = new MediaController(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<?xml version="1.0" encoding="utf-8"?>
2<LINEARLAYOUT xmlns: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    <BUTTON android:layout_height="wrap_content" android:layout_width="wrap_content" android:text="录音" android:textsize="30sp" android:id="@+id/Button01"></BUTTON>
5    <BUTTON android: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的代码如下:

01package android.tip.yaoyao;
03import java.io.File;
04import java.io.IOException;
05import java.util.Calendar;
06import java.util.Locale;
07  
08import android.app.Activity;
09import android.media.MediaRecorder;
10import android.os.Bundle;
11import android.text.format.DateFormat;
12import android.view.View;
13import android.widget.Button;
14import android.widget.Toast;
16public class MainActivity extends Activity {
18    private Button recordButton;
19    private Button stopButton;
21    private MediaRecorder mr;
23    @Override
24    public void onCreate(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(new View.OnClickListener() {
34            @Override
35            public void onClick(View v) {
37                File file = new File("/sdcard/"
38                        + "YY"
39                        + new DateFormat().format("yyyyMMdd_hhmmss",
40                                Calendar.getInstance(Locale.CHINA)) + ".amr");
41  
42                Toast.makeText(getApplicationContext(), "正在录音,录音文件在"+file.getAbsolutePath(), Toast.LENGTH_LONG)
43                        .show();
45                // 创建录音对象
46                mr = new MediaRecorder();
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(new View.OnClickListener() {
79            @Override
80            public void onClick(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<?xml version="1.0" encoding="utf-8"?>
02<MANIFEST xmlns:android="http://schemas.android.com/apk/res/android" android:versionname="1.0" android:versioncode="1" package="android.tip.yaoyao">
03    <APPLICATION android:icon="@drawable/icon" android:label="@string/app_name" android:debuggable="true">
04        <ACTIVITY android:label="@string/app_name" android:configchanges="orientation|keyboardHidden|keyboard" android:screenorientation="portrait" android:name=".MainActivity">
05            <INTENT -filter>
06                <ACTION android:name="android.intent.action.MAIN" />
07                <CATEGORY android:name="android.intent.category.LAUNCHER" />
08            </INTENT>
09        </ACTIVITY>
11    </APPLICATION>
12    <USES android:minsdkversion="4" -sdk />
14<USES android:name="android.permission.RECORD_AUDIO" -permission></USES>
15<USES android: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窗口直接抓取的,下图中右上角颜色最深的图标就是抓取真机截图的按钮:

未命名

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值