Android -- 视频音频多媒体播放,在线播放, MediaPlayer, SurfaceView, SoundPool, Timer定时器使用

本文主要是介绍Android -- 视频音频多媒体播放,在线播放, MediaPlayer, SurfaceView, SoundPool, Timer定时器使用,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

1. SoundPool 用于快速重复的播放短音频

[java]  view plain copy 在CODE上查看代码片 派生到我的代码片
  1. public class MainActivity extends Activity {  
  2.     private SoundPool soundPool;  
  3.     private int soundId;  
  4.   
  5.     @Override  
  6.     protected void onCreate(Bundle savedInstanceState) {  
  7.         super.onCreate(savedInstanceState);  
  8.         setContentView(R.layout.activity_main);  
  9.         soundPool = new SoundPool(10, AudioManager.STREAM_MUSIC, 0);  
  10.         // 把声音资源预先加载到声音池, load为异步方法  
  11.         //声音资源放到 res/raw目录下, raw名字须固定  
  12.         soundId = soundPool.load(this, R.raw.ring, 1);  
  13.     }  
  14.   
  15.     public void click(View view) {  
  16.         soundPool.play(soundId, 1.0f, 1.0f, 001.0f);  
  17.     }  
  18.   
  19. }  

 

2. 视频播放示例代码 (播放暂停,进度条拖放等功能)

输入的路径不仅可以是本地的视频路径,也可以是一个网络视频路径,播放器会自动在线播放,不过需要添加Internet权限

activity_main.xml 布局文件

[html]  view plain copy 在CODE上查看代码片 派生到我的代码片
  1. <LinearLayout 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:orientation="vertical"  
  6.     tools:context=".MainActivity" >  
  7.   
  8.     <EditText  
  9.         android:text="/sdcard/oppo.mp4"  
  10.         android:id="@+id/et_path"  
  11.         android:layout_width="match_parent"  
  12.         android:layout_height="wrap_content"  
  13.         android:hint="请输入视频文件的路径" />  
  14.   
  15.     <LinearLayout  
  16.         android:layout_width="match_parent"  
  17.         android:layout_height="wrap_content"  
  18.         android:orientation="horizontal" >  
  19.   
  20.         <Button  
  21.             android:id="@+id/bt_play"  
  22.             android:layout_width="0dip"  
  23.             android:layout_height="wrap_content"  
  24.             android:layout_weight="1"  
  25.             android:text="播放" />  
  26.   
  27.         <Button  
  28.             android:id="@+id/bt_pause"  
  29.             android:layout_width="0dip"  
  30.             android:layout_height="wrap_content"  
  31.             android:layout_weight="1"  
  32.             android:text="暂停" />  
  33.   
  34.         <Button  
  35.             android:id="@+id/bt_replay"  
  36.             android:layout_width="0dip"  
  37.             android:layout_height="wrap_content"  
  38.             android:layout_weight="1"  
  39.             android:text="重播" />  
  40.   
  41.         <Button  
  42.             android:id="@+id/bt_stop"  
  43.             android:layout_width="0dip"  
  44.             android:layout_height="wrap_content"  
  45.             android:layout_weight="1"  
  46.             android:text="停止" />  
  47.     </LinearLayout>  
  48.   
  49.     <SeekBar  
  50.         android:id="@+id/seek_bar"  
  51.         android:layout_width="match_parent"  
  52.         android:layout_height="wrap_content" />  
  53.   
  54.     <SurfaceView  
  55.         android:id="@+id/sv"  
  56.         android:layout_width="fill_parent"  
  57.         android:layout_height="fill_parent" />  
  58.   
  59. </LinearLayout>  

MainActivity.java

