Android多媒体详解

Android MediaPlayer+SurfaceView+自定义控制器实现视频播放 VideoView继承了SurfaceView同时实现了MediaPlayerControl接口,MediaController则是安卓封装的辅助控制器,带有暂停,播放,停止,进度条等控件。本demo基于Android11开发,实现了简单的视频播放功能,可以拖动进度条,快进/快退和播放上一个视频/播放下一个视频,同时通过悬浮窗的形式查看视频详情。5、将展示视频详情的布局及组件初始化,创建WindowManager对象并设置窗口对应的值,将设置好的值和布局添加进WindowManager对象。 阅读详情

先看一下效果图


1、     MediaPlayer播放音频

2、     SoundPool播放音频

3、     VideoView播放视频

4、     通过Intent意图调用自带视频播放器

5、     MediaPlayer和SurfaceView播放视频

1、MediaPlayer播放音频

 

MediaPlayer是用于播放音频和视频的,来看一下MediaPlayer类控制音频的常用方法

 

 

setDataSource()

设置要播放的音频文件的位置

prepare()

在播放之前调用这个方法完成准备工作

start()

开始或继续播放音频

pause()

暂停播放音频

reset()

将MediaPlayer对象重置到刚刚创建的状态

seekTo()

从指定位置开始播放音频

stop()

停止播放音频

relase()

释放掉与MediaPlayer对象相关的资源

isPlaying()

判断当前MediaPlayer是否正在播放音频

getDurtion()

获取载入的音频文件的时长

接下来看一下MediaPlayer的具体使用步骤:

1、创建MediaPlayer

MediaPlayer mediaPlayer=new MediaPlayer();
mediaPlayer.setAudioStreamType(AudioManger.STREAM_MUSIC);//设置声音流的类型

MediaPlayer接收的声音类型有如下几种:

l  AudioManger.STREAM_MUSIC:音乐

l  AudioManger.STREAM_RING:铃声

l  AudioManger.STREAM_ALARM:闹钟

l  AudioManger.STREAM_NOTIFICTION:提示音

2、设置数据源

设置数据源的方式有三种,分别是设置播放应用自带的音频文件、设置播放SD卡中的音频文件、设置播放网络音频文件。具体代码如下:

