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. ...
随机推荐
- 推进"五通一平":手淘技术"三大容器 五大方案"首次整体亮相 百川开放升级
在云栖大会上,马云提出五个“新”,新零售.新制造.新金融.新技术和新能源,称将对各行各业造成巨大的影响,成为决定未来成败的关键.而五个新的实现,也必须是各行各业共同推进,整个生态共同受益的结果.继10 ...
- Adapter.notifyDataSetChanged()源码分析以及与ListView.setAdapter的区别
一直很好奇,notifyDataSetChanged究竟是重绘了整个ListView还是只重绘了被修改的那些Item,它与重新设置适配器即调用setAdapter的区别在哪里?所以特地追踪了一下源码, ...
- ASP.NET:插件化机制
概述 nopCommerce的插件机制的核心是使用BuildManager.AddReferencedAssembly将使用Assembly.Load加载的插件程序集添加到应用程序域的引用中.具体实现 ...
- 【LOJ】#2670. 「NOI2012」随机数生成器
题解 矩阵乘法,注意需要快速乘 矩阵2*2 a c 0 1 代码 #include <iostream> #include <algorithm> #include <c ...
- css如何画出类似原生的线条?
做前端的程序猿特别是移动端的,都很头疼遇到一种情况就是需要div底部加一个线条但是 1px的效果很粗,跟设计案上的不符合. 我的一个伙伴查找出来的一个解决方法: 在需要加上的线条的地方加上一个div ...
- Educational Codeforces Round 56 (Rated for Div. 2) F - Vasya and Array dp好题
F - Vasya and Array dp[ i ][ j ] 表示用了前 i 个数字并且最后一个数字是 j 的方案数. dp[ i ][ j ] = sumdp [i - 1 ][ j ], 这样 ...
- Ionic Js十四:浮动框
$ionicPopover $ionicPopover 是一个可以浮在app内容上的一个视图框. 实例 HTML 代码 <p> <button ng-click="open ...
- mysql (主从复制)(proxy , Amoeba)
原址如下: http://heylinux.com/archives/1004.html Mysql作为目前世界上使用最广泛的免费数据库,相信所有从事系统运维的工程师都一定接触过.但在实际的生产环境中 ...
- 一步一步写数据结构(BST-二叉排序树)
二叉排序树的重要性不用多说,下面用c++实现二叉排序树的建立,插入,查找,修改,和删除.难点在于删除,其他几个相对比较简单. 以下是代码: #include<iostream> using ...
- 洛谷P4645 [COCI2006-2007 Contest#7] BICIKLI [Tarjan,拓扑排序]
题目传送门 BICIKLI 题意翻译 给定一个有向图,n个点,m条边.请问,1号点到2号点有多少条路径?如果有无限多条,输出inf,如果有限,输出答案模10^9的余数. 两点之间可能有重边,需要看成是 ...