`

多媒体的浅尝辄止

阅读更多
下面简单讲几种Android的多媒体技术,音频,视频,摄像头,录音。介绍的内容很简单,因为暂时没有用到,这是简单的学习一下。

首先讲下多媒体资源的位置:
1:源文件(即res/raw下或assets下)
2:文件系统(即sdcard)
3:流媒体(即网络)


声音:声音又游戏声音和歌曲等,游戏声音一般比较小,适合用SoundPool,歌曲比较大,适合用MediaPlayer。
SoundPool:

private SoundPool sp;
private int soundId;

@Override
protected void onCreate(Bundle savedInstanceState) {
	super.onCreate(savedInstanceState);
	setContentView(R.layout.activity_main);
		
	sp = new SoundPool(1, AudioManager.STREAM_MUSIC, 0);
	soundId = sp.load(this, R.raw.note1, 1);
		
	findViewById(R.id.btnPlaySound).setOnClickListener(new View.OnClickListener() {
			
	@Override
	public void onClick(View v) {				
//		声音ID,左声道(0-1.0),右声道,优先级,循环(0不循环,-1一直循环,rate声道频率0.5最慢,1正常,2最快)
//		sp.play(soundID, leftVolume, rightVolume, priority, loop, rate)
		sp.play(soundId, 1, 1, 0, 0, 2.0f);
	}
});
		
		
}

MediaPlayer:
import java.io.IOException;

import android.app.Activity;
import android.media.MediaPlayer;
import android.os.Bundle;
import android.view.View;

public class MainActivity extends Activity {
	
	private MediaPlayer mp=null;

	@Override
	protected void onCreate(Bundle savedInstanceState) {
		super.onCreate(savedInstanceState);
		setContentView(R.layout.activity_main);
		
		findViewById(R.id.btnPlaySong).setOnClickListener(new View.OnClickListener() {
			@Override
			public void onClick(View v) {
				if (mp!=null) {
					mp.start();
				}
			}
		});
	}
	
	@Override
	protected void onResume() {
		
		mp= MediaPlayer.create(this, R.raw.song);
		try {
			mp.prepare();
		} catch (IllegalStateException e) {
			e.printStackTrace();
		} catch (IOException e) {
			e.printStackTrace();
		}
		super.onResume();
	}
	
	@Override
	protected void onPause() {
		if (mp!=null) {
			mp.release();
		}
		super.onPause();
	}

}

视频:视频文件如果在raw下面的话,只能用MediaPlayer,如果是SD卡或者网络资源的话,可以用VideoView
MediaPlayer:

import java.io.IOException;
import android.app.Activity;
import android.media.MediaPlayer;
import android.os.Bundle;
import android.view.SurfaceHolder;
import android.view.SurfaceHolder.Callback;
import android.view.SurfaceView;

public class SurfaceViewPlayerActivity extends Activity {
	
	private SurfaceView sv;
	private SurfaceHolder holder;
	
	private Callback surfaceHolderCallback=new Callback() {
		
		private MediaPlayer mp;
		
		@Override
		public void surfaceDestroyed(SurfaceHolder holder) {
			mp.release();
		}
		
		@Override
		public void surfaceCreated(SurfaceHolder holder) {
			mp = MediaPlayer.create(SurfaceViewPlayerActivity.this, R.raw.movie);
			try {
				mp.prepare();
			} catch (IllegalStateException e) {
				e.printStackTrace();
			} catch (IOException e) {
				e.printStackTrace();
			}
			mp.setDisplay(holder);
			mp.start();
		}
		
		@Override
		public void surfaceChanged(SurfaceHolder holder, int format, int width,
				int height) {
		}
	};

	@Override
	protected void onCreate(Bundle savedInstanceState) {
		super.onCreate(savedInstanceState);
		
		sv = new SurfaceView(this);
		holder = sv.getHolder();
		holder.addCallback(surfaceHolderCallback);
		
		setContentView(sv);
	}

}

VideoView:
import android.app.Activity;
import android.os.Bundle;
import android.widget.MediaController;
import android.widget.VideoView;

public class VideoViewPlayerAvtivity extends Activity {

	
	private VideoView vv;
	
	@Override
	protected void onCreate(Bundle savedInstanceState) {
		super.onCreate(savedInstanceState);
		
		vv =new VideoView(this);
		setContentView(vv);
		vv.setVideoPath("/mnt/sdcard/movie.mp4");
		vv.setMediaController(new MediaController(this));
	}
}


摄像头:摄像头的使用分为两种,一种是使用摄像头,另外一种是直接调用系统的摄像头,
使用摄像头:

import java.io.File;
import java.io.FileOutputStream;
import java.io.IOException;

import android.app.Activity;
import android.content.Intent;
import android.hardware.Camera;
import android.os.Bundle;
import android.view.SurfaceHolder;
import android.view.SurfaceHolder.Callback;
import android.view.SurfaceView;
import android.view.View;
import android.widget.Toast;

public class MainActivity extends Activity {
	
	private SurfaceView cameraPreview;
	private Camera camera=null;
	private Callback cameraPreviewHolderCallback=new Callback() {
		
		@Override
		public void surfaceDestroyed(SurfaceHolder holder) {
			stopPreview();
		}
		
		@Override
		public void surfaceCreated(SurfaceHolder holder) {
			startPreview();
		}
		
		@Override
		public void surfaceChanged(SurfaceHolder holder, int format, int width,
				int height) {
		}
	};
	
	@Override
	protected void onCreate(Bundle savedInstanceState) {
		super.onCreate(savedInstanceState);
		setContentView(R.layout.activity_main);
		
		cameraPreview = (SurfaceView) findViewById(R.id.cameraPreview);
		cameraPreview.getHolder().addCallback(cameraPreviewHolderCallback);
		
		findViewById(R.id.btnTakePic).setOnClickListener(new View.OnClickListener() {
			
			@Override
			public void onClick(View v) {
				camera.takePicture(null, null, new Camera.PictureCallback() {
					
					@Override
					public void onPictureTaken(byte[] data, Camera camera) {
						
						String path=null;
						if ((path =saveTempFile(data))!=null) {
							
							Intent i = new Intent(MainActivity.this, ImagePreviewAty.class);
							i.putExtra("path", path);
							startActivity(i);
						}else{
							Toast.makeText(MainActivity.this, "保存照片失败", Toast.LENGTH_SHORT).show();
						}
					}
				});
			}
		});
	}
	
	private String saveTempFile(byte[] bytes){
		
		try {
			File f = File.createTempFile("img", "");
			FileOutputStream fos = new FileOutputStream(f);
			fos.write(bytes);
			fos.flush();
			fos.close();
			
			return f.getAbsolutePath();
		} catch (IOException e) {
			e.printStackTrace();
		}
		return null;
	}
	
	private void startPreview(){
		camera = Camera.open();
		try {
			camera.setPreviewDisplay(cameraPreview.getHolder());			
			camera.setDisplayOrientation(90);
			camera.startPreview();
		} catch (IOException e) {
			e.printStackTrace();
		}
	}
	
	private void stopPreview(){
		camera.stopPreview();
		camera.release();
	}

}


import java.io.File;

import android.app.Activity;
import android.net.Uri;
import android.os.Bundle;
import android.widget.ImageView;

public class ImagePreviewAty extends Activity {

	private ImageView iv;
	
	@Override
	protected void onCreate(Bundle savedInstanceState) {
		super.onCreate(savedInstanceState);
		
		iv = new ImageView(this);
		setContentView(iv);
		
		String path = getIntent().getStringExtra("path");
		if (path!=null) {
			iv.setImageURI(Uri.fromFile(new File(path)));
		}
	}
}

直接调用系统的摄像头:
import java.io.File;
import java.io.IOException;

import android.app.Activity;
import android.content.Intent;
import android.net.Uri;
import android.os.Bundle;
import android.os.Environment;
import android.provider.MediaStore;
import android.view.View;
import android.widget.ImageView;

public class MainActivity extends Activity {
		
	private static final int REQUEST_CODE_TAKE_PICTURE = 1;
	private ImageView iv;
	
	private File currentImageFile = null;

	@Override
	protected void onCreate(Bundle savedInstanceState) {
		super.onCreate(savedInstanceState);
		setContentView(R.layout.activity_main);
		
		iv = (ImageView) findViewById(R.id.iv);
		
		findViewById(R.id.btnStartSystemCamera).setOnClickListener(new View.OnClickListener() {
			
			@Override
			public void onClick(View v) {
//				Environment.getExternalStorageDirectory()  SD卡的根目录
				File dir = new File(Environment.getExternalStorageDirectory(), "pictures");
				if (!dir.exists()) {
					dir.mkdirs();
				}
				currentImageFile = new File(dir, System.currentTimeMillis()+".jpg");
				if (!currentImageFile.exists()) {
					try {
						currentImageFile.createNewFile();
					} catch (IOException e) {
						e.printStackTrace();
					}
				}
				
				Intent i = new Intent(MediaStore.ACTION_IMAGE_CAPTURE);
				i.putExtra(MediaStore.EXTRA_OUTPUT, Uri.fromFile(currentImageFile));
				startActivityForResult(i, REQUEST_CODE_TAKE_PICTURE);
			}
		});
	}	
	
	@Override
	protected void onActivityResult(int requestCode, int resultCode, Intent data) {
		
		switch (requestCode) {
		case REQUEST_CODE_TAKE_PICTURE:
			iv.setImageURI(Uri.fromFile(currentImageFile));
			break;
		default:
			break;
		}
		
		super.onActivityResult(requestCode, resultCode, data);
	}

}

录音:一个简单的录音例子,基本不怎么使用的
录音:

import java.io.File;
import java.io.IOException;

import android.app.Activity;
import android.media.MediaRecorder;
import android.os.Bundle;
import android.os.Environment;
import android.view.View;
import android.view.View.OnClickListener;

public class MainActivity extends Activity {

	private OnClickListener btnClickListener=new OnClickListener() {
		
		@Override
		public void onClick(View v) {
			
			switch (v.getId()) {
			case R.id.btnStartRecord:
				startRecord();
				
				break;
			case R.id.btnStopRecord:
				stopRecord();
				break;
			}
			
		}
	};
	
	private void startRecord(){
		if (mp==null) {
			
			File dir = new File(Environment.getExternalStorageDirectory(), "sounds");
			if (!dir.exists()) {
				dir.mkdirs();
			}
			
			File soundFile = new File(dir, System.currentTimeMillis()+".amr");
			if (!soundFile.exists()) {
				try {
					soundFile.createNewFile();
				} catch (IOException e) {
					e.printStackTrace();
				}
			}
			
			mp = new MediaRecorder();
			mp.setAudioSource(MediaRecorder.AudioSource.MIC);
			mp.setOutputFormat(MediaRecorder.OutputFormat.AMR_WB);
			mp.setAudioEncoder(MediaRecorder.AudioEncoder.AMR_WB);
			mp.setOutputFile(soundFile.getAbsolutePath());
			try {
				mp.prepare();
				mp.start();
			} catch (IllegalStateException e) {
				e.printStackTrace();
			} catch (IOException e) {
				e.printStackTrace();
			}
		}
	}
	
	private void stopRecord(){
		if (mp!=null) {
			
			mp.stop();
			mp.release();
			mp = null;
		}
	}
	
	private MediaRecorder mp=null;

	@Override
	protected void onCreate(Bundle savedInstanceState) {
		super.onCreate(savedInstanceState);
		setContentView(R.layout.activity_main);
		
		findViewById(R.id.btnStartRecord).setOnClickListener(btnClickListener);
		findViewById(R.id.btnStopRecord).setOnClickListener(btnClickListener);
	}

}
分享到:
评论

相关推荐

    深度学习,让语文教学不再浅尝辄止.pdf

    深度学习,让语文教学不再浅尝辄止.pdf

    JDNI浅尝辄止

    NULL 博文链接:https://heidaosajia.iteye.com/blog/794170

    front-end-interview:前端面试采访访谈收集,持续更新,勿浅尝辄止

    字体结束访谈前端面试采访访谈收集,持续更新,勿浅尝辄止此次更新合并了其他的面试题收集在一个项目,其他项目会删除掉clone或者Fork之后再克隆到本地安装环境npm我docsify-cli -g启动本地查看docsify服务docs面试...

    node_tasted:Node.js 浅尝辄止——分享至我仍未知道名字的十楼公司

    Node.js 浅尝辄止 By Kaidi, ZHU, R&D Engineer of and . 正确打开姿势 预备工作:请确保已安装 Node.js 在你的电脑。 安装 依赖。执行 $ npm install。 启动它,执行 $ npm start 。 在弹出的浏览器窗口中点击 ...

    experiments:浅尝辄止

    github repository学习记录

    JAVA 重点 难点集锦

    java 技术人员必备知识,不满足浅尝辄止的人士请下载。

    能就业的Python自动化测试开发实战 搞定分布式并发场景

    能就业的Python自动化测试开发实战 搞定分布式并发场景视频教程,完整版...让多少人浅尝辄止,无法有质的提升。为了从根源上摆脱束缚,本课程带你开发高扩展、高可用的自动化测试框架,助你更好的利用测试自动化技术。

    能就业的Python自动化测试开发实战 搞定分布式并发场景.rar

    能就业的Python自动化测试开发实战 搞定分布式并发场景视频教程,完整版...让多少人浅尝辄止,无法有质的提升。为了从根源上摆脱束缚,本课程带你开发高扩展、高可用的自动化测试框架,助你更好的利用测试自动化技术。

    生态足迹研究方法及应用展望

    以襄阳市2010年生态足迹计算、分析为例,结合当前生态足迹研究的现状和趋势,尝试提出存在的主要问题,并浅尝辄止的指出后续应在研究尺度更微观、改进计算方法和多种研究方法相结合等方面深 化生态足迹研究,以更好...

    \精通Linux设备驱动程序开发

    全书基于2.6内核,不仅透彻讲解了基本概念和技术,更深人探讨了其他书没有涵盖或浅尝辄止的许多重要主题和关键难点,如PCMCIA、I2C和USB等外部总线以及视频、音频、无线连网和闪存等驱动程序的开发,并讲解了相关的...

    数据库课件.zip

    此为数据库课件,包含8讲内容,适合浅尝辄止的同学自学使用!

    精通linux设备驱动程序开发

    全书基于2.6内核,不仅透彻讲解了基本概念和技术,更深人探讨了其他书没有涵盖或浅尝辄止的许多重要主题和关键难点,如PCMCIA、I2C和USB等外部总线以及视频、音频、无线连网和闪存等驱动程序的开发,并讲解了相关的...

    精通LINUX设备驱动程序开发

    全书基于2.6内核,不仅透彻讲解了基本概念和技术,更深人探讨了其他书没有涵盖或浅尝辄止的许多重要主题和关键难点,如PCMCIA、I2C和USB等外部总线以及视频、音频、无线连网和闪存等驱动程序的开发,并讲解了相关的...

    小白也能听懂人工智能原理

    要么太过晦涩难懂,满满都是复杂的数学公式,要么就是为了避免数学而浅尝辄止,让人不得要领,仅需中学数学知识就能看懂的人工智能入门课,零基础学习+多项目实战,重新解构入门AI陡峭的知识曲线。

    pandas教程,适合初级到中级晋升者,有了体系之后就看熟练度了

    作为一名数据科学行业从业者,即使在pandas...与此同时,我也通读了国内外各种pandas教程,不过总体而言这些教程多数浅尝辄止,不够实用。所以,我决定编写一套pandas教程,提高自己能力的同时,也能帮助大家少走弯路。

    【JavaScript源代码】Promise面试题详解之控制并发.docx

     在写这篇文章的时候我有点犹豫,因为先前写过一篇类似的,一道关于并发控制的面试题,只不过那篇文章只给出了一种解决方案,后来在网上又陆续找到两种解决方案,说来惭愧,研究问题总是浅尝辄止,所以今天便放在...

    《专家手记AJAX开发实战 》电子版

    在AJAX领域已经有一些非常好的图书出版,不过这些图书大都是用PHP、.Net等语言描述的,以Java实现的并不是很多,即使有也是浅尝辄止。不过《专家手记AJAX开发实战 》的出现改变了这一面貌。 这本书不仅用了大量...

    控制论与科学发展论

    很经典的,第一次觉得这类专著也很好看.是关于控制论这门学科的浅尝辄止,稳定的系统等学问

Global site tag (gtag.js) - Google Analytics