//播放应用res/raw目录下的自带的音频文件
mediaPlayer.create(this,R.raw.xxx);
//播放SD卡中的音频文件
mediaPlayer.setDataSource(“mnt/sdcard/xxx.mp3”);
//播放网络音频文件
mediaPlayer.setDataSourse(“http://www.xxx.mp3”);

3、播放音乐

播放本地音乐文件与播放网络文件有所不同,当播放本地文件时使用的是prepare();方法通知底层框架准备播放音乐,而准备播放网络音频文件使用prepareAsync()方法。具体代码如下:

//播放本地文件
mediaPlayer.prepare();
mediaPlayer.start();
//播放网络文件
mediaPlayer.prepareAsync();
mediaPlayer.setOnPreparedListener(newOnPreparedListener() {
                   
                    @Override
                    public void onPrepared(MediaPlayermediaPlayer) {
                             // TODO 自动生成的方法存根
                             mediaPlayer.start();
                    }
           });

注意:当播放网络中的文件时,需要添加网络访问权限

<uses-permission android:name="android.permission.INTERNET"/>


Prepare()与PreoareAsync()的区别:

l  Prepare()是同步操作,在主线程中执行,它会对音频文件进行解码,当prepare()执行完毕之后才会继续向下执行。

l  prepareAsync()是子线程中执行的异步操作,不管它有没有执行完成都不音响主线程的执行操作。但是,如果音频文件没有解码完毕就执行start()方法会播放失败。因此这里这里要监听音频准备好的监听器OnPreparedListener()。当音频解码完成可以播放时会执行OnPreparedListener()中的onPrepared()方法,在该方法中执行播放音乐的操作即可。

 

2、SoundPool播放音频

在游戏开发中经常需要播放一些游戏音效(比如爆炸声、物体撞击声等),这些音效的共同特点就是短促、密集、延迟程度小。在这种情况下可以使用SoundPool代替MediaPlayer来播放这些音效。下面分步骤讲解如何使用SoundPool播放音效:

1、创建SoundPool对象

在创建SoundPool对象时可以使用它的构造方法,该方法有三个参数

SoundPool soundPool=new SoundPool(int maxStreams, int streamType,int srcQuality);


l  maxStreams:同时播放的流的最大数量。

l  streamType:流的类型,一般为AudioManger.STREAM_MUSIC:音乐。

l  srcQuality采样转化率质量,当前无效可以使用0作为默认值。

2、将多个声音添加到Map中

创建好SoundPool对象后需要添加音乐文件,音乐文件素材放在res/raw目录下或assets目录下。一般多个声音添加到一个Map中,具体代码如下:

SoundPoolsoundPool=new SoundPool(maxStreams, streamType,srcQuality);
        Map<Integer, Integer> map=new HashMap<Integer, Integer>();
        map.put(0, soundPool.load(this, R.raw.dingdong, 1));
     map.put(1,soundPool.load(this, R.raw.bang, 1));


soundPool.load()方法是为soundPool对象添加音乐文件,其中第三个参数表示文件加载的优先级。

3、VideoView播放视频

 

播放视频文件与播放音频文件类似,只是,视频的播放需要视觉组件将影像显示出来。在Android中主要使用VideoView和SurfaceVIew播放视频,其中VIdeoVIew组件播放视频最为简单,它将视频的显示和控件集于一身,由于VideoView的用法和MediaPlayer类似,其中提供的常用方法就不一一介绍了,其中setVideoPath():设置要播放的视频文件的位置需要知道。

具体步骤如下:

1、  创建VideoView

不同于音乐播放器,视频播放器需要在界面上显示,因此首先要在布局文件中创建VideoView控件

     <VideoView
        android:id="@+id/videoView1"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        />


2、  视频播放

使用VideoView播放视频和音频一样,既可以本地播放,也可以播放网络中的视频,具体代码如下:

VideoViewvideoView=(VideoView) findViewById(R.id.videoView1);
    //播放本地视频
    videoView.setVideoPath("mnt/sdcard/b.avi");
    //加载网络视频
    videoView.setVideoURI("http://www.xxx.avi");
videoView.start();


注意:播放网络视频时需要添加网络访问权限

<uses-permission android:name="android.permission.INTERNET"/>

这里上传一下代码:

import android.app.Activity;
import android.graphics.Color;
import android.net.Uri;
import android.os.Bundle;
import android.os.Environment;
import android.widget.MediaController;
import android.widget.VideoView;

public class Video extends Activity {
	@Override
	protected void onCreate(Bundle savedInstanceState) {
		// TODO Auto-generated method stub
		super.onCreate(savedInstanceState);
		setContentView(R.layout.video);
		
		VideoView vv = (VideoView) findViewById(R.id.videoView1);
		
		MediaController mc=new MediaController(this);//设置默认控制器,里面自带暂停,快进,播放
		mc.setBackgroundColor(Color.YELLOW);
		vv.setMediaController(mc);//讲控制器添加到VideoView中去
		
		Uri data=Uri.parse(Environment.getExternalStorageDirectory().getAbsolutePath()+"/auqi.3gp");
		vv.setVideoURI(data);
		
		vv.start();
	}
}


3、  为VideoView添加控制器

使用VideoView播放视频时可以为他添加一个控制器或媒体播放器MediaController,它是一个包含媒体播放器(MediaPlayer)控件的视图。它自带播放按钮,如播放、暂停、倒带、快进与进度滑动器

MediaController controller=new MediaController(context);
videoView.setMediaController(controller);//为VideoView绑定控制器

4、通过Intent意图调用自带视频播放器

 

利用Intent只是调用系统自带的视频播放器

Intent intent=new Intent(android.content.Intent.ACTION_VIEW);
			Uri uri=Uri.parse(Environment.getExternalStorageDirectory().getAbsolutePath()+"/auqi.3gp");
			intent.setDataAndType(uri, "video/3gp");//注意这个Type是由文件类型(video)和播放的格式(3gp)所组成
			startActivity(intent);


5、MediaPlayer和SurfaceView播放视频


当开发者需要根据需求自定义视频播放器的时候,使用VideoVIew就会很麻烦。为此,Android系统中还提供另一种播放视频的方式,就是MediaPlayer和Surface结合使用。MediaPlayer可以播放视频,只不过它在播放视频时没有图像输出(注意这句话),因此需要使用SurfaceVIew组件。

SurfaceVIew是继承自View用于显示图像的组件。SurfaceVIew最大的特点就是它的双缓冲技术,所谓的双缓冲就是在它的内部有两个线程,例如A线程和B线程。当线程A更新界面时,线程B进行后台技术操作,当两个线程都完成各自的任务时,它们会互相交换,两个线程就这样无限循环交替更新和计算。由于SurfaceVIew这种特性可以避免画图任务繁重而造成的主线程的阻塞,从而提高了程序的反应速度,因此在游戏开发中多用SurfaceVIew,例如游戏中的背景、人物、动画等

1、创建SurfaceVIew控件

SurfaceVIew是一个控件,使用时需要在布局文件中定义

<SurfaceView
        android:id="@+id/surfaceView1"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        />


2、获取界面显示容器并设置类型

布局创建好之后,在代码中找到控件并得到SurfaceVIew的容器SurfaceHolder

具体代码如下:

SurfaceView view = (SurfaceView)findViewById(R.id.surfaceView1);
        SurfaceHolder holder=view.getHolder();
     holder.setType(SurfaceHolder.SURFACE_TYPE_PUSH_BUFFERS);


是一个接口类型,就是一个容器,通过SurfaceHolder对象控制SurfaceView的大小和像素格式,监控控件中的内容格式

  在这里添加SurfaceHolder.SURFACE_TYPE_PUSH_BUFFERS参数为的是不让SurfaceView自己维护双缓冲区,而是交给MediaPlayer底层去管理。虽然该API已经过时了,但是在Android4.0版本以下的系统中必须添加该参数

注意播放视频是MediaPlayer框架

3、为SurfaceView添加回调

如果onCreate()方法执行时,SurfaceView还没有完全创建好。这时候播放视频会出现异常,因此,需要添加SurfaceHolder的回调函数CallBack,在SurfaceCreated()方法中执行视频的播放

CallBack接口一共有三个回调方法:

l  surfaceChanged():SurfaceView的大小发生变化
l  surfaceCreated():SurfaceView的holder被创建
l surfaceDestroyed():SurfaceView的holder被销毁


4、创建MediaPlayer并与SurfaceView的holder被创建

MediaPlayer mediaPlayer = new MediaPlayer();
        mediaPlayer.setDataSource("SD卡的路径");
        mediaPlayer.setDisplay(holder);
     mediaPlayer. prepareAsync ();
mediaPlayer.start();


 这里使用mediaPlayer.setDisplay(holder);将播放的视频显示在SurfaceView的容器holder中。并且视频一般很大,因此都需要使用prepareAsync()异步准备

 先看一下代码:

import java.io.IOException;

import android.app.Activity;
import android.media.MediaPlayer;
import android.media.MediaPlayer.OnPreparedListener;
import android.os.Bundle;
import android.os.Environment;
import android.util.Log;
import android.view.Display;
import android.view.SurfaceHolder;
import android.view.SurfaceView;
import android.widget.LinearLayout;

public class ThreeKindsVideoActivity extends Activity implements SurfaceHolder.Callback,OnPreparedListener{
    /** Called when the activity is first created. */
	SurfaceHolder surfaceHolder;
    SurfaceView surfaceView;
	MediaPlayer mediaPlayer;
	Display current;
	int videoHeight;
	int videoWidth;
    public void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.main);
        surfaceView = (SurfaceView) findViewById(R.id.surfaceView);
		current = getWindowManager().getDefaultDisplay();//获取设备的尺寸  
		SurfaceHolder surfaceHolder = surfaceView.getHolder();// 找到容器SurfaceHolder		
		surfaceHolder.setType(SurfaceHolder.SURFACE_TYPE_PUSH_BUFFERS);// 创建一个缓冲区,为了看视频不卡顿
		surfaceHolder.addCallback(this);// 添加SurfaceHolder的回调函数,类似于监听,所以需要添加实现接口的方法SurfaceHolder.Callback
    }
	@Override
	public void surfaceChanged(SurfaceHolder holder, int format, int width,
			int height) {
		// TODO 自动生成的方法存根
		
	}
	@Override
	public void surfaceCreated(SurfaceHolder holder) {
		// TODO 自动生成的方法存根
		String path = Environment.getExternalStorageDirectory()
				.getAbsolutePath() + "/auqi.3gp";
		@Override
	public void onPrepared(MediaPlayer mp) {
		// TODO 自动生成的方法存根
	/*	// 在播放之前,设置surface的大小与视频尺寸大小匹配
		// 首先获取视频的尺度
		videoHeight = mediaPlayer.getVideoHeight();
		videoWidth = mediaPlayer.getVideoWidth();
		// 如果视频的宽度或高度大于显示器的高度,找一个合理的比例进行缩放
		if (videoHeight > current.getHeight()
				|| videoWidth > current.getWidth()) {
			// 获取视频与显示器的比例
			float heightRatio =(float)videoHeight/(float) current.getHeight();
			float widthRatio = (float) videoWidth / (float) current.getWidth();
			// 我们按较大的尺寸缩放,主要保证视频的尺寸在显示范围内
			if (heightRatio > 1 || widthRatio > 1) {
				if (widthRatio > heightRatio) {
					videoWidth = (int) Math.ceil((float)videoWidth / (float)widthRatio);
					videoHeight = (int) Math.ceil((float)videoHeight / (float)widthRatio);
				}else {
					videoWidth = (int) Math.ceil((float)videoWidth / (float)heightRatio);
					videoHeight = (int) Math.ceil((float)videoHeight / (float)heightRatio);
				}
			}
			
		}//videoWidth,videoHeight是缩放后的尺寸,根据这个尺寸来制作显示Surface的大小
		surfaceView.setLayoutParams(new LinearLayout.LayoutParams(videoWidth, videoHeight));*/
		mediaPlayer.start();
	}
Log.i("mwijfd没撒扩大 萨达萨达", "mwijfd没撒扩大 萨达萨达");
		try {
			mediaPlayer=new MediaPlayer();
			mediaPlayer.setDataSource(path);
		} catch (IllegalArgumentException e) {
			// TODO Auto-generated catch block
			//finish();// 此次有异常最好finish一下
			e.printStackTrace();
		} catch (SecurityException e) {
			// TODO Auto-generated catch block
			e.printStackTrace();
		} catch (IllegalStateException e) {
			// TODO Auto-generated catch block
			e.printStackTrace();
		} catch (IOException e) {
			// TODO Auto-generated catch block
			e.printStackTrace();
		}
		Log.i("mwijfd没撒扩大 萨达萨达", "mwijfd没撒扩大 萨达萨达");
		mediaPlayer.setDisplay(surfaceHolder);// 通过容器将SurfaceView与MediaPlayer进行关联
		mediaPlayer.prepareAsync();
		//将播放的视频显示在SurfaceView的容器holder中。并且视频一般很大,因此都需要使用prepareAsync()异步准备
	}
	@Override
	public void surfaceDestroyed(SurfaceHolder holder) {
		// TODO 自动生成的方法存根
		
	}
       @Override
	public void onPrepared(MediaPlayer mp) {
		// TODO 自动生成的方法存根
	<span style="color:#ff0000;">/*	// 在播放之前,设置surface的大小与视频尺寸大小匹配
		// 首先获取视频的尺度
		videoHeight = mediaPlayer.getVideoHeight();
		videoWidth = mediaPlayer.getVideoWidth();
		// 如果视频的宽度或高度大于显示器的高度,找一个合理的比例进行缩放
		if (videoHeight > current.getHeight()
				|| videoWidth > current.getWidth()) {
			// 获取视频与显示器的比例
			float heightRatio =(float)videoHeight/(float) current.getHeight();
			float widthRatio = (float) videoWidth / (float) current.getWidth();
			// 我们按较大的尺寸缩放,主要保证视频的尺寸在显示范围内
			if (heightRatio > 1 || widthRatio > 1) {
				if (widthRatio > heightRatio) {
					videoWidth = (int) Math.ceil((float)videoWidth / (float)widthRatio);
					videoHeight = (int) Math.ceil((float)videoHeight / (float)widthRatio);
				}else {
					videoWidth = (int) Math.ceil((float)videoWidth / (float)heightRatio);
					videoHeight = (int) Math.ceil((float)videoHeight / (float)heightRatio);
				}
			}
			
		}//videoWidth,videoHeight是缩放后的尺寸,根据这个尺寸来制作显示Surface的大小
		surfaceView.setLayoutParams(new LinearLayout.LayoutParams(videoWidth, videoHeight));*/</span>
		mediaPlayer.start();
	}
}
注意部分onPrepared()中的内容 如果不是正规用途就没必要写,因为这部分是为了调整视频的大小和播放器的大小相匹配而写的代码



 

 

 



 

 

 

 

 

 





 

 

 

 

 

 