[java]  view plain copy 在CODE上查看代码片 派生到我的代码片
  1. import java.io.File;  
  2. import java.io.IOException;  
  3. import java.util.Timer;  
  4. import java.util.TimerTask;  
  5.   
  6. import android.media.AudioManager;  
  7. import android.media.MediaPlayer;  
  8. import android.os.Bundle;  
  9. import android.app.Activity;  
  10. import android.view.Menu;  
  11. import android.view.SurfaceHolder;  
  12. import android.view.SurfaceHolder.Callback;  
  13. import android.view.SurfaceView;  
  14. import android.view.View;  
  15. import android.view.View.OnClickListener;  
  16. import android.widget.Button;  
  17. import android.widget.EditText;  
  18. import android.widget.SeekBar;  
  19. import android.widget.SeekBar.OnSeekBarChangeListener;  
  20. import android.widget.Toast;  
  21.   
  22. public class MainActivity extends Activity implements OnClickListener {  
  23.     private Button bt_play;  
  24.     private Button bt_replay;  
  25.     private Button bt_stop;  
  26.     private Button bt_pause;  
  27.     private EditText et_path;  
  28.     private SurfaceView sv;  
  29.   
  30.     private MediaPlayer mediaPlayer;  
  31.   
  32.     private int position;  
  33.   
  34.     private SeekBar seek_bar;  
  35.   
  36.     private Timer timer;  
  37.     private TimerTask task;  
  38.   
  39.     @Override  
  40.     protected void onCreate(Bundle savedInstanceState) {  
  41.         super.onCreate(savedInstanceState);  
  42.         setContentView(R.layout.activity_main);  
  43.         bt_play = (Button) findViewById(R.id.bt_play);  
  44.         bt_replay = (Button) findViewById(R.id.bt_replay);  
  45.         bt_stop = (Button) findViewById(R.id.bt_stop);  
  46.         bt_pause = (Button) findViewById(R.id.bt_pause);  
  47.         sv = (SurfaceView) findViewById(R.id.sv);  
  48.         seek_bar = (SeekBar) findViewById(R.id.seek_bar);  
  49.           
  50.         seek_bar.setOnSeekBarChangeListener(new OnSeekBarChangeListener() {  
  51.               
  52.             @Override  
  53.             public void onStopTrackingTouch(SeekBar seekBar) {  
  54.                 if(mediaPlayer!=null){  
  55.                     mediaPlayer.seekTo(seekBar.getProgress());  
  56.                 }  
  57.             }  
  58.               
  59.             @Override  
  60.             public void onStartTrackingTouch(SeekBar seekBar) {  
  61.                   
  62.             }  
  63.               
  64.             @Override  
  65.             public void onProgressChanged(SeekBar seekBar, int progress,  
  66.                     boolean fromUser) {  
  67.       
  68.                   
  69.             }  
  70.         });  
  71.           
  72.         /* 下面设置Surface不维护自己的缓冲区,而是等待屏幕的渲染引擎将内容推送到用户面前 */  
  73.         sv.getHolder().setType(SurfaceHolder.SURFACE_TYPE_PUSH_BUFFERS);  
  74.   
  75.         sv.getHolder().addCallback(new Callback() {  
  76.   
  77.             @Override  
  78.             public void surfaceDestroyed(SurfaceHolder holder) {  
  79.                 System.out.println("holder 被销毁了.");  
  80.                 if (mediaPlayer != null && mediaPlayer.isPlaying()) {  
  81.                     position = mediaPlayer.getCurrentPosition();  
  82.                     stop();  
  83.                 }  
  84.             }  
  85.   
  86.             @Override  
  87.             public void surfaceCreated(SurfaceHolder holder) {  
  88.                 System.out.println("holder 被创建了.");  
  89.                 if (position != 0) {  
  90.                     play();  
  91.                     mediaPlayer.seekTo(position);  
  92.                 }  
  93.   
  94.             }  
  95.   
  96.             // 主要是当holder的大小发生变化的时候 调用  
  97.             @Override  
  98.             public void surfaceChanged(SurfaceHolder holder, int format,  
  99.                     int width, int height) {  
  100.   
  101.             }  
  102.         });  
  103.   
  104.         bt_play.setOnClickListener(this);  
  105.         bt_replay.setOnClickListener(this);  
  106.         bt_stop.setOnClickListener(this);  
  107.         bt_pause.setOnClickListener(this);  
  108.   
  109.         et_path = (EditText) findViewById(R.id.et_path);  
  110.     }  
  111.   
  112.     @Override  
  113.     public void onClick(View v) {  
  114.         switch (v.getId()) {  
  115.         case R.id.bt_play:  
  116.             play();  
  117.             break;  
  118.         case R.id.bt_replay:  
  119.             replay();  
  120.             break;  
  121.         case R.id.bt_stop:  
  122.             stop();  
  123.             break;  
  124.         case R.id.bt_pause:  
  125.             pause();  
  126.             break;  
  127.         }  
  128.   
  129.     }  
  130.   
  131.     /** 
  132.      * 重新播放 
  133.      */  
  134.     private void replay() {  
  135.         if (mediaPlayer != null && mediaPlayer.isPlaying()) {  
  136.             mediaPlayer.seekTo(0);  
  137.         } else {  
  138.             play();  
  139.         }  
  140.   
  141.     }  
  142.   
  143.     /** 
  144.      * 停止播放 
  145.      */  
  146.     private void stop() {  
  147.         if (mediaPlayer != null && mediaPlayer.isPlaying()) {  
  148.             mediaPlayer.stop();  
  149.             mediaPlayer.release();  
  150.   
  151.             mediaPlayer = null;  
  152.             bt_play.setEnabled(true);  
  153.             if (timer != null && task != null) {  
  154.                 timer.cancel();  
  155.                 task.cancel();  
  156.                 timer = null;  
  157.                 task = null;  
  158.             }  
  159.   
  160.         }  
  161.   
  162.     }  
  163.   
  164.     /** 
  165.      * 暂停播放 
  166.      */  
  167.     private void pause() {  
  168.   
  169.         if (mediaPlayer != null && mediaPlayer.isPlaying()) {  
  170.             // 暂停播放  
  171.             mediaPlayer.pause();  
  172.             bt_pause.setText("继续");  
  173.             return;  
  174.         }  
  175.   
  176.         if (mediaPlayer != null) {  
  177.             if ("继续".equals(bt_pause.getText().toString())) {  
  178.                 mediaPlayer.start();  
  179.                 bt_pause.setText("暂停");  
  180.                 return;  
  181.             }  
  182.         }  
  183.   
  184.     }  
  185.   
  186.     /** 
  187.      * 播放 
  188.      */  
  189.     private void play() {  
  190.         String path = et_path.getText().toString().trim();  
  191.         File file = new File(path);  
  192.         //添加判断条件,如果路径带http 网路视频在线播放  
  193.         if ( (file.exists() && file.length() > 0) || path.contains("http")) {  
  194.             try {  
  195.                 mediaPlayer = new MediaPlayer();  
  196.                 mediaPlayer.reset();// 重置为初始状态  
  197.                 mediaPlayer.setAudioStreamType(AudioManager.STREAM_MUSIC);  
  198.                 /* 设置Video影片以SurfaceHolder播放 */  
  199.                 mediaPlayer.setDisplay(sv.getHolder());  
  200.                 mediaPlayer.setDataSource(path);  
  201.                 //prepare同步准备  
  202.                 //prepareAsync为异步准备,不会阻塞主线程,需要注册OnPrepareListener, 并在其中执行start()  
  203.                 mediaPlayer.prepare();  
  204.                 mediaPlayer.start();// 播放  
  205.                   
  206.                 int max = mediaPlayer.getDuration();  
  207.                 seek_bar.setMax(max);  
  208.                 // 创建一个定时器  
  209.                 timer = new Timer();  
  210.                 // 创建一个定时器执行的任务  
  211.                 task = new TimerTask() {  
  212.                     @Override  
  213.                     public void run() {  
  214.                         int position = mediaPlayer.getCurrentPosition();  
  215.                         seek_bar.setProgress(position);  
  216.                     }  
  217.                 };  
  218.                 timer.schedule(task, 01000);  
  219.             } catch (Exception e) {  
  220.                 e.printStackTrace();  
  221.                 Toast.makeText(this"播放失败"1).show();  
  222.             }  
  223.         }  
  224.   
  225.     }  
  226.   
  227. }  

 

