热门标签 | HotTags
当前位置:  开发笔记 > Android > 正文

Android编程视频播放API之MediaPlayer用法示例

这篇文章主要介绍了Android编程视频播放API之MediaPlayer用法,结合实例形式分析了基于AndroidAPI实现视频播放功能的多媒体文件读取、判断、事件响应及流媒体播放等相关实现技巧,需要的朋友可以参考下

本文实例讲述了Android编程视频播放API之MediaPlayer用法。分享给大家供大家参考,具体如下:

现在项目要做音视频这块功能,这正是我相对比较薄弱的地方,项目中要用到,赶紧抓紧时间学习。前面有一编介绍不错的文章https://www.jb51.net/article/121881.htm,值得学习。

这里给出一个较为简单的示例:

/**
 * Android API MediaPlayer示例
 *
 * @description:
 * @author ldm
 * @date 2016-4-20 上午10:42:06
 */
public class MediaPlayerActivity extends Activity implements OnClickListener {
  private Button mlocalvideo;
  private Button mstreamvideo;
  private Button mlocalaudio;
  private Button mresourcesaudio;
  private static final String MEDIA = "media";
  private static final int LOCAL_AUDIO = 1;
  private static final int RESOURCES_AUDIO = 3;
  private static final int STREAM_VIDEO = 5;
  @Override
  protected void onCreate(Bundle icicle) {
    super.onCreate(icicle);
    setContentView(R.layout.activity_mediaplayer);
    initViewsAndEvents();
  }
  private void initViewsAndEvents() {
    mlocalaudio = (Button) findViewById(R.id.localaudio);
    mresourcesaudio = (Button) findViewById(R.id.resourcesaudio);
    mlocalvideo = (Button) findViewById(R.id.localvideo);
    mstreamvideo = (Button) findViewById(R.id.streamvideo);
    mlocalaudio.setOnClickListener(this);
    mresourcesaudio.setOnClickListener(this);
    mlocalvideo.setOnClickListener(this);
    mstreamvideo.setOnClickListener(this);
  }
  @Override
  public void onClick(View v) {
    switch (v.getId()) {
    case R.id.localaudio:
    case R.id.localvideo:
      Intent intent = new Intent(MediaPlayerActivity.this.getApplication(),
          MediaPlayerDemo_Audio.class);
      intent.putExtra(MEDIA, LOCAL_AUDIO);
      startActivity(intent);
      break;
    case R.id.resourcesaudio:
      Intent resIn = new Intent(MediaPlayerActivity.this.getApplication(),
          MediaPlayerDemo_Audio.class);
      resIn.putExtra(MEDIA, RESOURCES_AUDIO);
      startActivity(resIn);
      break;
    case R.id.streamvideo:
      Intent streamIn = new Intent(MediaPlayerActivity.this,
          MediaPlayerDemo_Video.class);
      streamIn.putExtra(MEDIA, STREAM_VIDEO);
      startActivity(streamIn);
      break;
    }
  }
}

/**
 * OnBufferingUpdateListener可以获取视频音频流的缓冲状态;
 * OnCompletionListener播放完毕监听器
 * OnPreparedListener准备播放相关接口
 * OnVideoSizeChangedListener注册视频大小改变监听器
 * SurfaceHolder.Callback:SurfaceView监听callback
 * @description:
 * @author ldm
 * @date 2016-4-20 上午9:46:16
 */