Android多媒体播放器项目实战源码详解 本文还有配套的精品资源,点击获取 简介:本项目为基于Android的多媒体播放应用,涉及多媒体框架使用、用户界面设计、文件管理、音视频编解码技术、流媒体支持、权限管理、异步处理、服务与通知处理、事件监听及性能优化等关键知识点。通过源码分析,开发者可以全面掌握Android平台上的多媒体播放技术,并提升编程技能。 1. Android项目多媒体播放器概念解析 ... 阅读详情

相关推荐

Android多媒体播放功能详解与实战

本文还有配套的精品资源,点击获取 简介:本文介绍了在Android应用中实现本地视频和音频播放的方法,详细讲解了使用VideoView、ExoPlayer、MediaPlayer和AudioFocus等API的实现步骤。包括获取本地文件列表、UI设计与事件处理、权限管理以及错误处理与优化。通过分析"VideoAndAudio-master"项目中的源码,开发者可以全面掌握A...

weixin_42509888的博客 1410

Android多媒体框架:从MediaPlayer到NuPlayer

Android上经常会使用到MediaPlayer去播放音频和视频。但是从严格意义上来说,MediaPlayer并不是播放器本身,它只是Android框架层众多媒体播放器(包括ROM厂商自定义的播放器)的“壳”。 MediaPlayer的主要操作(包括但不限于播放、暂停、快进等)都会调用到框架层的播放器,比如常见的NuPlayer播放器。