3. 音频播放示例:类似于视频播放

MainActivity.java

[java]  view plain copy 在CODE上查看代码片 派生到我的代码片
  1. import java.io.File;  
  2. import java.io.IOException;  
  3.   
  4. import android.app.Activity;  
  5. import android.media.AudioManager;  
  6. import android.media.MediaPlayer;  
  7. import android.media.MediaPlayer.OnCompletionListener;  
  8. import android.media.MediaPlayer.OnErrorListener;  
  9. import android.media.MediaPlayer.OnPreparedListener;  
  10. import android.os.Bundle;  
  11. import android.telephony.PhoneStateListener;  
  12. import android.telephony.TelephonyManager;  
  13. import android.view.View;  
  14. import android.view.View.OnClickListener;  
  15. import android.widget.Button;  
  16. import android.widget.EditText;  
  17. import android.widget.Toast;  
  18.   
  19. public class MainActivity extends Activity implements OnClickListener {  
  20.     private Button bt_play;  
  21.     private Button bt_replay;  
  22.     private Button bt_stop;  
  23.     private Button bt_pause;  
  24.     private EditText et_path;  
  25.   
  26.     private MediaPlayer mediaPlayer;  
  27.       
  28.       
  29.     private TelephonyManager tm;  
  30.   
  31.     @Override  
  32.     protected void onCreate(Bundle savedInstanceState) {  
  33.         super.onCreate(savedInstanceState);  
  34.         setContentView(R.layout.activity_main);  
  35.         bt_play = (Button) findViewById(R.id.bt_play);  
  36.         bt_replay = (Button) findViewById(R.id.bt_replay);  
  37.         bt_stop = (Button) findViewById(R.id.bt_stop);  
  38.         bt_pause = (Button) findViewById(R.id.bt_pause);  
  39.   
  40.         bt_play.setOnClickListener(this);  
  41.         bt_replay.setOnClickListener(this);  
  42.         bt_stop.setOnClickListener(this);  
  43.         bt_pause.setOnClickListener(this);  
  44.   
  45.         et_path = (EditText) findViewById(R.id.et_path);  
  46.           
  47.         tm = (TelephonyManager) getSystemService(TELEPHONY_SERVICE);  
  48.         tm.listen(new MyListener(), PhoneStateListener.LISTEN_CALL_STATE);  
  49.   
  50.     }  
  51.   
  52.     private class MyListener extends PhoneStateListener{  
  53.   
  54.         @Override  
  55.         public void onCallStateChanged(int state, String incomingNumber) {  
  56.             switch (state) {  
  57.             case TelephonyManager.CALL_STATE_RINGING:  
  58.                 pause();  
  59.                 break;  
  60.   
  61.             case TelephonyManager.CALL_STATE_IDLE:  
  62.                 pause();  
  63.                 break;  
  64.             }  
  65.               
  66.               
  67.               
  68.             super.onCallStateChanged(state, incomingNumber);  
  69.         }  
  70.           
  71.     }  
  72.       
  73.       
  74.     @Override  
  75.     public void onClick(View v) {  
  76.   
  77.         switch (v.getId()) {  
  78.         case R.id.bt_play:  
  79.             play();  
  80.             break;  
  81.         case R.id.bt_replay:  
  82.             replay();  
  83.             break;  
  84.         case R.id.bt_stop:  
  85.             stop();  
  86.             break;  
  87.         case R.id.bt_pause:  
  88.             pause();  
  89.             break;  
  90.         }  
  91.   
  92.     }  
  93.   
  94.     /** 
  95.      * 重新播放 
  96.      */  
  97.     private void replay() {  
  98.         if (mediaPlayer != null && mediaPlayer.isPlaying()) {  
  99.             mediaPlayer.seekTo(0);  
  100.         }else{  
  101.             play();  
  102.         }  
  103.           
  104.     }  
  105.   
  106.     /** 
  107.      * 停止播放 
  108.      */  
  109.     private void stop() {  
  110.         if (mediaPlayer != null && mediaPlayer.isPlaying()) {  
  111.             mediaPlayer.stop();  
  112.             mediaPlayer.release();  
  113.               
  114.             mediaPlayer = null;  
  115.             bt_play.setEnabled(true);  
  116.         }  
  117.   
  118.     }  
  119.   
  120.     /** 
  121.      * 暂停播放 
  122.      */  
  123.     private void pause() {  
  124.   
  125.         if (mediaPlayer != null && mediaPlayer.isPlaying()) {  
  126.             // 暂停播放  
  127.             mediaPlayer.pause();  
  128.             bt_pause.setText("继续");  
  129.             return;  
  130.         }  
  131.   
  132.         if (mediaPlayer != null) {  
  133.             if ("继续".equals(bt_pause.getText().toString())) {  
  134.                 mediaPlayer.start();  
  135.                 bt_pause.setText("暂停");  
  136.                 return;  
  137.             }  
  138.         }  
  139.   
  140.     }  
  141.   
  142.     /** 
  143.      * 处理播放 
  144.      */  
  145.     private void play() {  
  146.         String path = et_path.getText().toString().trim();  
  147.         File file = new File(path);  
  148.         if (file.exists() && file.length() > 0) {  
  149.             try {  
  150.                 mediaPlayer = new MediaPlayer();  
  151.                 mediaPlayer.setAudioStreamType(AudioManager.STREAM_MUSIC);  
  152.                 mediaPlayer.setDataSource(path);  
  153.                 //mediaPlayer.setLooping(looping);  
  154.               
  155.                 //播放完毕后的 事件监听器  
  156.                 mediaPlayer.setOnCompletionListener(new OnCompletionListener() {  
  157.                     @Override  
  158.                     public void onCompletion(MediaPlayer mp) {  
  159.                         bt_play.setEnabled(true);  
  160.                     }  
  161.                 });  
  162.                 mediaPlayer.setOnErrorListener(new OnErrorListener() {  
  163.                     @Override  
  164.                     public boolean onError(MediaPlayer mp, int what, int extra) {  
  165.                         bt_play.setEnabled(true);  
  166.                         Toast.makeText(MainActivity.this"音乐文件错误"0).show();  
  167.                         return false;  
  168.                     }  
  169.                 });  
  170.             //  mediaPlayer.prepare();//同步准备.  
  171.                 mediaPlayer.prepareAsync();//异步准备 在一个新的子线程里面准备  
  172.                 //通知用户缓存中...  
  173.                 mediaPlayer.setOnPreparedListener(new OnPreparedListener() {  
  174.                       
  175.                     @Override  
  176.                     public void onPrepared(MediaPlayer mp) {  
  177.                         //通知用户开始播放...  
  178.                         mediaPlayer.start();  
  179.                     }  
  180.                 });  
  181.                   
  182.                   
  183.                   
  184.                 bt_play.setEnabled(false);  
  185.                   
  186.             } catch (Exception e) {  
  187.                 e.printStackTrace();  
  188.                 Toast.makeText(this"播放音乐失败"0).show();  
  189.             }  
  190.         } else {  
  191.             Toast.makeText(this"音乐文件不存在"0).show();  
  192.         }  
  193.   
  194.     }  
  195.   
  196. }  

