前言:

昨天总结了视频录制,今天来学习一下视频的播放,Android的视频播放主要采用MediaPlayer类。

MediaPlayer介绍

MediaPlayer类可用于控制音频/视频文件或流的播放。

MediaPlayer函数

1.)实例化方式

使用直接new的方式:

  MediaPlayer mp = new MediaPlayer();

使用create的方式

MediaPlayer mp = MediaPlayer.create(this, R.raw.test);
2.)设置播放源
setDataSource(String path)//指定装载path路径所代表的文件。
setDataSource(Context context, Uri uri, Map<String, String headers)//指定装载uri所代表的文件。
setDataSource(Context context, Uri uri)//指定装载uri所代表的文件。
setDataSource(FileDescriptor fd, long offset, long length)//指定装载fd所代表的文件中从offset开始长度为length的文件内容。
setDataSource(FileDescriptor fd)//指定装载fd所代表的文件。
3.)配置播放参数
setAudioStreamType(int streamtype)//设置音频流的类型。
setDisplay(SurfaceHolder sh)//设置显示方式。
setLooping(boolean looping)//设置是否循环播放。
setNextMediaPlayer(MediaPlayer next)//设置当前流媒体播放完毕,下一个播放的MediaPlayer。
setScreenOnWhilePlaying(boolean screenOn)//设置是否使用SurfaceHolder来显示。
setSurface(Surface surface)//设置Surface。
setVideoScalingMode(int mode)//设置视频缩放的模式。
setVolume(float leftVolume, float rightVolume)//设置播放器的音量。
setWakeMode(Context context, int mode)//为MediaPlayer设置低级电源管理行为。
4.)播放控制函数
start()//开始或恢复播放。
stop()//停止播放。
pause()//暂停播放。
prepare()//准备播放(装载音频),调用此方法会使MediaPlayer进入Prepared状态。
prepareAsync()//准备播放异步音频。
release()//释放媒体资源
reset()//重置MediaPlayer进入未初始化状态。
seekTo(int msec)//指定的时间位置。
5.)监听事件函数
setOnBufferingUpdateListener(MediaPlayer.OnBufferingUpdateListener listener)//注册一个回调函数,在网络视频流缓冲变化时调用。
setOnCompletionListener(MediaPlayer.OnCompletionListener listener)//为Media Player的播放完成事件绑定事件监听器。
setOnErrorListener(MediaPlayer.OnErrorListener listener)//为MediaPlayer的播放错误事件绑定事件监听器。
setOnPreparedListener(MediaPlayer.OnPreparedListener listener)//当MediaPlayer调用prepare()方法时触发该监听器。
setOnSeekCompleteListener(MediaPlayer.OnSeekCompleteListener listener)//当MediaPlayer调用seek()方法时触发该监听器。
setOnVideoSizeChangedListener(MediaPlayer.OnVideoSizeChangedListener listener)//注册一个用于监听视频大小改变的监听器。
6.)获取参数函数
getCurrentPosition()//获取当前播放的位置。
getDuration()//获取音频的时长。
getVideoHeight()//获取视频的高度。
getVideoWidth()//获取视频的宽度。
isLooping()//判断MediaPlayer是否正在循环播放。
isPlaying()//判断MediaPlayer是否正在播放。

MediaPlayer音视频播放示例

1.)添加权限
    <uses-permission android:name="android.permission.CAMERA" />
