MediaPlayer音频与视频的播放介绍

作者:向阳逐梦

Android多媒体中的——MediaPlayer,我们可以通过这个API来播放音频和视频该类是Androd多媒体框架中的一个重要组件,通过该类,我们可以以最小的步骤来获取,解码和播放音视频。

它支持三种不同的媒体来源:

  • 本地资源
  • 内部的URI,比如你可以通过ContentResolver来获取
  • 外部URL(流)对于Android所支持的的媒体格式列表

1.相关方法详解

1)获得MediaPlayer实例:

可以直接new或者调用create方法创建:

MediaPlayer mp = new MediaPlayer();
MediaPlayer mp = MediaPlayer.create(this, R.raw.test);  //无需再调用setDataSource` </pre>

另外create还有这样的形式:create(Context context, Uri uri, SurfaceHolder holder) 通过Uri和指定 SurfaceHolder 【抽象类】 创建一个多媒体播放器。

2)设置播放文件:

//①raw下的资源:
MediaPlayer.create(this, R.raw.test);//②本地文件路径:
mp.setDataSource("/sdcard/test.mp3");//③网络URL文件:
mp.setDataSource("http://www.xxx.com/music/test.mp3");

另外setDataSource()方法有多个,里面有这样一个类型的参数:FileDescriptor,在使用这个API的时候,需要把文件放到res文件夹平级的assets文件夹里,然后使用下述代码设置DataSource:

AssetFileDescriptor fileDescriptor = getAssets().openFd("rain.mp3");
m_mediaPlayer.setDataSource(fileDescriptor.getFileDescriptor(),fileDescriptor.getStartOffset(), fileDescriptor.getLength());

3)其他方法

  • getCurrentPosition( ):得到当前的播放位置
  • getDuration() :得到文件的时间
  • getVideoHeight() :得到视频高度
  • getVideoWidth() :得到视频宽度
  • isLooping():是否循环播放
  • isPlaying():是否正在播放
  • pause():暂停
  • prepare():准备(同步)
  • prepareAsync():准备(异步)
  • release() :释放MediaPlayer对象
  • reset():重置MediaPlayer对象
  • seekTo(int msec) :指定播放的位置(以毫秒为单位的时间)
  • setAudioStreamType(int streamtype) :指定流媒体的类型
  • setDisplay(SurfaceHolder sh) :设置用SurfaceHolder来显示多媒体
  • setLooping(boolean looping) :设置是否循环播放
  • setOnBufferingUpdateListener(MediaPlayer.OnBufferingUpdateListener listener) :网络流媒体的缓冲监听
  • setOnCompletionListener(MediaPlayer.OnCompletionListener listener) :网络流媒体播放结束监听
  • setOnErrorListener(MediaPlayer.OnErrorListener listener) :设置错误信息监听
  • setOnVideoSizeChangedListener(MediaPlayer.OnVideoSizeChangedListener listener) :视频尺寸监听
  • setScreenOnWhilePlaying(boolean screenOn) :设置是否使用SurfaceHolder显示
  • setVolume(float leftVolume, float rightVolume) :设置音量
  • start():开始播放
  • stop():停止播放

2.使用代码示例

示例一:使用MediaPlayer播放音频:

运行效果图

关键代码

public class MainActivity extends AppCompatActivity implements View.OnClickListener{private Button btn_play;private Button btn_pause;private Button btn_stop;private MediaPlayer mPlayer = null;private boolean isRelease = true;   //判断是否MediaPlayer是否释放的标志@Overrideprotected void onCreate(Bundle savedInstanceState) {super.onCreate(savedInstanceState);setContentView(R.layout.activity_main);bindViews();}private void bindViews() {btn_play = (Button) findViewById(R.id.btn_play);btn_pause = (Button) findViewById(R.id.btn_pause);btn_stop = (Button) findViewById(R.id.btn_stop);btn_play.setOnClickListener(this);btn_pause.setOnClickListener(this);btn_stop.setOnClickListener(this);}@Overridepublic void onClick(View v) {switch (v.getId()){case R.id.btn_play:if(isRelease){mPlayer = MediaPlayer.create(this,R.raw.fly);isRelease = false;}mPlayer.start();   //开始播放btn_play.setEnabled(false);btn_pause.setEnabled(true);btn_stop.setEnabled(true);break;case R.id.btn_pause:mPlayer.pause();     //停止播放btn_play.setEnabled(true);btn_pause.setEnabled(false);btn_stop.setEnabled(false);break;case R.id.btn_stop:mPlayer.reset();     //重置MediaPlayermPlayer.release();   //释放MediaPlayerisRelease = true;btn_play.setEnabled(true);btn_pause.setEnabled(false);btn_stop.setEnabled(false);break;}}
}