这篇关于Android -- 视频音频多媒体播放,在线播放, MediaPlayer, SurfaceView, SoundPool, Timer定时器使用的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



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

相关文章

流媒体平台/视频监控/安防视频汇聚EasyCVR播放暂停后视频画面黑屏是什么原因?

视频智能分析/视频监控/安防监控综合管理系统EasyCVR视频汇聚融合平台,是TSINGSEE青犀视频垂直深耕音视频流媒体技术、AI智能技术领域的杰出成果。该平台以其强大的视频处理、汇聚与融合能力,在构建全栈视频监控系统中展现出了独特的优势。视频监控管理系统EasyCVR平台内置了强大的视频解码、转码、压缩等技术,能够处理多种视频流格式,并以多种格式(RTMP、RTSP、HTTP-FLV、WebS

中文分词jieba库的使用与实景应用(一)

知识星球:https://articles.zsxq.com/id_fxvgc803qmr2.html 目录 一.定义: 精确模式(默认模式): 全模式: 搜索引擎模式: paddle 模式(基于深度学习的分词模式): 二 自定义词典 三.文本解析   调整词出现的频率 四. 关键词提取 A. 基于TF-IDF算法的关键词提取 B. 基于TextRank算法的关键词提取

使用SecondaryNameNode恢复NameNode的数据

1)需求: NameNode进程挂了并且存储的数据也丢失了,如何恢复NameNode 此种方式恢复的数据可能存在小部分数据的丢失。 2)故障模拟 (1)kill -9 NameNode进程 [lytfly@hadoop102 current]$ kill -9 19886 (2)删除NameNode存储的数据(/opt/module/hadoop-3.1.4/data/tmp/dfs/na

Hadoop数据压缩使用介绍

一、压缩原则 (1)运算密集型的Job,少用压缩 (2)IO密集型的Job,多用压缩 二、压缩算法比较 三、压缩位置选择 四、压缩参数配置 1)为了支持多种压缩/解压缩算法,Hadoop引入了编码/解码器 2)要在Hadoop中启用压缩,可以配置如下参数

