全网整合营销服务商

电脑端+手机端+微信端=数据同步管理

免费咨询热线:400-708-3566

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

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

现在项目要做音视频这块功能,这正是我相对比较薄弱的地方,项目中要用到,赶紧抓紧时间学习。前面有一编介绍不错的文章https://www./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

<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
  android:orientation="vertical"
  android:layout_width="match_parent"
  android:layout_height="match_parent"
  >
  <Button android:id="@+id/localvideo"
    android:layout_height="wrap_content"
    android:layout_width="match_parent"
    android:text="@string/local_video"
  />
  <Button android:id="@+id/streamvideo"
    android:layout_height="wrap_content"
    android:layout_width="match_parent"
    android:text="@string/stream_video"
  />
  <Button android:id="@+id/localaudio"
    android:layout_height="wrap_content"
    android:layout_width="match_parent"
    android:text="@string/local_audio"
  />
  <Button android:id="@+id/resourcesaudio"
    android:layout_height="wrap_content"
    android:layout_width="match_parent"
    android:text="@string/res_audio"
  />
</LinearLayout>

布局文件activity_mediaplayer_video

<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
  android:orientation="vertical"
  android:layout_width="match_parent"
  android:layout_height="match_parent">
  <SurfaceView android:id="@+id/surface"
    android:layout_width="wrap_content"
    android:layout_height="wrap_content"
    android:layout_gravity="center">
  </SurfaceView>
</LinearLayout>

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

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


# Android  # 视频播放  # API  # MediaPlayer  # Android音视频开发之MediaPlayer使用教程  # Android MediaPlayer 音频倍速播放 调整播放速度问题  # Android MediaPlayer 播放音频的方式  # Android多媒体应用使用MediaPlayer播放音频  # Android开发之MediaPlayer多媒体(音频  # 视频)播放工具类  # Android编程之播放器MediaPlayer实现均衡器效果示例  # Android实现简单音乐播放器(MediaPlayer)  # Android MediaPlayer音频播放器封装示例浅析  # 操作技巧  # 媒体播放器  # 设置为  # 音视频  # 进阶  # 上午  # 有一  # 放在  # 相关内容  # 感兴趣  # 这段  # 播放器  # 只会  # 要做  # 给大家  # 你所  # 这块  # 不需  # 更多关于  # 所述 


相关文章:   网站制作知乎推荐,想做自己的网站用什么工具比较好?  移民网站制作流程,怎么看加拿大移民官网?  东莞专业网站制作公司有哪些,东莞招聘网站哪个好?  ,南京靠谱的征婚网站?  黑客如何通过漏洞一步步攻陷网站服务器?  微信小程序 五星评分(包括半颗星评分)实例代码  如何在企业微信快速生成手机电脑官网?  如何生成腾讯云建站专用兑换码?  历史网站制作软件,华为如何找回被删除的网站?  如何用PHP工具快速搭建高效网站?  制作网站哪家好,cc、.co、.cm哪个域名更适合做网站?  如何快速生成凡客建站的专业级图册?  如何快速生成橙子建站落地页链接?  成都品牌网站制作公司,成都营业执照年报网上怎么办理?  如何通过远程VPS快速搭建个人网站?  建站之星IIS配置教程:代码生成技巧与站点搭建指南  如何确保西部建站助手FTP传输的安全性?  Bpmn 2.0的XML文件怎么画流程图  公司门户网站制作公司有哪些,怎样使用wordpress制作一个企业网站?  在线流程图制作网站手机版,谁能推荐几个好的CG原画资源网站么?  详解ASP.NET 生成二维码实例(采用ThoughtWorks.QRCode和QrCode.Net两种方式)  如何使用Golang table-driven基准测试_多组数据测量函数效率  深圳 网站制作,深圳招聘网站哪个比较好一点啊?  东莞市网站制作公司有哪些,东莞找工作用什么网站好?  北京企业网站设计制作公司,北京铁路集团官方网站?  动图在线制作网站有哪些,滑动动图图集怎么做?  南阳网站制作公司推荐,小学电子版试卷去哪里找资源好?  C++ static_cast和dynamic_cast区别_C++静态转换与动态类型安全转换  python的本地网站制作,如何创建本地站点?  香港服务器选型指南:免备案配置与高效建站方案解析  焦点电影公司作品,电影焦点结局是什么?  网站建设制作需要多少钱费用,自己做一个网站要多少钱,模板一般多少钱?  建站之星会员如何解锁更多建站功能?  c# F# 的 MailboxProcessor 和 C# 的 Actor 模型  如何快速搭建高效WAP手机网站吸引移动用户?  金*站制作公司有哪些,金华教育集团官网?  建站主机如何选?高性价比方案全解析  c++23 std::expected怎么用 c++优雅处理函数错误返回【详解】  网站app免费制作软件,能免费看各大网站视频的手机app?  企业宣传片制作网站有哪些,传媒公司怎么找企业宣传片项目?  如何通过万网虚拟主机快速搭建网站?  如何挑选优质建站一级代理提升网站排名?  IOS倒计时设置UIButton标题title的抖动问题  网站建设制作、微信公众号,公明人民医院怎么在网上预约?  如何快速上传建站程序避免常见错误?  教育培训网站制作流程,请问edu教育网站的域名怎么申请?  免费ppt制作网站,有没有值得推荐的免费PPT网站?  如何通过山东自助建站平台快速注册域名?  西安市网站制作公司,哪个相亲网站比较好?西安比较好的相亲网站? 

您的项目需求

*请认真填写需求信息,我们会在24小时内与您取得联系。