注意事项:

播放的是res/raw目录下的音频文件,创建MediaPlayer调用的是create方法,第一次启动播放前不需要再调用prepare(),如果是使用构造方法构造的话,则需要调用一次prepare()方法!另外贴下官方文档中,从其他两种途径播放音频的示例代码:

本地Uri

Uri myUri = ....; // initialize Uri here
MediaPlayer mediaPlayer = new MediaPlayer();
mediaPlayer.setAudioStreamType(AudioManager.STREAM_MUSIC);
mediaPlayer.setDataSource(getApplicationContext(), myUri);
mediaPlayer.prepare();
mediaPlayer.start();

外部URL

String url = "http://........"; // your URL here
MediaPlayer mediaPlayer = new MediaPlayer();
mediaPlayer.setAudioStreamType(AudioManager.STREAM_MUSIC);
mediaPlayer.setDataSource(url);
mediaPlayer.prepare(); // might take long! (for buffering, etc)
mediaPlayer.start();

Note:假如你通过一个URL以流的形式播放在线音频文件,该文件必须可以进行渐进式下载

示例二:使用MediaPlayer播放视频

MediaPlayer主要用于播放音频,没有提供图像输出界面,所以我们需要借助其他的组件来显示MediaPlayer播放的图像输出,我们可以使用用SurfaceView来显示,下面我们使用SurfaceView来写个视频播放的例子:

运行效果图

实现代码

布局文件:activity_main.xml

<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"android:layout_width="match_parent"android:layout_height="match_parent"android:orientation="vertical"android:padding="5dp"><SurfaceViewandroid:id="@+id/sfv_show"android:layout_width="match_parent"android:layout_height="300dp" /><Buttonandroid:id="@+id/btn_start"android:layout_width="wrap_content"android:layout_height="wrap_content"android:text="开始" /><Buttonandroid:id="@+id/btn_pause"android:layout_width="wrap_content"android:layout_height="wrap_content"android:text="暂停 " /><Buttonandroid:id="@+id/btn_stop"android:layout_width="wrap_content"android:layout_height="wrap_content"android:text="终止" /></LinearLayout>

MainActivity.java