yihanss的博客 2992

类银河恶魔城游戏开发学习笔记(0)

解决B站搬运【Unity教程】从0编程制作类银河恶魔城游戏P37中moveState和idleState循环切换的问题

Gellar的博客 1447

Android多媒体功能开发(9)——使用SurfaceView控件+MediaPlayer类播放视频

使用SurfaceView控件+MediaPlayer类播放视频的主要原理是把MediaPlayer对象的显示控件设置为SurfaceView对象。播放控制都是针对MediaPlayer对象,用法与播放音频相同。

nanoage的博客 2928

手把手教你用gym训练宇树GO2机器人模型(附完整配置文件)

本文提供了一份详细的实战指南,教你如何使用Gym框架为宇树GO2四足机器人搭建强化学习训练环境。文章深入解析了环境配置、参数调试、奖励函数设置等关键步骤,并分享了避开常见陷阱的经验,旨在帮助开发者高效完成模型训练。

oo7890的博客 322

直流无刷BLDC六步换相“电流环”、“速度环”的关系

4、在电流闭环模式下,电机的电流严格按给定电流运行,负载大小变化时,电流不变,电机速度跟随负载非正常变化,例如速度严重“超速”时,需要“限速”保护,这个任务是“速度环”的,这时“速度环”会根据设定的速度上限,控制触发器,将电机速度迅速将下来,电流降下来,在“限速”保护期间,“电流环”失去对触发器的控制作用;3、在电流闭环模式下,电机的电流严格按给定电流运行,负载大小变化时,电流不变,电机速度跟随负载正常变化,“速度环”对速度大小的控制作用是没有的;6、很多人想当然,“电流环”不工作,电机“电流”哪里来的?