<uses-permission android:name="android.permission.RECORD_AUDIO" />
<uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE" />
2.)视频播放简单示例
public class MediaPlayerActivity extends Activity implements SurfaceHolder.Callback, View.OnClickListener, MediaPlayer.OnPreparedListener, MediaPlayer.OnBufferingUpdateListener, MediaPlayer.OnCompletionListener {
private MediaPlayer player;
private SurfaceView surface;
private SurfaceHolder surfaceHolder;
private Button play, pause, stop;
private SeekBar seekBar;
private String videoPath;
private int seekProgress; @Override
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_media_player);
initParams();
initViews();
} private void initParams() {
videoPath = getIntent().getStringExtra("videoPath");
} private void initViews() {
play = (Button) findViewById(R.id.btn_play);
pause = (Button) findViewById(R.id.btn_pause);
stop = (Button) findViewById(R.id.btn_stop);
seekBar = (SeekBar) findViewById(R.id.skb_video);
seekBar.setOnSeekBarChangeListener(new SeekBar.OnSeekBarChangeListener() {
@Override
public void onProgressChanged(SeekBar seekBar, int progress, boolean fromUser) {
seekProgress = progress * player.getDuration()
/ seekBar.getMax();
} @Override
public void onStartTrackingTouch(SeekBar seekBar) { } @Override
public void onStopTrackingTouch(SeekBar seekBar) {
seekTo(seekProgress);
}
});
surface = (SurfaceView) findViewById(R.id.video_surface);
surfaceHolder = surface.getHolder();
surfaceHolder.setFormat(PixelFormat.TRANSPARENT);
surfaceHolder.setKeepScreenOn(true);
surfaceHolder.addCallback(this);
play.setOnClickListener(this);
pause.setOnClickListener(this);
stop.setOnClickListener(this);
} @Override
public void surfaceChanged(SurfaceHolder arg0, int arg1, int arg2, int arg3) {
} @Override
public void surfaceCreated(SurfaceHolder arg0) {
autoPlay();
} @Override
public void surfaceDestroyed(SurfaceHolder arg0) {
stop();
release();
} @Override
protected void onDestroy() {
super.onDestroy();
stop();
release();
} /**
* 自动播放
*/
private void autoPlay() {
//必须在surface创建后才能初始化MediaPlayer,否则不会显示图像
player = new MediaPlayer();
player.setAudioStreamType(AudioManager.STREAM_MUSIC);
//设置显示视频显示在SurfaceView上
player.setDisplay(surfaceHolder);
try {
player.setDataSource(videoPath);
player.setOnPreparedListener(this);
player.setOnCompletionListener(this);
player.setOnBufferingUpdateListener(this);
player.prepare();
} catch (Exception e) {
e.printStackTrace();
}
} /**
* 开始播放
*/
private void start() {
if (player == null || player.isPlaying()) {
return;
}
player.start();
} /**
* 暂停播放
*/
private void pause() {
if (player == null || player.isPlaying()) {
return;
}
player.pause();
} /**
* 停止播放
*/
private void stop() {
if (player == null || player.isPlaying()) {
return;
}
player.stop();
} /**
* 释放资源
*/
private void release() {
if (player == null) {
return;
}
player.release();
} /**
* 重置播放器
*/
private void reset() {
if (player == null) {
return;
}
player.reset();
} /**
* 指定位置播放
*
* @param pos
*/
private void seekTo(int pos) {
if (player == null) {
return;
}
player.seekTo(pos);
start();
} @Override
public void onClick(View v) {
switch (v.getId()) {
case R.id.btn_play:
start();
break;
case R.id.btn_pause:
pause();
break;
case R.id.btn_stop:
stop();
break;
}
} @Override
public void onPrepared(MediaPlayer mp) {
start();
} @Override
public void onBufferingUpdate(MediaPlayer mp, int percent) {
seekBar.setSecondaryProgress(percent);
int currentProgress = seekBar.getMax() * player.getCurrentPosition() / player.getDuration();
Log.e("currentProgress", "currentProgress----->" + currentProgress);
} @Override
public void onCompletion(MediaPlayer mp) {
seekBar.setProgress(0);
}
}
3.)布局文件
<?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"> <SurfaceView
android:id="@+id/video_surface"
android:layout_width="match_parent"
android:layout_height="0dp"
android:layout_gravity="center"
android:layout_weight="1" /> <LinearLayout
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:layout_gravity="center_horizontal|bottom"
android:orientation="vertical"> <SeekBar
android:id="@+id/skb_video"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:layout_gravity="center_horizontal"
android:layout_margin="10dp"
android:max="100"
android:focusable="true"
android:maxHeight="4.0dip"
android:minHeight="4.0dip"
android:paddingLeft="16.0dip"
android:paddingRight="16.0dip"
android:thumb="@drawable/seekbar_thumb"
android:progressDrawable="@drawable/po_seekbar" /> <LinearLayout
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:layout_gravity="center_horizontal|bottom"
android:layout_margin="10dp"
android:gravity="center"
android:orientation="horizontal"> <Button
android:id="@+id/btn_play"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="播放" /> <Button
android:id="@+id/btn_pause"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="暂停" /> <Button
android:id="@+id/btn_stop"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="停止" />
</LinearLayout>
</LinearLayout>
</LinearLayout>
4.)播放音频简单示例
         if (player == null) {
player = new MediaPlayer();
player.setDataSource(url);
player.setVolume(0.7f, 0.7f);
player.setAudioStreamType(AudioManager.STREAM_MUSIC);
player.prepare();
player.start();
player.setOnCompletionListener(completionListener);
player.setOnErrorListener(errorListener);
return true;
}
5.)知识扩展

用上面的示例只能播放部分片源,有些片源会播放不了,所以我公司项目后来未采用原生的MediaPlayer进行视频播放。这里推荐大家使用B站开源视频播放解决方案ijkplayer。地址:https://github.com/Bilibili/