Makefile简明使用教程

文章目录 规则makefile文件的基本语法:加在命令前的特殊符号:.PHONY伪目标: Makefilev1 直观写法v2 加上中间过程v3 伪目标v4 变量 make 选项-f-n-C Make 是一种流行的构建工具,常用于将源代码转换成可执行文件或者其他形式的输出文件(如库文件、文档等)。Make 可以自动化地执行编译、链接等一系列操作。 规则 makefile文件

使用opencv优化图片(画面变清晰)

文章目录 需求影响照片清晰度的因素 实现降噪测试代码 锐化空间锐化Unsharp Masking频率域锐化对比测试 对比度增强常用算法对比测试 需求 对图像进行优化,使其看起来更清晰,同时保持尺寸不变,通常涉及到图像处理技术如锐化、降噪、对比度增强等 影响照片清晰度的因素 影响照片清晰度的因素有很多,主要可以从以下几个方面来分析 1. 拍摄设备 相机传感器:相机传

综合安防管理平台LntonAIServer视频监控汇聚抖动检测算法优势

LntonAIServer视频质量诊断功能中的抖动检测是一个专门针对视频稳定性进行分析的功能。抖动通常是指视频帧之间的不必要运动,这种运动可能是由于摄像机的移动、传输中的错误或编解码问题导致的。抖动检测对于确保视频内容的平滑性和观看体验至关重要。 优势 1. 提高图像质量 - 清晰度提升:减少抖动,提高图像的清晰度和细节表现力,使得监控画面更加真实可信。 - 细节增强:在低光条件下,抖