public class MainActivity extends AppCompatActivity implements View.OnClickListener, SurfaceHolder.Callback {private MediaPlayer mPlayer = null;private SurfaceView sfv_show;private SurfaceHolder surfaceHolder;private Button btn_start;private Button btn_pause;private Button btn_stop;@Overrideprotected void onCreate(Bundle savedInstanceState) {super.onCreate(savedInstanceState);setContentView(R.layout.activity_main);bindViews();}private void bindViews() {sfv_show = (SurfaceView) findViewById(R.id.sfv_show);btn_start = (Button) findViewById(R.id.btn_start);btn_pause = (Button) findViewById(R.id.btn_pause);btn_stop = (Button) findViewById(R.id.btn_stop);btn_start.setOnClickListener(this);btn_pause.setOnClickListener(this);btn_stop.setOnClickListener(this);//初始化SurfaceHolder类,SurfaceView的控制器surfaceHolder = sfv_show.getHolder();surfaceHolder.addCallback(this);surfaceHolder.setFixedSize(320, 220);   //显示的分辨率,不设置为视频默认}@Overridepublic void onClick(View v) {switch (v.getId()) {case R.id.btn_start:mPlayer.start();break;case R.id.btn_pause:mPlayer.pause();break;case R.id.btn_stop:mPlayer.stop();break;}}@Overridepublic void surfaceCreated(SurfaceHolder holder) {mPlayer = MediaPlayer.create(MainActivity.this, R.raw.lesson);mPlayer.setAudioStreamType(AudioManager.STREAM_MUSIC);mPlayer.setDisplay(surfaceHolder);    //设置显示视频显示在SurfaceView上}@Overridepublic void surfaceChanged(SurfaceHolder holder, int format, int width, int height) {}@Overridepublic void surfaceDestroyed(SurfaceHolder holder) {}@Overrideprotected void onDestroy() {super.onDestroy();if (mPlayer.isPlaying()) {mPlayer.stop();}mPlayer.release();}
}

代码很简单,布局有个SurfaceView,然后调用getHolder获得一个SurfaceHolder对象,在这里完成SurfaceView相关的设置,设置了显示的分辨率以及一个Callback接口,重写了SurfaceView创建时,发生变化时,以及销毁时的三个方法!然后按钮控制播放以及暂停而已。

示例三:使用VideoView播放视频

除了使用MediaPlayer + SurfaceView播放视频的方式,我们还可以使用VideoView来直接播放视频,我们稍微改点东西就可以实现视频播放!运行效果和上面的一致,就不贴了,直接上代码!

public class MainActivity extends AppCompatActivity implements View.OnClickListener {private VideoView videoView;private Button btn_start;private Button btn_pause;private Button btn_stop;@Overrideprotected void onCreate(Bundle savedInstanceState) {super.onCreate(savedInstanceState);setContentView(R.layout.activity_main);bindViews();}private void bindViews() {videoView = (VideoView) findViewById(R.id.videoView);btn_start = (Button) findViewById(R.id.btn_start);btn_pause = (Button) findViewById(R.id.btn_pause);btn_stop = (Button) findViewById(R.id.btn_stop);btn_start.setOnClickListener(this);btn_pause.setOnClickListener(this);btn_stop.setOnClickListener(this);//根据文件路径播放if (Environment.getExternalStorageState().equals(Environment.MEDIA_MOUNTED)) {videoView.setVideoPath(Environment.getExternalStorageDirectory() + "/lesson.mp4");}//读取放在raw目录下的文件//videoView.setVideoURI(Uri.parse("android.resource://com.jay.videoviewdemo/" + R.raw.lesson));videoView.setMediaController(new MediaController(this));}@Overridepublic void onClick(View v) {switch (v.getId()) {case R.id.btn_start:videoView.start();break;case R.id.btn_pause:videoView.pause();break;case R.id.btn_stop:videoView.stopPlayback();break;}}
}

这里给大家推荐一套相关《音视频开发核心知识点笔记》,相信可以给大家提供一些帮助,有需要的朋友们也可以下载下来随时查漏补缺:https://qr18.cn/Ei3VPD

音视频初级入门

音视频初级入门主要是接触Android多媒体展示相关的API,通过单独的列举和使用这些API,对Android音视频处理有一个基本的轮廓,虽然知识点相对来说是比较散的,但是点成线、线成面,基本的基础掌握了,通过学习Android音视频核心的API将音视频的流程串联起来,这样对于音视频的了解和控制就不仅仅局限于最外层的API了,而是能够通过相对底层的方式来加深对Android 音视频开发的认知。

  • Android 音视频开发(一):通过三种方式绘制图片
  • Android 音视频开发(二):使用 AudioRecord 采集音频PCM并保存到文件
  • Android 音视频开发(三):使用 AudioTrack 播放PCM音频
  • Android 音视频开发(四):使用 Camera API 采集视频数据
  • Android 音视频开发(五):使用 MediaExtractor 和 MediaMuxer API 解析和封装 mp4 文件
  • Android 音视频开发(六):MediaCodec API 详解
  • Android 音视频开发(七):音视频录制流程总结 ……

音视频中级进阶:OpenSL ES 学习:https://qr18.cn/Ei3VPD

学习 Android 平台 OpenSL ES API,了解 OpenSL 开发的基本流程,使用OpenSL播放PCM数据,并了解相关API的简单使用

  • Android OpenSL ES 开发:Android OpenSL 介绍和开发流程说明
  • Android OpenSL ES 开发:使用 OpenSL 播放 PCM 数据
  • Android OpenSL ES 开发:Android OpenSL 录制 PCM 音频数据
  • Android OpenSL ES 开发:OpenSL ES利用SoundTouch实现PCM音频的变速和变调

这一部分主要是动手实践,积累实战经验,可以试试给自己定以下目标:

  • 使用 OpenGL 显示一张图片

  • GLSurfaceviw 绘制 Camera 预览画面及实现拍照 使用OpenGL ES

  • 完成视频的录制,并实现视频水印效果

  • Android OpenGL ES 开发(一): OpenGL ES 介绍

  • Android OpenGL ES 开发(二): OpenGL ES 环境搭建

  • Android OpenGL ES 开发(三): OpenGL ES 定义形状

  • Android OpenGL ES 开发(四): OpenGL ES 绘制形状

  • Android OpenGL ES 开发(五): OpenGL ES 使用投影和相机视图

  • Android OpenGL ES 开发(六): OpenGL ES 添加运动效果

  • Android OpenGL ES 开发(七): OpenGL ES 响应触摸事件

  • Android OpenGL ES 开发(八): OpenGL ES 着色器语言GLSL

  • Android OpenGL ES 开发(九): OpenGL ES 纹理贴图

  • Android OpenGL ES 开发(十):通过GLES20与着色器交互

  • ……

音视频高级探究

  • 深入学习音视频编码,如H.264,AAC,研究使用开源编解码库,如x.264,JM 等
  • 深入研究音视频相关的网络协议,如 rtmp,hls,以及封包格式,如:flv,mp4
  • 深入学习一些音视频领域的开源项目,如 webrtc,ffmpeg,ijkplayer,librtmp 等等
  • 将 ffmpeg 库移植到 Android 平台,结合上面积累的经验,编写一款简易的音视频播放器
  • 将 x264 库移植到 Android 平台,结合上面积累的经验,完成视频数据 H264 软编功能
  • 将 librtmp 库移植到 Android 平台,结合上面积累的经验,完成 Android RTMP 推流功能

音视频编解码技术:https://qr18.cn/Ei3VPD

  • 音视频编解码技术(一):MPEG-4/H.264 AVC 编解码标准 音
  • 视频编解码技术(二):AAC 音频编码技术
  • ……

流媒体协议

  • 流媒体协议(一):HLS 协议
  • 流媒体协议(二):RTMP协议
  • ……

多媒体文件格式

  • 多媒体文件格式(一):MP4 格式
  • 多媒体文件格式(二):FLV 格式
  • 多媒体文件格式(三):M3U8 格式
  • 多媒体文件格式(四):TS 格式
  • 多媒体文件格式(五):PCM / WAV 格式 ……

FFmpeg 学习:https://qr18.cn/Ei3VPD

  • FFmpeg命令行工具学习(一):查看媒体文件头信息工具ffprobe
  • FFmpeg命令行工具学习(二):播放媒体文件的工具ffplay
  • FFmpeg命令行工具学习(三):媒体文件转换工具ffmpeg
  • FFmpeg命令行工具学习(四):FFmpeg 采集设备
  • FFmpeg命令行工具学习(五):FFmpeg 调整音视频播放速度
  • ……

  • FFmpeg 学习(一):FFmpeg 简介
  • FFmpeg 学习(二):Mac下安装FFmpeg
  • FFmpeg 学习(三):将 FFmpeg 移植到 Android平台
  • FFmpeg 学习(四):FFmpeg API 介绍与通用 API 分析
  • FFmpeg 学习(五):FFmpeg 编解码 API 分析
  • FFmpeg 学习(六):FFmpeg 核心模块 libavformat 与 libavcodec 分析
  • ……

  • FFmpeg 结构体学习(一):AVFormatContext 分析
  • FFmpeg 结构体学习(二):AVStream 分析
  • FFmpeg 结构体学习(三):AVPacket 分析
  • FFmpeg 结构体学习(四):AVFrame 分析
  • FFmpeg 结构体学习(五):AVCodec 分析
  • FFmpeg 结构体学习(六):AVCodecContext 分析
  • FFmpeg 结构体学习(七):AVIOContext 分析
  • FFmpeg 结构体学习(八):FFMPEG中重要结构体之间的关系
  • ……

