Camera、音频录制与Vitamio框架
一、Camera
1、概述
Android框架包含了各种相机哥相机功能的支持,是你可以在应用中捕获图像和视频。
在应用能使用设备上的相机之前,先想一想将来会如何使用此硬件:
(1)Camera 应该在namifest文件中声明需要相机
(2)快速图像或自定义特性
(3)存储
Android框架支持通过Camera API或Camera intent来抓取图像和视频:
- Camera 此类事控制设备相机的主要API,此类用于在创建相机应用时获取图片和视频
- SurfaceView 此类为用户提供camera的实时图像预览
- MediaRecorder 此类用于从camera录制视频
- Intent 一个MediaStore.ACTUIN_IMAGE_CAPTURE或MediaStore.ACTION_VIDIO_CAPTURE的intent,可以使用它来抓取图像或视频,而不用操作Camera对象。
2、Manifest中的声明
添加使用设备相机的权限:
<uses-permission android:name="android.permission.CAMERA"/>
声明要使用的相机特性:
<uses-feature android:name="android.hardware.camera2" />
如果应用需要使用相机或者相机的一些特性,但又不是必须的,则应该在manifest中指定这些需求,把android:required属性设置为false:
<uses-feature android:name="android.hardware.camera2" android:required="false" />
<uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE"/>
AudioRecording Permission
在使用视频捕获设备来录制视频时,应用必须请求音频捕获权限:
<uses-permission android:name="android.permission.RECORD_AUDIO"/>
3、使用现有的相机应用
一个不用写代码来获取图片和视频的快速方法是使用Intent来调用现有的Android camera应用,一个camera intent调用显存的相机应用抓取图片或视频剪辑然后返回到应用。
调用一个相机Intent,主要有以下步骤
(1)组建一个相机Intent:创建一个请求图片或视频的Intent,试用以下intent类型中的一个:
MediaStore.ACTION_IMAGE_CAPTURE:从已存的相机应用中请求一个图片
MediaStore.ACTION_VIDIO_CAPTURE:从已存在的相机应用中请求一个视频
(2)启动这个相机Intent:使用startActivityForResult()方法来执行相机intent,再启动intent之后,相机应用的界面会出现在设备屏幕上,然后用户就可以用它来获取图片或视频。
(3)接收Intent结果:在应用中设置一个onActivityResult()方法来接受从相机intent来的回调和数据,当用户获取了一个图片或视频后(或取消了操作),系统就会调用此方法。
4、图像获取intent
5、视频获取intent
使用相机intent获取食品时使用最少代码使得你的应用获取视频的捷径。
一个视频获取intent可以包含以下额外信息:
(1)MediaStore.EXTRA_OUTPUT:此设置需要一个保存视频的路径和文件名的Uri。此设置是可选的但强烈推荐,如果不指定此值,相机应用就把请求到的图像以默认的文件名保存到默认的文件夹下,这些信息保存在返回的intent的Intent.getData()字段中
(2)MediaStore.EXTRA_VIDIO_QUALITY:此值在最低质量最小文件尺寸时是0,在最高质量最大尺寸时是1
(3)MediaStore.EXTRA_DURATION_LIMIT:此值设置获取视频的长度,以秒为单位
(4)MediaStore.EXTRA_SIZE_LIMIT:此值设置获取视频文件的大小,以字节为单位。
public class MainActivity extends Activity { private Uri uri; private static final int MEDIA_TYPE_IMAGE = 1; private static final int MEDIA_TYPE_VIDEO = 2; @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_main); } //拍照 public void imageCapture(View view) { Intent intent = new Intent(); intent.setAction(MediaStore.ACTION_IMAGE_CAPTURE); startActivityForResult(intent, MEDIA_TYPE_IMAGE); } //录视频 public void vidioCapture(View view) { Intent intent = new Intent(); intent.setAction(MediaStore.ACTION_VIDEO_CAPTURE); intent.putExtra(MediaStore.EXTRA_OUTPUT, getOutputMediaFileUri(MEDIA_TYPE_VIDEO)); intent.putExtra(MediaStore.EXTRA_VIDEO_QUALITY, 1); startActivityForResult(intent, MEDIA_TYPE_VIDEO); } @Override protected void onActivityResult(int requestCode, int resultCode, Intent data) { super.onActivityResult(requestCode, resultCode, data); switch (resultCode) { case RESULT_OK: if (MEDIA_TYPE_IMAGE == requestCode) { uri = data.getData(); Toast.makeText(MainActivity.this, uri.getPath().toString(), Toast.LENGTH_SHORT).show(); } else if (MEDIA_TYPE_VIDEO == requestCode) { } break; } } private Uri getOutputMediaFileUri(int type) { return Uri.fromFile(getOutputMediaFile(type)); } private File getOutputMediaFile(int type) { File file = null; String rootPath = null; switch (type) { case MEDIA_TYPE_IMAGE: rootPath = Environment.getExternalStoragePublicDirectory(Environment.DIRECTORY_PICTURES).getPath(); file = new File(rootPath + File.separator + System.currentTimeMillis() + ".jpg"); break; case MEDIA_TYPE_VIDEO: rootPath = Environment.getExternalStoragePublicDirectory(Environment.DIRECTORY_MOVIES).getPath(); file = new File(rootPath + File.separator + System.currentTimeMillis() + ".mp4"); Toast.makeText(MainActivity.this, file.toString(), Toast.LENGTH_SHORT).show(); break; } return file; } }
二、音频录制
1、步骤
Android为我们提供了android.media.MediaRecorder类用于音频录制,步骤如下:
(1)创建android.media.MediaRecorder实例
(2)设置音源MediaRecorder.setAudioSource(),可以是通过MediaRecorder.AudioSource.MIC
(3)设置输出文件的格式,MediaRecorder.setOutPutFormat()
(4)设置输出文件,MediaRecorder.setOutputFile()
(5)设置音频编码MediaRecorder.setAudioEncoder()
(6)调用MediaRecorder.prepare()
(7)调用MediaRecorder.start()开始录制
(8)调用MediaRecorder.stop()停止录制
(9)完成或结束录制调用MediaRecorder.release()来释放资源
2、示例
<uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE"/> <uses-permission android:name="android.permission.RECORD_AUDIO"/>
public class MainActivity extends Activity implements MediaRecorder.OnErrorListener { private MediaRecorder mr; private Boolean prepared = false; private Button btnRecorder, btnStop; @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_main); btnRecorder = (Button) findViewById(R.id.btnRecorder); btnStop = (Button) findViewById(R.id.btnStop); init(); } private void init() { mr = new MediaRecorder(); //设置声音来源 mr.setAudioSource(MediaRecorder.AudioSource.MIC); //设置输出格式 mr.setOutputFormat(MediaRecorder.OutputFormat.THREE_GPP); mr.setAudioEncoder(MediaRecorder.AudioEncoder.AMR_NB); String path = Environment.getExternalStoragePublicDirectory(Environment.DIRECTORY_MUSIC) + File.separator + System.currentTimeMillis() + ".mp3"; mr.setOutputFile(path); try { mr.prepare(); prepared = true; } catch (IOException e) { e.printStackTrace(); } btnStop.setEnabled(false); } public void recorderClick(View view) { if (prepared) { mr.start(); btnStop.setEnabled(true); btnRecorder.setEnabled(false); } } public void stopClick(View view) { mr.stop(); btnStop.setEnabled(false); btnRecorder.setEnabled(true); } @Override public void onError(MediaRecorder mediaRecorder, int i, int i1) { } @Override protected void onDestroy() { super.onDestroy(); if (mr != null) { mr.reset(); } } }
三、Vitamio框架
vitamio能够流畅播放720p甚至1090高清MKV、FLV、MP4、MOV、TS、RMVB等常见格式的视频,还可以在Android与IOS上跨平台支持MMS、RTSP、RTMP和HLS(m3u8)等常见的多种视频流媒体协议,包括点播与直播。
https://www.vitamio.org/