Android MediaPlayer本地视频播放器

2024-09-05 12:58

本文主要是介绍Android MediaPlayer本地视频播放器,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

该文章的目的是,让初学者能够快速掌握一个简单的本地视频播放器。该Demo中用到了SurfaceView、MediaPlayer。


实现效果图:

[html]  view plain copy 在CODE上查看代码片 派生到我的代码片
  1. <RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"  
  2.     xmlns:tools="http://schemas.android.com/tools"  
  3.     android:layout_width="match_parent"  
  4.     android:layout_height="match_parent"  
  5.     android:paddingBottom="@dimen/activity_vertical_margin"  
  6.     android:paddingLeft="@dimen/activity_horizontal_margin"  
  7.     android:paddingRight="@dimen/activity_horizontal_margin"  
  8.     android:paddingTop="@dimen/activity_vertical_margin"  
  9.     tools:context=".MainActivity" >  
  10.   
  11.     <TextView  
  12.         android:id="@+id/textView"  
  13.         android:layout_width="wrap_content"  
  14.         android:layout_height="wrap_content"  
  15.         android:layout_centerHorizontal="true"  
  16.         android:text="视频播放器SurfaceView实例" />  
  17.   
  18.     <SurfaceView  
  19.         android:id="@+id/sv"  
  20.         android:layout_width="match_parent"  
  21.         android:layout_height="320dp"  
  22.         android:layout_below="@id/textView" />  
  23.   
  24.     <SeekBar  
  25.         android:id="@+id/seekBar"  
  26.         android:layout_width="match_parent"  
  27.         android:layout_height="wrap_content"  
  28.         android:layout_below="@id/sv" />  
  29.   
  30.     <LinearLayout  
  31.         android:id="@+id/linearLayout"  
  32.         android:layout_width="match_parent"  
  33.         android:layout_height="wrap_content"  
  34.         android:layout_below="@id/seekBar"  
  35.         android:orientation="horizontal" >  
  36.   
  37.         <Button  
  38.             android:id="@+id/button_play"  
  39.             android:layout_width="0dp"  
  40.             android:layout_height="wrap_content"  
  41.             android:layout_weight="1"  
  42.             android:text="播放" />  
  43.   
  44.         <Button  
  45.             android:id="@+id/button_pause"  
  46.             android:layout_width="0dp"  
  47.             android:layout_height="wrap_content"  
  48.             android:layout_weight="1"  
  49.             android:text="暂停" />  
  50.   
  51.         <Button  
  52.             android:id="@+id/button_stop"  
  53.             android:layout_width="0dp"  
  54.             android:layout_height="wrap_content"  
  55.             android:layout_weight="1"  
  56.             android:text="停止" />  
  57.   
  58.         <Button  
  59.             android:id="@+id/button_replay"  
  60.             android:layout_width="0dp"  
  61.             android:layout_height="wrap_content"  
  62.             android:layout_weight="1"  
  63.             android:text="重播" />  
  64.     </LinearLayout>  
  65.   
  66. </RelativeLayout>  

