andriod 播放mp4
- 权限
- <uses-permission android:name="android.permission.READ_EXTERNAL_STORAGE"/>
activity_main.xml //gisoracle 版权所有
- <?xml version="1.0" encoding="utf-8"?>
- <LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
- android:layout_width="match_parent"
- android:layout_height="match_parent"
- android:orientation="vertical">
- <LinearLayout
- android:layout_width="match_parent"
- android:layout_height="wrap_content"
- android:orientation="horizontal">
- <EditText
- android:id="@+id/et_path"
- android:layout_width="500px"
- android:layout_height="wrap_content"
- android:text="/sdcard/a.mp4" />
- <Button
- android:id="@+id/btn_browse"
- android:layout_width="0dip"
- android:layout_height="wrap_content"
- android:layout_weight="1"
- android:text="浏览" />
- </LinearLayout>
- <SeekBar
- android:id="@+id/seekBar"
- android:layout_width="match_parent"
- android:layout_height="wrap_content" />
- <LinearLayout
- android:layout_width="wrap_content"
- android:layout_height="wrap_content"
- android:orientation="horizontal">
- <Button
- android:id="@+id/btn_play"
- android:layout_width="0dip"
- android:layout_height="wrap_content"
- android:layout_weight="1"
- android:text="播放" />
- <Button
- android:id="@+id/btn_pause"
- android:layout_width="0dip"
- android:layout_height="wrap_content"
- android:layout_weight="1"
- android:text="暂停" />
- <Button
- android:id="@+id/btn_replay"
- android:layout_width="0dip"
- android:layout_height="wrap_content"
- android:layout_weight="1"
- android:text="重播" />
- <Button
- android:id="@+id/btn_stop"
- android:layout_width="0dip"
- android:layout_height="wrap_content"
- android:layout_weight="1"
- android:text="停止" />
- <TextView
- android:id="@+id/textView"
- android:layout_width="match_parent"
- android:layout_height="wrap_content"
- android:text="时间:" />
- </LinearLayout>
- <VideoView
- android:id="@+id/vv_videoview"
- android:layout_width="fill_parent"
- android:layout_height="fill_parent" />
- </LinearLayout>
java //gisoracle 版权所有
- package com.example.yanlei.myapplication;
- import android.media.MediaMetadataRetriever;
- import android.media.MediaPlayer;
- import android.support.v7.app.AppCompatActivity;
- import android.os.Bundle;
- import android.app.Activity;
- import android.content.Intent;
- import android.content.pm.ActivityInfo;
- import android.database.Cursor;
- import android.net.Uri;
- import android.os.Bundle;
- import android.provider.MediaStore;
- import android.support.v7.app.AppCompatActivity;
- import android.view.View;
- import android.widget.Button;
- import android.widget.EditText;
- import android.widget.SeekBar;
- import android.widget.TextView;
- import android.widget.Toast;
- import android.widget.VideoView;
- import android.app.Activity;
- import android.media.MediaPlayer;
- import android.media.MediaPlayer.OnCompletionListener;
- import android.media.MediaPlayer.OnErrorListener;
- import android.os.Bundle;
- import android.util.Log;
- import android.view.View;
- import android.widget.Button;
- import android.widget.EditText;
- import android.widget.SeekBar;
- import android.widget.Toast;
- import android.widget.VideoView;
- import android.widget.SeekBar.OnSeekBarChangeListener;
- import java.io.File;
- import java.util.HashMap;
- import android.os.Handler;
- public class MainActivity extends AppCompatActivity {
- private final String TAG = "main";
- private EditText et_path;
- private Button btn_play, btn_pause, btn_replay, btn_stop, btn_browse;
- private SeekBar seekBar;
- private VideoView vv_video;
- private boolean isPlaying;
- private TextView pTextView = null;
- private Handler handler = null;
- @Override
- protected void onCreate(Bundle savedInstanceState) {
- super.onCreate(savedInstanceState);
- setContentView(R.layout.activity_main);
- seekBar = (SeekBar) findViewById(R.id.seekBar);
- et_path = (EditText) findViewById(R.id.et_path);
- vv_video = (VideoView) findViewById(R.id.vv_videoview);
- pTextView = (TextView) findViewById(R.id.textView);
- btn_play = (Button) findViewById(R.id.btn_play);
- btn_pause = (Button) findViewById(R.id.btn_pause);
- btn_replay = (Button) findViewById(R.id.btn_replay);
- btn_stop = (Button) findViewById(R.id.btn_stop);
- btn_browse = (Button) findViewById(R.id.btn_browse);
- btn_play.setOnClickListener(click);
- btn_pause.setOnClickListener(click);
- btn_replay.setOnClickListener(click);
- btn_stop.setOnClickListener(click);
- btn_browse.setOnClickListener(click);
- // 为进度条添加进度更改事件
- seekBar.setOnSeekBarChangeListener(change);
- //创建属于主线程的handler
- handler = new Handler();
- }
- private OnSeekBarChangeListener change = new OnSeekBarChangeListener() {
- @Override
- public void onStopTrackingTouch(SeekBar seekBar) {
- // 当进度条停止修改的时候触发
- // 取得当前进度条的刻度
- int progress = seekBar.getProgress();
- if (vv_video != null && vv_video.isPlaying()) {
- // 设置当前播放的位置
- vv_video.seekTo(progress);
- }
- }
- @Override
- public void onStartTrackingTouch(SeekBar seekBar) {
- }
- @Override
- public void onProgressChanged(SeekBar seekBar, int progress,
- boolean fromUser) {
- }
- };
- private View.OnClickListener click = new View.OnClickListener() {
- @Override
- public void onClick(View v) {
- switch (v.getId()) {
- case R.id.btn_play:
- play(0);
- break;
- case R.id.btn_pause:
- pause();
- break;
- case R.id.btn_replay:
- replay();
- break;
- case R.id.btn_stop:
- stop();
- break;
- case R.id.btn_browse:
- browse();
- break;
- default:
- break;
- }
- }
- };
- //获得MP4时长
- private int getTimeLong(String videoPath) {
- MediaMetadataRetriever retr = new MediaMetadataRetriever();
- retr.setDataSource(videoPath);
- //String height = retr.extractMetadata(MediaMetadataRetriever.METADATA_KEY_VIDEO_HEIGHT); // 视频高度
- //String width = retr.extractMetadata(MediaMetadataRetriever.METADATA_KEY_VIDEO_WIDTH); // 视频宽度
- //String rotation = retr.extractMetadata(MediaMetadataRetriever.METADATA_KEY_VIDEO_ROTATION); // 视频旋转方向
- String timelong = retr.extractMetadata(MediaMetadataRetriever.METADATA_KEY_DURATION);//时长,单位为毫秒
- retr.release();
- int l = Integer.parseInt(timelong);
- return l;
- }
- String myText = "";
- protected void play(int msec) {
- Log.i(TAG, " 获取视频文件地址");
- String path = et_path.getText().toString().trim();
- File file = new File(path);
- if (!file.exists()) {
- Toast.makeText(this, "视频文件路径错误", 0).show();
- return;
- }
- Log.i(TAG, "指定视频源路径");
- vv_video.setVideoPath(file.getAbsolutePath());
- Log.i(TAG, "开始播放");
- vv_video.start();
- // 按照初始位置播放
- vv_video.seekTo(msec);
- // 设置进度条的最大进度为视频流的最大播放时长
- final int time = getTimeLong(file.getAbsolutePath()) / 100;
- seekBar.setMax(time);
- Toast.makeText(this, "长度:" + time, Toast.LENGTH_LONG).show();
- // 开始线程,更新进度条的刻度
- new Thread() {
- @Override
- public void run() {
- try {
- isPlaying = true;
- while (isPlaying) {
- // 如果正在播放,0.1.毫秒更新一次进度条
- final int current = vv_video.getCurrentPosition() / 100;
- seekBar.setProgress(current);
- /* try {
- myText = "总时间:" + time / 10 + "秒,目前:" + current / 10 + "秒";
- // pTextView.setText("总时间:" + time / 10 + "秒,目前:" + current / 10 + "秒");
- new WorkThread().start();
- } catch (Exception ex) {
- Log.d("错误:", ex.getMessage().toString());
- }*/
- new Thread() {
- public void run() {
- myText = "总时间:" + time / 10 + "秒,目前:" + current / 10 + "秒";
- handler.post(updateUIRunnable);
- }
- }.start();
- //Toast.makeText(this, "当前:"+current,Toast.LENGTH_LONG).show();
- sleep(100);
- }
- } catch (Exception e) {
- e.printStackTrace();
- }
- }
- }.start();
- // 播放之后设置播放按钮不可用
- btn_play.setEnabled(false);
- vv_video.setOnCompletionListener(new OnCompletionListener() {
- @Override
- public void onCompletion(MediaPlayer mp) {
- // 在播放完毕被回调
- btn_play.setEnabled(true);
- }
- });
- vv_video.setOnErrorListener(new OnErrorListener() {
- @Override
- public boolean onError(MediaPlayer mp, int what, int extra) {
- // 发生错误重新播放
- play(0);
- isPlaying = false;
- return false;
- }
- });
- }
- // 构建Runnable对象,并在runnable中更新UI
- Runnable updateUIRunnable = new Runnable() {
- @Override
- public void run() {
- try {
- pTextView.setText(myText);
- } catch (Exception ex) {
- Log.e("严重错误:", ex.getMessage().toString());
- }
- }
- };
- /**
- * 重新开始播放
- */
- protected void replay() {
- if (vv_video != null && vv_video.isPlaying()) {
- vv_video.seekTo(0);
- Toast.makeText(this, "重新播放", 0).show();
- btn_pause.setText("暂停");
- return;
- }
- isPlaying = false;
- play(0);
- }
- protected void browse() {
- Intent it = new Intent(Intent.ACTION_GET_CONTENT); //创建动作为 "选取" 的 Intent
- it.setType("video/*"); //要选取所有视频类型
- startActivityForResult(it, 101);
- }
- protected void onActivityResult(int requestCode, int resultCode, Intent data) {
- super.onActivityResult(requestCode, resultCode, data);
- if (resultCode == Activity.RESULT_OK) {
- Uri uri = convertUri(data.getData()); //获取选取文件的 Uri 并进行 Uri 格式转换
- et_path.setText(uri.getPath()); //显示文件名 (Uri 最后的节点文字)
- // txvUri.setText("文件位置:" + uri.getPath());//显示文件的路径
- }
- }
- Uri convertUri(Uri uri) { //将 "content://" 类型的 Uri 转换为 "file://" 的 Uri
- if (uri.toString().substring(0, 7).equals("content")) { //如果是以 "content" 开头
- String[] colName = {MediaStore.MediaColumns.DATA}; //声明要查询的字段
- Cursor cursor = getContentResolver().query(uri, colName, //以 uri 进行查询
- null, null, null);
- cursor.moveToFirst(); //移到查询结果的第一个记录
- uri = Uri.parse("file://" + cursor.getString(0)); //将路径转为 Uri
- cursor.close(); //关闭查询结果
- }
- return uri; //返回 Uri 对象
- }
- /**
- * 暂停或继续
- */
- protected void pause() {
- if (btn_pause.getText().toString().trim().equals("继续")) {
- btn_pause.setText("暂停");
- vv_video.start();
- Toast.makeText(this, "继续播放", 0).show();
- return;
- }
- if (vv_video != null && vv_video.isPlaying()) {
- vv_video.pause();
- btn_pause.setText("继续");
- Toast.makeText(this, "暂停播放", 0).show();
- }
- }
- /*
- * 停止播放
- */
- protected void stop() {
- if (vv_video != null && vv_video.isPlaying()) {
- vv_video.stopPlayback();
- btn_play.setEnabled(true);
- isPlaying = false;
- }
- }
- }
andriod 播放mp4的更多相关文章
- video.js播放mp4文件
HTML5的标签 video 支持的mp4编码为视频编码 H.264 音频AAC 参考网址 http://www.w3school.com.cn/html5/html_5_video.asp 视频格式 ...
- 关于Windows2008服务器设置MIME后仍然无法播放MP4的解决方法
最近遇到了一个非常邪门的故障,重新安装了Windows2008服务器后 Mp4无法正常播放: 整个互联网中关于设置MP4的方法基本都是教你如何在IIS中设置MIME 本文讨论的不是如何教你设置MIME ...
- cocos2d-x 3.0 播放MP4视频
猴子原创,欢迎转载.转载请注明: 转载自Cocos2D开发网–Cocos2Dev.com,谢谢! 原文地址: http://www.cocos2dev.com/?p=545 很久以前写的一个2dx播放 ...
- 解决html5中video标签无法播放mp4问题的办法
这篇文章主要给大家介绍了关于解决html5中video标签无法播放mp4问题的办法,文中介绍的非常详细,相信会对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面来一起看看吧. 最近发现了一个 ...
- 视频播放效果--video.js播放mp4文件
HTML5的标签 video 支持的mp4编码为视频编码 H.264 音频AAC 参考网址 http://www.w3school.com.cn/html5/html_5_video.asp 视频格式 ...
- html5播放mp4视频代码
1.nginx支持flv和mp4格式播放 默认yum安装nginx centos7安装nginx时候应该是默认安装nginx_mod_h264_streaming模块的 # nginx -V查看是否安 ...
- html制作简单框架网页二 实现自己的影音驿站 操作步骤及源文件下载 (可播放mp4、avi、mpg、asx、swf各种文件的视频播放代码)
新增视频播放功能如下图: 左侧网页left.html代码如下: <meta charset="utf-8"> <body style="backgrou ...
- Html 播放 mp4格式视频提示 没有发现支持的视频格式和mime类型
转自原文 Html 播放 mp4格式视频提示 没有发现支持的视频格式和mime类型 播放mp4格式的时候提示 Html 播放 mp4格式视频提示 没有发现支持的视频格式和mime类型 原因是在IIS中 ...
- 在线播放mp4
在线播放mp4 1.准备好支持再网页上播放的mp4格式 AVC(h264) 格式的mp4 2.用ckplayer控制播放 (1)到ckplayer下载js.如:http://www.ckplayer. ...
随机推荐
- GreenPlum学习笔记:split_part与string_to_array字符截取
偶遇一个需求:想按某个指定符号分割之后,提取字符. 例如:tag = '休闲,娱乐,运动,玩耍',想提取"休闲"这个词. 方法一:string_to_array select st ...
- GUC-9 ReadWriteLock : 读写锁
import java.util.concurrent.locks.ReadWriteLock; import java.util.concurrent.locks.ReentrantReadWrit ...
- Hive(一)Hive初识
一 Hive 简介 什么是Hive 1.Hive 由 Facebook 实现并开源 2.是基于 Hadoop 的一个数据仓库工具 3.可以将结构化的数据映射为一张数据库表 4.并提供 HQL(Hive ...
- 百度Webuploader 大文件分片上传(.net接收)
前阵子要做个大文件上传的功能,找来找去发现Webuploader还不错,关于她的介绍我就不再赘述. 动手前,在园子里找到了一篇不错的分片上传的帖子,参考之后,踏出了第一步.此文记录我这次实践的点滴,仅 ...
- Git 简史
同生活中的许多伟大事件一样,Git 诞生于一个极富纷争大举创新的年代.Linux 内核开源项目有着为数众广的参与者.绝大多数的 Linux 内核维护工作都花在了提交补丁和保存归档的繁琐事务上(1991 ...
- js constructor 和 instanceof
说到这两个属性,那不得不说一下_proto_这个属性,通常这个属性是隐藏属性,是不允许被暴露的,而某些浏览器为了开发者能够很好的理解,而将这个属性暴露出来,比如Mozilla FireFox,这就是为 ...
- Android手机系统设置页面跳转
android.provider.Settings. 1. ACTION_ACCESSIBILITY_SETTINGS : // 跳转系统的辅助功能界面 Intent intent = ne ...
- 一个人也可以建立 TCP 连接呢
今天(恰巧是今天)看到有人在 SegmentFault 上问「TCP server 为什么一个端口可以建立多个连接?」.提问者认为 client 端就不能使用相同的本地端口了.理论上来说,确定一条链路 ...
- [ 转载 ] Java基础11--Java总结篇系列:Java泛型
一. 泛型概念的提出(为什么需要泛型)? 首先,我们看下下面这段简短的代码: 1 public class GenericTest { 2 3 public static void main(Stri ...
- requests爬取百度音乐
使用requests爬取百度音乐,我想把当前热门歌手的音乐信息爬下来. 首先进行url分析,可以看到: 歌手网页: 薛之谦网页: 可以看到,似乎这些路劲的获取一切都很顺利,然后可以写代码: # -*- ...