Android实现任意版本设置默认的锁屏壁纸和桌面壁纸(两张壁纸可不一致)

客户有些需求需要设置默认壁纸和锁屏壁纸  在默认情况下 这两个壁纸是相同的  如果需要默认的锁屏壁纸和桌面壁纸不一样 需要额外修改 Android13实现 替换默认桌面壁纸: 将图片文件替换frameworks/base/core/res/res/drawable-nodpi/default_wallpaper.*  (注意不能是bmp格式) 替换默认锁屏壁纸: 将图片资源放入vendo

pdfmake生成pdf的使用

实际项目中有时会有根据填写的表单数据或者其他格式的数据,将数据自动填充到pdf文件中根据固定模板生成pdf文件的需求 文章目录 利用pdfmake生成pdf文件1.下载安装pdfmake第三方包2.封装生成pdf文件的共用配置3.生成pdf文件的文件模板内容4.调用方法生成pdf 利用pdfmake生成pdf文件 1.下载安装pdfmake第三方包 npm i pdfma

零基础学习Redis(10) -- zset类型命令使用

zset是有序集合,内部除了存储元素外,还会存储一个score,存储在zset中的元素会按照score的大小升序排列,不同元素的score可以重复,score相同的元素会按照元素的字典序排列。 1. zset常用命令 1.1 zadd  zadd key [NX | XX] [GT | LT]   [CH] [INCR] score member [score member ...]