[java]  view plain copy 在CODE上查看代码片 派生到我的代码片
  1. package com.surfaceviewdemo;  
  2.   
  3. import android.app.Activity;  
  4. import android.media.AudioManager;  
  5. import android.media.MediaPlayer;  
  6. import android.media.MediaPlayer.OnCompletionListener;  
  7. import android.media.MediaPlayer.OnErrorListener;  
  8. import android.media.MediaPlayer.OnPreparedListener;  
  9. import android.os.Bundle;  
  10. import android.view.SurfaceHolder;  
  11. import android.view.SurfaceHolder.Callback;  
  12. import android.view.SurfaceView;  
  13. import android.view.View;  
  14. import android.view.View.OnClickListener;  
  15. import android.widget.Button;  
  16. import android.widget.SeekBar;  
  17. import android.widget.SeekBar.OnSeekBarChangeListener;  
  18.   
  19. /** 
  20.  * 使用SurfaceView和MediaPlayer的本地视频播放器。 
  21.  *  
  22.  */  
  23. public class MainActivity extends Activity implements OnClickListener {  
  24.     private SurfaceView surfaceView;  
  25.     private Button button_play, button_pause, button_stop, button_replay;  
  26.     private MediaPlayer mediaPlayer;  
  27.     private SeekBar seekBar;  
  28.     private int currentPosition;  
  29.     private boolean isPlaying;  
  30.     @Override  
  31.     protected void onCreate(Bundle savedInstanceState) {  
  32.         super.onCreate(savedInstanceState);  
  33.         setContentView(R.layout.activity_main);  
  34.           
  35.         init();  
  36.   
  37.         initData();  
  38.     }  
  39.   
  40.     private void init() {  
  41.         button_play = (Button) findViewById(R.id.button_play);  
  42.         button_pause = (Button) findViewById(R.id.button_pause);  
  43.         button_stop = (Button) findViewById(R.id.button_stop);  
  44.         button_replay = (Button) findViewById(R.id.button_replay);  
  45.   
  46.         surfaceView = (SurfaceView) findViewById(R.id.sv);  
  47.         seekBar = (SeekBar) findViewById(R.id.seekBar);  
  48.         seekBar.setOnSeekBarChangeListener(new OnSeekBarChangeListener() {  
  49.               
  50.             @Override  
  51.             public void onStopTrackingTouch(SeekBar seekBar) {  
  52.                 int process = seekBar.getProgress();  
  53.                 if (mediaPlayer!=null && mediaPlayer.isPlaying()) {  
  54.                     mediaPlayer.seekTo(process);  
  55.                 }  
  56.             }  
  57.               
  58.             @Override  
  59.             public void onStartTrackingTouch(SeekBar seekBar) {  
  60.                   
  61.             }  
  62.               
  63.             @Override  
  64.             public void onProgressChanged(SeekBar seekBar, int progress,  
  65.                     boolean fromUser) {  
  66.                   
  67.             }  
  68.         });  
  69.     }  
  70.       
  71.     private void initData() {  
  72.         mediaPlayer = new MediaPlayer();  
  73.         surfaceView.getHolder().setType(SurfaceHolder.SURFACE_TYPE_PUSH_BUFFERS);//4.0一下的版本需要加该段代码。  
  74.           
  75.         surfaceView.getHolder().addCallback(new Callback() {  
  76.   
  77.             @Override  
  78.             public void surfaceDestroyed(SurfaceHolder holder) {  
  79.                 /** 
  80.                  * 当点击手机上home键(或其他使SurfaceView视图消失的键)时,调用该方法,获取到当前视频的播放值,currentPosition。 
  81.                  * 并停止播放。 
  82.                  */  
  83.                 currentPosition = mediaPlayer.getCurrentPosition();  
  84.                 stop();  
  85.             }  
  86.   
  87.             @Override  
  88.             public void surfaceCreated(SurfaceHolder holder) {  
  89.                 /** 
  90.                  * 当重新回到该视频应当视图的时候,调用该方法,获取到currentPosition,并从该currentPosition开始继续播放。 
  91.                  */  
  92.                 if (currentPosition > 0) {  
  93.                     play(currentPosition);  
  94.                 }  
  95.             }  
  96.   
  97.             @Override  
  98.             public void surfaceChanged(SurfaceHolder holder, int format,  
  99.                     int width, int height) {  
  100.   
  101.             }  
  102.         });  
  103.           
  104.         button_play.setOnClickListener(this);  
  105.         button_pause.setOnClickListener(this);  
  106.         button_stop.setOnClickListener(this);  
  107.         button_replay.setOnClickListener(this);  
  108.     }  
  109.   
  110.   
  111.   
  112.     @Override  
  113.     public void onClick(View v) {  
  114.         switch (v.getId()) {  
  115.         case R.id.button_play:  
  116.             /** 
  117.              * 播放 
  118.              */  
  119.             play(0);  
  120.   
  121.             break;  
  122.   
  123.         case R.id.button_pause:  
  124.             /** 
  125.              * 暂停 
  126.              */  
  127.             pause();  
  128.   
  129.             break;  
  130.   
  131.         case R.id.button_stop:  
  132.             /** 
  133.              * 停止 
  134.              */  
  135.             stop();  
  136.             break;  
  137.   
  138.         case R.id.button_replay:  
  139.             /** 
  140.              * 重播 
  141.              */  
  142.             replay();  
  143.             break;  
  144.   
  145.         default:  
  146.             break;  
  147.         }  
  148.     }  
  149.   
  150.     private void replay() {  
  151.         if (mediaPlayer.isPlaying()) {  
  152.             mediaPlayer.seekTo(0);  
  153.         } else {  
  154.             play(0);  
  155.         }  
  156.     }  
  157.   
  158.     private void stop() {  
  159.         if (mediaPlayer.isPlaying()) {  
  160.             mediaPlayer.stop();  
  161.             mediaPlayer.seekTo(0);  
  162.         }  
  163.   
  164.     }  
  165.   
  166.     private void pause() {  
  167.         if (mediaPlayer.isPlaying()) {  
  168.             mediaPlayer.pause();  
  169.         } else {  
  170.             mediaPlayer.start();  
  171.         }  
  172.   
  173.     }  
  174.   
  175.     private void play(final int currentPosition) {  
  176.         String path = "/mnt/sdcard2/1.mp4";//指定视频所在路径。  
  177. //      String path = "http://daily3gp.com/vids/family_guy_penis_car.3gp";//指定视频所在路径。  
  178.         mediaPlayer.setAudioStreamType(AudioManager.STREAM_MUSIC);//设置视频流类型  
  179.         try {  
  180.   
  181.             mediaPlayer.setDisplay(surfaceView.getHolder());  
  182.             mediaPlayer.setDataSource(path);  
  183.             mediaPlayer.prepareAsync();  
  184.               
  185.             mediaPlayer.setOnPreparedListener(new OnPreparedListener() {  
  186.   
  187.                 @Override  
  188.                 public void onPrepared(MediaPlayer mp) {  
  189.                     mediaPlayer.start();  
  190.                     int max = mediaPlayer.getDuration();  
  191.                     seekBar.setMax(max);  
  192.                     mediaPlayer.seekTo(currentPosition);  
  193.                       
  194.                     new Thread(){  
  195.                           
  196.                         public void run() {  
  197.                             isPlaying = true;  
  198.                             while (isPlaying) {  
  199.                                 int position = mediaPlayer.getCurrentPosition();  
  200.                                 seekBar.setProgress(position);  
  201.                                 try {  
  202.                                     Thread.sleep(500);  
  203.                                 } catch (InterruptedException e) {  
  204.                                     e.printStackTrace();  
  205.                                 }  
  206.                             }  
  207.                               
  208.                         };  
  209.                     }.start();  
  210.                 }  
  211.             });  
  212.               
  213.             mediaPlayer.setOnCompletionListener(new OnCompletionListener() {  
  214.   
  215.                 @Override  
  216.                 public void onCompletion(MediaPlayer mp) {  
  217.                     button_play.setEnabled(true);  
  218.                 }  
  219.             });  
  220.               
  221.             mediaPlayer.setOnErrorListener(new OnErrorListener() {  
  222.   
  223.                 @Override  
  224.                 public boolean onError(MediaPlayer mp, int what, int extra) {  
  225.                     button_play.setEnabled(true);  
  226.                     return false;  
  227.                 }  
  228.             });  
  229.         } catch (Exception e) {  
  230.             e.printStackTrace();  
  231.         }  
  232.     }  
  233.   
  234. }  