u011878611的博客 5469

Android SurfaceView+MediaPlayer视频按比例缩放,视频添加同比例描点标记tag

视频切换横竖屏参考文章: https://blog.youkuaiyun.com/csdnwr/article/details/121141056 第一步:圈定画布为 宽400像素. 高度videoScale计算出实际像素 public static float videoScale = 16f / 9f; float videoX = 400f; String videoy = (videoX / videoScale) + ""; double vide..

csdnwr的博客 2842

Arduino平台软硬件原理及使用——Arduino Uno板卡的使用

Arduino Uno板卡的基本使用

洪博hopes的博客 4172

android surfaceview 大小,MediaPlayer + SurfaceView(视频大小和surfaceview大小)

第一部分:问题的出现需求:页面有很多布局,其中有一块区域播放视频,当我单击这块区域的时候,全屏播放。我使用MediaPlayer +SurfaceView,当全屏时,改变SurfaceView的大小,然后MediaPlayer.setHolder(mSurfaceViewHolder),但是,只有SurfaceView改变了,但是视频大小仍然没有改变。而且在不设置surfaceHolder的情况下...

weixin_42360778的博客 1550

有趣的方式学习DDR5(4)—— DDR5 SDRAM 启动与初始化过程全攻略

🟢。

weixin_43199439的博客 1623