  • FFmpeg 开发之 AVFilter 使用流程总结
  • FFmpeg 过时 Api 汇总整理
  • ……

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.rhkb.cn/news/103766.html

如若内容造成侵权/违法违规/事实不符,请联系长河编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

第3篇:vscode搭建esp32 arduino开发环境

第1篇:Arduino与ESP32开发板的安装方法 第2篇:ESP32 helloword第一个程序示范点亮板载LED 1.下载vscode并安装 https://code.visualstudio.com/ 运行VSCodeUserSetup-x64-1.80.1.exe 2.点击扩展&#xff0c;搜索arduino,并点击安装 3.点击扩展设置&#xff0c;配置arduino…

vue2 vue中的常用指令

一、为什么要学习Vue 1.前端必备技能 2.岗位多&#xff0c;绝大互联网公司都在使用Vue 3.提高开发效率 4.高薪必备技能&#xff08;Vue2Vue3&#xff09; 二、什么是Vue 概念&#xff1a;Vue (读音 /vjuː/&#xff0c;类似于 view) 是一套 **构建用户界面 ** 的 渐进式 …

第 7 章 排序算法(2)(冒泡排序)

7.5冒泡排序 7.5.1基本介绍 冒泡排序&#xff08;Bubble Sorting&#xff09;的基本思想是&#xff1a;通过对待排序序列从前向后&#xff08;从下标较小的元素开始&#xff09;,依次比较相邻元素的值&#xff0c;若发现逆序则交换&#xff0c;使值较大的元素逐渐从前移向后部…

C#使用自定义的比较器对版本号(编码)字符串进行排序

给定一些数据&#xff0c;如下所示: “1.10.1.1.1.2”, “1.1”, “2.2”, “1.1.1.1”, “1.1.3.1”, “1.1.1”, “2.10.1.1.1”, “1.1.2.1”, “1.2.1.1”, “2.5.1.1”, “1.10.1.1”, “1.10.2.1”, “1.11.3.1”, “1.11.12.1”, “1.11.11.1”, “1.11.3.1”, “1”, “…

自动化测试平台seldom-platform部署及使用

介绍 seldom-platform是一个基于seldom测试框架的测试平台 项目地址&#xff1a;https://github.com/SeldomQA 文档&#xff1a;seldom 语雀 首先&#xff0c;专门为seldom测试框架提供平台化支持。其次&#xff0c;只负责自动化测试项目的解析、执行用例&#xff0c;当然…

Elasticsearch简介及安装

&#x1f353; 简介&#xff1a;java系列技术分享(&#x1f449;持续更新中…&#x1f525;) &#x1f353; 初衷:一起学习、一起进步、坚持不懈 &#x1f353; 如果文章内容有误与您的想法不一致,欢迎大家在评论区指正&#x1f64f; &#x1f353; 希望这篇文章对你有所帮助,欢…

基于黄金正弦算法优化的BP神经网络(预测应用) - 附代码

基于黄金正弦算法优化的BP神经网络&#xff08;预测应用&#xff09; - 附代码 文章目录 基于黄金正弦算法优化的BP神经网络&#xff08;预测应用&#xff09; - 附代码1.数据介绍2.黄金正弦优化BP神经网络2.1 BP神经网络参数设置2.2 黄金正弦算法应用 4.测试结果&#xff1a;5…

redis实战-缓存三剑客穿透击穿雪崩解决方案

缓存穿透 定义 缓存穿透 &#xff1a;缓存穿透是指客户端请求的数据在缓存中和数据库中都不存在&#xff0c;这样缓存永远不会生效&#xff0c;这些请求都会打到数据库&#xff0c;造成数据库压力&#xff0c;也让缓存没有发挥出应有的作用 解决方案 缓存空对象 当我们客户端…

css实现文字的渐变,适合大屏

1 在全局写一个全局样式&#xff0c;文字渐变 2 在组件中使用 CSS3利用-webkit-background-clip: text;实现文字渐变效果_css如何把盒子底部的文字变成透明渐变_I俩月亮的博客-CSDN博客 CSS 如何实现文字渐变色 &#xff1f;_css字体颜色渐变_一个水瓶座程序猿.的博客-CSDN博客…

时序分解 | MATLAB实现基于SWD群体分解的信号分解分量可视化

时序分解 | MATLAB实现基于SWD群体分解的信号分解分量可视化 目录 时序分解 | MATLAB实现基于SWD群体分解的信号分解分量可视化效果一览基本介绍程序设计参考资料 效果一览 基本介绍 基于SWD群体分解的分量可视化&#xff0c;基于群体分解的信号分解技术&#xff0c;MATLAB程序…

Linux网络编程:线程池并发服务器 _UDP客户端和服务器_本地和网络套接字

文章目录&#xff1a; 一&#xff1a;线程池模块分析 threadpool.c 二&#xff1a;UDP通信 1.TCP通信和UDP通信各自的优缺点 2.UDP实现的C/S模型 server.c client.c 三&#xff1a;套接字 1.本地套接字 2.本地套 和 网络套对比 server.c client.c 一&#xff1a;线…

【C++】虚函数

2023年8月23日&#xff0c;周三上午 目录 虚函数在派生类中重写虚函数纯虚函数 示例程序 虚函数 在函数返回值前面加上关键字virtual虚函数必须在类中声明&#xff0c;否则会报错“[Error] virtual outside class declaration” class Base { public:virtual void func(); /…

Linux——初始

linux是一个操作系统&#xff0c;目前主流就是在服务器后端被选作服务器的操作系统来使用&#xff0c;所以我们没有直接接触到。 Linux的历史和概念 先是国家投钱给科研技术人员&#xff0c;科研技术人员将科研成果部分投入生活用品卖给老百姓&#xff0c;老百姓购买产品同时还…

使用Termux在安卓手机上搭建Hexo博客网站,并发布到公网访问

文章目录 1. 安装 Hexo2. 安装cpolar内网穿透3. 公网远程访问4. 固定公网地址 Hexo 是一个用 Nodejs 编写的快速、简洁且高效的博客框架。Hexo 使用 Markdown 解析文章&#xff0c;在几秒内&#xff0c;即可利用靓丽的主题生成静态网页。 下面介绍在Termux中安装个人hexo博客并…

SpringBoot利用ConstraintValidator实现自定义注解校验

一、前言 ConstraintValidator是Java Bean Validation&#xff08;JSR-303&#xff09;规范中的一个接口&#xff0c;用于实现自定义校验注解的校验逻辑。ConstraintValidator定义了两个泛型参数&#xff0c;分别是注解类型和被校验的值类型。在实现ConstraintValidator接口时&…

RabbitMQ介绍

RabbitMQ的概念 RabbitMQ 是一个消息中间件&#xff1a;它接受并转发消息。你可以把它当做一个快递站点&#xff0c;当你要发送一个包裹时&#xff0c;你把你的包裹放到快递站&#xff0c;快递员最终会把你的快递送到收件人那里&#xff0c;按照这种逻辑 RabbitMQ 是 一个快递…

SpringBoot - 两种方式刷新配置信息

一、第一种方式 ​ConfigurationProperties​不能自动刷新&#xff0c;需要手动调用contextRefresher.refresh()方法来刷新配置。 import org.springframework.boot.context.properties.ConfigurationProperties; import org.springframework.stereotype.Component;Component…

geacon_pro配合catcs4.5上线Mac、Linux

我的个人博客: xzajyjs.cn 一些链接 Try师傅的catcs4.5项目: https://github.com/TryGOTry/CobaltStrike_Cat_4.5&#xff0c;最新版解压密码见&#xff1a;https://www.nctry.com/2708.html geacon_pro: https://github.com/testxxxzzz/geacon_pro BeaconTool.jar: https:/…

qt显示图片并转换成灰度图及伪彩图

写了个程序&#xff0c;可在途图片&#xff0c;并切换成灰度图及伪彩图显示&#xff0c;主要代码如下&#xff1a; #include "mainwindow.h" #include "ui_mainwindow.h"MainWindow::MainWindow(QWidget *parent): QMainWindow(parent), ui(new Ui::MainW…

mysql 8.0 窗口函数 之 分布函数 与 sql server (2017以后支持) 分布函数 一样

mysql 分布函数 percent_rank&#xff08;&#xff09; &#xff1a;等级值 百分比cume_dist() &#xff1a;累积分布值 percent_rank&#xff08;&#xff09; 计算方式 (rank-1)/(rows-1)&#xff0c; 其中 rank 的值为使用RANK()函数产生的序号&#xff0c;rows 的值为当前…