另外在线播放与本地播放的原理是一样的,在线播放测试的时候,只需在AndroidManifest.xml添加Internet的权限,在线播放的path,在文中已给出。另外,这只是相对简单的播放器,大家可在其基础上进行扩展,以达到大家的要求。

这篇关于Android MediaPlayer本地视频播放器的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/1139028

相关文章

Android 悬浮窗开发示例((动态权限请求 | 前台服务和通知 | 悬浮窗创建 )

《Android悬浮窗开发示例((动态权限请求|前台服务和通知|悬浮窗创建)》本文介绍了Android悬浮窗的实现效果,包括动态权限请求、前台服务和通知的使用,悬浮窗权限需要动态申请并引导... 目录一、悬浮窗 动态权限请求1、动态请求权限2、悬浮窗权限说明3、检查动态权限4、申请动态权限5、权限设置完毕后

0基础租个硬件玩deepseek,蓝耘元生代智算云|本地部署DeepSeek R1模型的操作流程

《0基础租个硬件玩deepseek,蓝耘元生代智算云|本地部署DeepSeekR1模型的操作流程》DeepSeekR1模型凭借其强大的自然语言处理能力,在未来具有广阔的应用前景,有望在多个领域发... 目录0基础租个硬件玩deepseek,蓝耘元生代智算云|本地部署DeepSeek R1模型,3步搞定一个应

Android里面的Service种类以及启动方式

《Android里面的Service种类以及启动方式》Android中的Service分为前台服务和后台服务,前台服务需要亮身份牌并显示通知,后台服务则有启动方式选择,包括startService和b... 目录一句话总结:一、Service 的两种类型:1. 前台服务(必须亮身份牌)2. 后台服务(偷偷干

Java如何获取视频文件的视频时长

《Java如何获取视频文件的视频时长》文章介绍了如何使用Java获取视频文件的视频时长,包括导入maven依赖和代码案例,同时,也讨论了在运行过程中遇到的SLF4J加载问题,并给出了解决方案... 目录Java获取视频文件的视频时长1、导入maven依赖2、代码案例3、SLF4J: Failed to lo

一文教你使用Python实现本地分页

《一文教你使用Python实现本地分页》这篇文章主要为大家详细介绍了Python如何实现本地分页的算法,主要针对二级数据结构,文中的示例代码简洁易懂,有需要的小伙伴可以了解下... 在项目开发的过程中,遇到分页的第一页就展示大量的数据,导致前端列表加载展示的速度慢,所以需要在本地加入分页处理,把所有数据先放

本地搭建DeepSeek-R1、WebUI的完整过程及访问

《本地搭建DeepSeek-R1、WebUI的完整过程及访问》:本文主要介绍本地搭建DeepSeek-R1、WebUI的完整过程及访问的相关资料,DeepSeek-R1是一个开源的人工智能平台,主... 目录背景       搭建准备基础概念搭建过程访问对话测试总结背景       最近几年,人工智能技术

如何在本地部署 DeepSeek Janus Pro 文生图大模型

《如何在本地部署DeepSeekJanusPro文生图大模型》DeepSeekJanusPro模型在本地成功部署,支持图片理解和文生图功能,通过Gradio界面进行交互,展示了其强大的多模态处... 目录什么是 Janus Pro1. 安装 conda2. 创建 python 虚拟环境3. 克隆 janus

Python实现多路视频多窗口播放功能

《Python实现多路视频多窗口播放功能》这篇文章主要为大家详细介绍了Python实现多路视频多窗口播放功能的相关知识,文中的示例代码讲解详细,有需要的小伙伴可以跟随小编一起学习一下... 目录一、python实现多路视频播放功能二、代码实现三、打包代码实现总结一、python实现多路视频播放功能服务端开

Python实现视频转换为音频的方法详解

《Python实现视频转换为音频的方法详解》这篇文章主要为大家详细Python如何将视频转换为音频并将音频文件保存到特定文件夹下,文中的示例代码讲解详细,感兴趣的小伙伴可以跟随小编一起学习一下... 目录1. python需求的任务2. Python代码的实现3. 代码修改的位置4. 运行结果5. 注意事项

本地私有化部署DeepSeek模型的详细教程

《本地私有化部署DeepSeek模型的详细教程》DeepSeek模型是一种强大的语言模型,本地私有化部署可以让用户在自己的环境中安全、高效地使用该模型,避免数据传输到外部带来的安全风险,同时也能根据自... 目录一、引言二、环境准备(一)硬件要求(二)软件要求(三)创建虚拟环境三、安装依赖库四、获取 Dee