手把手教你学Simulink——基于经典PID控制的电机系统场景实例:BLDC电机PID电流控制策略仿真

*无刷直流电机(Brushless DC Motor, BLDC)**因其高效率、长寿命和低维护成本,在众多领域如家用电器、工业自动化、电动汽车等得到了广泛应用。为了实现对BLDC电机的有效控制,通常采用基于霍尔传感器或反电动势检测的换相技术,并结合电流闭环控制以提高系统的动态响应和稳定性。本教程将带你使用构建一个基于PID控制的BLDC电机电流控制策略仿真模型BLDC电机建模PID控制器设计与应用系统仿真与调试控制效果分析本文介绍了如何使用构建一个。

MHD0815的博客 196

简述调用Android多媒体类,Android多媒体开发技术实战详解

Android多媒体开发技术实战详解编辑锁定讨论上传视频《Android多媒体开发技术实战详解》是2012年出版的图书,作者是熊斌。该书主要讲述了Android多媒体开发技术的实战过程。作者熊斌ISBN9787121175800页数490定价66.00元出版时间2012-8装帧平装副标题Android多媒体开发技术实战详解Android多媒体开发技术实战详解内容介绍...

weixin_34158442的博客 271

麒麟操作系统安装教程(保姆级)

本文介绍了如何在VM中安装麒麟操作系统,文章详细的介绍了麒麟操作系统按钻过步骤。

啊渊的专栏 1万+

android 多媒体数据库详解