public class MediaPlayer_Video extends Activity implements
    OnBufferingUpdateListener, OnCompletionListener,
    OnPreparedListener, OnVideoSizeChangedListener, SurfaceHolder.Callback {
  private static final String TAG = "MediaPlayerDemo";
  //Video宽度
  private int mVideoWidth;
  //Video高度
  private int mVideoHeight;
  //播放器MediaPlayer
  private MediaPlayer mMediaPlayer;
  //播放界面SurfaceView
  private SurfaceView mPreview;
  //媒体播放器的载体 SurfaceHolder
  private SurfaceHolder holder;
  //文件路径
  private String path;
  //Bundle数据对象
  private Bundle extras;
  private static final String MEDIA = "media";
  private static final int LOCAL_VIDEO = 1;
  private static final int RESOURCES_AUDIO = 3;
  private static final int STREAM_VIDEO = 5;
  private boolean mIsVideoSizeKnown = false;
  private boolean mIsVideoReadyToBePlayed = false;
  @SuppressWarnings("deprecation")
  @Override
  public void onCreate(Bundle icicle) {
    super.onCreate(icicle);
    setContentView(R.layout.mediaplayer_2);
    mPreview = (SurfaceView) findViewById(R.id.surface);
    holder = mPreview.getHolder();
    holder.addCallback(this);
    //高版本上已经不推荐使用了 ,如果要兼容低版本(如Android 2.3或以下版本)要加上这段代码,不然播放时 只会有声音 没有图像。
    holder.setType(SurfaceHolder.SURFACE_TYPE_PUSH_BUFFERS);
    extras = getIntent().getExtras();
  }
  private void playVideo(Integer Media) {
    doCleanUp();
    try {
      switch (Media) {
        case LOCAL_VIDEO://本地文件(如SD卡)
          /*
           * TODO:将路径变量设置为本地媒体文件路径。
           */
          path = "";//这里要填写你所播放音视频的文件路径
          if (path == "") {
            Toast
                .makeText(
                    MediaPlayer_Video.this,
                    "Please edit MediaPlayerDemo_Video Activity, "
                        + "and set the path variable to your media file path."
                        + " Your media file must be stored on sdcard.",
                    Toast.LENGTH_LONG).show();
          }
          break;
        case STREAM_VIDEO://流文件
          /**
           * 路径变量设置为mp4或3gpp格式的URL。应该使用Http协议。
           * 媒体播放器只能通过流的形式获取数据,所以需要:
           * 1。必须是媒体流数据。
           * 2。必须合理剪辑。
           */
          path = "";
          if (path == "") {
            // Tell the user to provide a media file URL.
            Toast
                .makeText(
                    MediaPlayer_Video.this,
                    "Please edit MediaPlayerDemo_Video Activity,"
                        + " and set the path variable to your media file URL.",
                    Toast.LENGTH_LONG).show();
          }
          break;
        case RESOURCES_AUDIO:
          //播放放在诸如res/raw文件夹下的资源文件
          //直接通过mMediaPlayer = MediaPlayer.create(this, R.raw.test_cbr);
          //可以参考API Demos中AudioFxDemo类文件
          break;
      }
      // 创建MediaPlayer对象,传入文件数据并设备监听
      mMediaPlayer = new MediaPlayer();
      mMediaPlayer.setDataSource(path);
      mMediaPlayer.setDisplay(holder);
      //使用 create() 方法创建的 MediaPlayer, 直接指定了 媒体资源, 不需要再进行 调用 prepare() 方法;
      mMediaPlayer.prepare();
      mMediaPlayer.setOnBufferingUpdateListener(this);
      mMediaPlayer.setOnCompletionListener(this);
      mMediaPlayer.setOnPreparedListener(this);
      mMediaPlayer.setOnVideoSizeChangedListener(this);
      //指定音频流类型
      mMediaPlayer.setAudioStreamType(AudioManager.STREAM_MUSIC);
    } catch (Exception e) {
      Log.e(TAG, "error: " + e.getMessage(), e);
    }
  }
  public void onBufferingUpdate(MediaPlayer arg0, int percent) {
    Log.d(TAG, "onBufferingUpdate percent:" + percent);
  }
  public void onCompletion(MediaPlayer arg0) {
    Log.d(TAG, "onCompletion called");
  }
  public void onVideoSizeChanged(MediaPlayer mp, int width, int height) {
    Log.v(TAG, "onVideoSizeChanged called");
    if (width == 0 || height == 0) {
      Log.e(TAG, "invalid video width(" + width + ") or height(" + height + ")");
      return;
    }
    mIsVideoSizeKnown = true;
    mVideoWidth = width;
    mVideoHeight = height;
    if (mIsVideoReadyToBePlayed && mIsVideoSizeKnown) {
      startVideoPlayback();
    }
  }
  public void onPrepared(MediaPlayer mediaplayer) {
    Log.d(TAG, "onPrepared called");
    mIsVideoReadyToBePlayed = true;
    if (mIsVideoReadyToBePlayed && mIsVideoSizeKnown) {
      startVideoPlayback();
    }
  }
  public void surfaceChanged(SurfaceHolder surfaceholder, int i, int j, int k) {
    Log.d(TAG, "surfaceChanged called");
  }
  public void surfaceDestroyed(SurfaceHolder surfaceholder) {
    Log.d(TAG, "surfaceDestroyed called");
  }
  public void surfaceCreated(SurfaceHolder holder) {
    Log.d(TAG, "surfaceCreated called");
    playVideo(extras.getInt(MEDIA));
  }
  @Override
  protected void onPause() {
    super.onPause();
    releaseMediaPlayer();
    doCleanUp();
  }
  @Override
  protected void onDestroy() {
    super.onDestroy();
    releaseMediaPlayer();
    doCleanUp();
  }
  private void releaseMediaPlayer() {
    if (mMediaPlayer != null) {
      mMediaPlayer.release();
      mMediaPlayer = null;
    }
  }
  private void doCleanUp() {
    mVideoWidth = 0;
    mVideoHeight = 0;
    mIsVideoReadyToBePlayed = false;
    mIsVideoSizeKnown = false;
  }
  private void startVideoPlayback() {
    Log.v(TAG, "startVideoPlayback");
    holder.setFixedSize(mVideoWidth, mVideoHeight);
    mMediaPlayer.start();
  }
}

布局文件activity_mediaplayer

<&#63;xml version="1.0" encoding="utf-8"&#63;>

  

布局文件activity_mediaplayer_video

<&#63;xml version="1.0" encoding="utf-8"&#63;>

  
  