Android音视频之MediaPlayer音视频播放的更多相关文章

  1. 云-腾讯云-实时音视频:实时音视频(TRTC)

    ylbtech-云-腾讯云-实时音视频:实时音视频(TRTC) 支持跨终端.全平台之间互通,从零开始快速搭建实时音视频通信平台 1.返回顶部 1. 腾讯实时音视频(Tencent Real-Time ...

  2. Android音视频之MediaRecorder音视频录制

    前言: 公司产品有很多地方都需要上传音频视频,今天抽空总结一下音频视频的录制.学习的主角是MediaRecorder类. MediaRecorder类介绍: MediaRecorder类是Androi ...

  3. moviepy音视频剪辑:音视频的加载和输出

    专栏:Python基础教程目录 专栏:使用PyQt开发图形界面Python应用 专栏:PyQt入门学习 老猿Python博文目录 老猿学5G博文目录 一.概述 在本地进行音视频处理时,首先要从视频文件 ...

  4. 在Python中使用moviepy进行音视频剪辑混音合成时输出文件无声音问题

    专栏:Python基础教程目录 专栏:使用PyQt开发图形界面Python应用 专栏:PyQt入门学习 老猿Python博文目录 老猿学5G博文目录 在使用moviepy进行音视频剪辑时发现输出成功但 ...

  5. 【Android 多媒体开发】 MediaPlayer 网络视频播放器

    作者 : 万境绝尘 (octopus_truth@163.com) 转载请著名出处 : http://blog.csdn.net/shulianghan/article/details/3889514 ...

  6. Android:视频(VideoView/MediaPlayer)

    Android之视频播放 VideoView if(android.os.Environment.getExternalStorageState().equals(android.os.Environ ...

  7. 直播软件开发之Java音视频解决方案:音视频基础知识

    概念 从信息论的观点来看,描述信源的数据是信息和数据冗余之和,即:数据=信息+数据冗余.音频信号在时域和频域上具有相关性,也即存在数据冗余.将音频作为一个信源,音频编码的实质是减少音频中的冗余. 拟信 ...

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

    一.H264 概述 H.264,通常也被称之为H.264/AVC(或者H.264/MPEG-4 AVC或MPEG-4/H.264 AVC) 1. H.264视频编解码的意义 H.264的出现就是为了创 ...

  9. 音视频】5.ffmpeg命令分类与使用

    GT其实平时也有一些处理音视频的个人或者亲人需求,熟练使用ffmpeg之后也不要借助图示化软件,一个命令基本可以搞定 G: 熟练使用ffmpeg命令!T :不要死记硬背,看一遍,自己找下规律,敲一遍, ...

随机推荐

  1. HDU 2087  KMP模板题

    1.HDU 2087 2.题意:一个主串,一个子串,求子串在主串里出现了几次. 3.总结:看了题解,还是不太懂.. //#include<iostream>#include<cmat ...

  2. Swap Nodes in Pairs

    Given a linked list, swap every two adjacent nodes and return its head. For example, Given 1->2-& ...

  3. java-JDBC从数据库中读取数据并进行日期民族男女的转换

    代码如下: package com.itnba.maya.mysql; import java.sql.*; import java.text.SimpleDateFormat; public cla ...

  4. web api Route属性定义

    ASP.NET Web API路由,简单来说,就是把客户端请求映射到对应的Action上的过程.在"ASP.NET Web API实践系列03,路由模版, 路由惯例, 路由设置"一 ...

  5. 【实战Java高并发程序设计6】挑战无锁算法:无锁的Vector实现

    [实战Java高并发程序设计 1]Java中的指针:Unsafe类 [实战Java高并发程序设计 2]无锁的对象引用:AtomicReference [实战Java高并发程序设计 3]带有时间戳的对象 ...

  6. Repeater的分页

      Repeater控件是个好东西.轻量级.又好用.完全的自定义.但是,正是因为这些优点它没有自动分页的功能.这个需要研究一下.我看了一下起点等小说网站,那些什么推荐排名榜用Repeater控件那是很 ...

  7. 以self-contained方式在Linux上部署ASP.NET Core站点

    今天准备将一个在Windows上用VS2015开发的ASP.NET Core程序部署到阿里云Linux服务器上,部署时发现这台服务器是内网服务器,无法直接安装.NET Core SDK,于是想到尝试用 ...

  8. python自动化测试(3)- 自动化框架及工具

    python自动化测试(3) 自动化框架及工具 1   概述 手续的关于测试的方法论,都是建立在之前的文章里面提到的观点: 功能测试不建议做自动化 接口测试性价比最高 接口测试可以做自动化 后面所谈到 ...

  9. 自己动手写一个简单的MVC框架(第二版)

    一.ASP.NET MVC核心机制回顾 在ASP.NET MVC中,最核心的当属“路由系统”,而路由系统的核心则源于一个强大的System.Web.Routing.dll组件. 在这个System.W ...

  10. clojure基础入门(一)

    最近在看storm的源码,就学习分享下clojure语法. 阅读目录: 概述 变量 运算符 流程控制 总结 概述 clojure是一种运行在JVM上的Lisp方言,属于函数式编程范式,它和java可以 ...