主要分为几节: 1. Android的媒体文件内部是如何存储的? 2. Andoid的媒体文件如何获取? 3. 在使用媒体文件的一些小技巧。 1. Android的多媒体如何存储的? Android的多媒体文件主要存储在/data/data/com.android.providers.media/databases目录下,该目录下有两个db文件,一个是内部存储数据库文件(internal

叶园 1万+

calibre:将calibre 的layer number 转换为实际的laymer 名称(7)

可以使用与版图数据库配套的(Standard Verification Rule Format,标准验证规则格式),在 Calibre DESIGNrev 中加载图层名称。

u013620135的博客 984

jre9下载 jdk9

(Java SE Runtime Environment 9.0) 9.0u175 官方最新版 【x86|x64】

android多媒体框架学习 详解

原址 一:多媒体框架概述      jellybean 的多媒体跟以前的版本,通过对比没啥变化,最大的变化是google终于舍得给multimedia建个独立的git了(framework/av),等你好久了!也体现了media 在整个android系统中的重要性!framework/av下都是些C/C++代码(libmedia,libmediaplayerservice,libstagefr...

Android系统攻城狮 3677

锂电池充电器电路设计 里面有电路

锂电池充电器电路设计 里面有电路 3.7V升压到5V电路设计。

android 多媒体知识,Android 多媒体和相机详解一

Android 手机应用多媒体框架包含了获取和回放音频,视频和各种类形的图像的功能,所以你可以很容易的把它们整合到你的应用中.你可以从存储在资源中的文件,文件系统中的文件,或从网络数据流中播放音频或视频,这些都是用MediaPlayer或JetPlayerAPI实现手机APP .你也可以使用MediaRecorderand Camera API来录制声音,视频或抓取图片.下面的主题向你演示了如何使...

weixin_39849762的博客 269

假人有限元模型

假人模型,车辆碰撞假人有限元模型,适合做乘员安全的研究者利用

android 多媒体和相机详解一

Android多媒体框架包含了获取和回放音频,视频和各种类形的图像的功能,所以你可以很容易的把它们整合到你的应用中.你可以从存储在资源中的文件,文件系统中的文件,或从网络数据流中播放音频或视频,这些都是用MediaPlayer或JetPlayerAPI实现.你也可以使用MediaRecorderand Camera API来录制声音,视频或抓取图片.   下面的主题向你演示了如何使用An

艾文-- 技术总结学习专栏 974

Android 多媒体MediaPlayer使用详解

现在的手机功能越来越丰富了,遥想10年前,MP3,MP4,MP5,还是很流行的,博主当时读高中时很想拥有一台,可以听音乐和看电影。可是条件有限,学校也禁止此东西,所以只能偷偷的玩。而现在我们的手机也很早以前就支持了这些功能,而且界面和功能也远远超过了MP4。好吧,说多了,今天本文介绍的是Andriod系统自带的Mediaplayer,和VideoView实现简单的音乐和视频的播放,至于想做出如酷狗

gongwq的博客 3万+

关于安卓多媒体类详解:MediaStore

2019独角兽企业重金招聘Python工程师标准>>> ...

weixin_34344403的博客 213

android多媒体框架学习 详解 最新版本

一:多媒体框架概述 jellybean 的多媒体跟以前的版本,通过对比没啥变化,最大的变化是google终于舍得给multimedia建个独立的git了(framework/av),等你好久了!也体现了media 在整个android系统中的重要性!framework/av下都是些C/C++代码(libmedia,libmediaplayerservice,libstagefri...

weixin_33971205的博客 3437

Android中多媒体数据库各字段详解

数据表字段解析如下: images:图片信息 字段 解析 _id 主键。图片 id,从 1 开始自增 _data 图片绝对路径 _size 文件大小,单位为 byte _display_name 文件名 mime_type 类似于 image/jpeg 的 MIME 类型 title 不带扩展名的文件

Mr_Lin 5132
上一篇: Android中实现从SD卡的Gallery画廊带回图片
下一篇: 关于FrameLayout布局的位置问题
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值