更多关于Android相关内容感兴趣的读者可查看本站专题:《Android多媒体操作技巧汇总(音频,视频,录音等)》、《Android开发入门与进阶教程》、《Android视图View技巧总结》、《Android编程之activity操作技巧总结》、《Android数据库操作技巧总结》、《Android文件操作技巧汇总》、《Android资源操作技巧汇总》及《Android控件用法总结》

希望本文所述对大家Android程序设计有所帮助。


推荐阅读
  • 在Linux系统中配置并启动ActiveMQ
    本文详细介绍了如何在Linux环境中安装和配置ActiveMQ,包括端口开放及防火墙设置。通过本文,您可以掌握完整的ActiveMQ部署流程,确保其在网络环境中正常运行。 ... [详细]
  • 基于KVM的SRIOV直通配置及性能测试
    SRIOV介绍、VF直通配置,以及包转发率性能测试小慢哥的原创文章,欢迎转载目录?1.SRIOV介绍?2.环境说明?3.开启SRIOV?4.生成VF?5.VF ... [详细]
  • QUIC协议:快速UDP互联网连接
    QUIC(Quick UDP Internet Connections)是谷歌开发的一种旨在提高网络性能和安全性的传输层协议。它基于UDP,并结合了TLS级别的安全性,提供了更高效、更可靠的互联网通信方式。 ... [详细]
  • 本文详细介绍了如何在Linux系统上安装和配置Smokeping,以实现对网络链路质量的实时监控。通过详细的步骤和必要的依赖包安装,确保用户能够顺利完成部署并优化其网络性能监控。 ... [详细]
  • 如何在PHPcms网站中添加广告
    本文详细介绍了在PHPcms网站后台添加广告的方法,涵盖多种常见的广告形式,如百度广告和Google广告,并提供了相关设置的步骤。同时,文章还探讨了优化网站流量的SEO策略。 ... [详细]
  • XNA 3.0 游戏编程:从 XML 文件加载数据
    本文介绍如何在 XNA 3.0 游戏项目中从 XML 文件加载数据。我们将探讨如何将 XML 数据序列化为二进制文件,并通过内容管道加载到游戏中。此外,还会涉及自定义类型读取器和写入器的实现。 ... [详细]
  • 本文介绍如何通过Windows批处理脚本定期检查并重启Java应用程序,确保其持续稳定运行。脚本每30分钟检查一次,并在需要时重启Java程序。同时,它会将任务结果发送到Redis。 ... [详细]
  • Android LED 数字字体的应用与实现
    本文介绍了一种适用于 Android 应用的 LED 数字字体(digital font),并详细描述了其在 UI 设计中的应用场景及其实现方法。这种字体常用于视频、广告倒计时等场景,能够增强视觉效果。 ... [详细]
  • 本章将深入探讨移动 UI 设计的核心原则,帮助开发者构建简洁、高效且用户友好的界面。通过学习设计规则和用户体验优化技巧,您将能够创建出既美观又实用的移动应用。 ... [详细]
  • RecyclerView初步学习(一)
    RecyclerView初步学习(一)ReCyclerView提供了一种插件式的编程模式,除了提供ViewHolder缓存模式,还可以自定义动画,分割符,布局样式,相比于传统的ListVi ... [详细]
  • 扫描线三巨头 hdu1928hdu 1255  hdu 1542 [POJ 1151]
    学习链接:http:blog.csdn.netlwt36articledetails48908031学习扫描线主要学习的是一种扫描的思想,后期可以求解很 ... [详细]
  • 本文介绍如何使用 NSTimer 实现倒计时功能,详细讲解了初始化方法、参数配置以及具体实现步骤。通过示例代码展示如何创建和管理定时器,确保在指定时间间隔内执行特定任务。 ... [详细]
  • 本文介绍了在Windows环境下使用pydoc工具的方法,并详细解释了如何通过命令行和浏览器查看Python内置函数的文档。此外,还提供了关于raw_input和open函数的具体用法和功能说明。 ... [详细]
  • 高效解决应用崩溃问题!友盟新版错误分析工具全面升级
    友盟推出的最新版错误分析工具,专为移动开发者设计,提供强大的Crash收集与分析功能。该工具能够实时监控App运行状态,快速发现并修复错误,显著提升应用的稳定性和用户体验。 ... [详细]
  • 解决JAX-WS动态客户端工厂弃用问题并迁移到XFire
    在处理Java项目中的JAR包冲突时,我们遇到了JaxWsDynamicClientFactory被弃用的问题,并成功将其迁移到org.codehaus.xfire.client。本文详细介绍了这一过程及解决方案。 ... [详细]
author-avatar
飞舞的猫2502890283
这个家伙很懒,什么也没留下!
PHP1.CN | 中国最专业的PHP中文社区 | DevBox开发工具箱 | json解析格式化 |PHP资讯 | PHP教程 | 数据库技术 | 服务器技术 | 前端开发技术 | PHP框架 | 开发工具 | 在线工具
Copyright © 1998 - 2020 PHP1.CN. All Rights Reserved | 京公网安备 11010802041100号 | 京ICP备19059560号-4 | PHP1.CN 第一PHP社区 版权所有