一、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/

Camera、音频录制与Vitamio框架的更多相关文章

  1. vitamio框架

    import io.vov.vitamio.LibsChecker; import io.vov.vitamio.MediaPlayer; import io.vov.vitamio.MediaPla ...

  2. javaCV开发详解之5:录制音频(录制麦克风)到本地文件/流媒体服务器(基于javax.sound、javaCV-FFMPEG)

    javaCV系列文章: javacv开发详解之1:调用本机摄像头视频 javaCV开发详解之2:推流器实现,推本地摄像头视频到流媒体服务器以及摄像头录制视频功能实现(基于javaCV-FFMPEG.j ...

  3. Android 开发 MediaRecorder音频录制

    前言 MediaRecorder类是Android sdk提供的一个专门用于音视频录制,一般利用手机麦克风采集音频和摄像头采集图像.这个类是属于简单的音频录制类,录制音频简单容易但是对音频流的控制也比 ...

  4. Android 开发 AudioRecord音频录制

    前言 Android SDK 提供了两套音频采集的API,分别是:MediaRecorder 和 AudioRecord,前者是一个更加上层一点的API,它可以直接把手机麦克风录入的音频数据进行编码压 ...

  5. Android音频录制MediaRecorder之简易的录音软件实现代码(转)

    原文:http://www.jb51.net/article/46182.htm Android音频录制MediaRecorder之简易的录音软件实现代码 这篇文章主要介绍了Android音频录制Me ...

  6. iOS音频学习笔记二:iOS SDK中与音频有关的相关框架

      上层:       Media Player Framework: 包含MPMoviePlayerController.MPMoviePlayerViewController.MPMusicPla ...

  7. Ubuntu18.04下的音频录制和编辑软件Ardour及QjackCtl(jackd gui)

    Ardour 是一个Linux和OSX下的多音轨录制和数字音频编辑软件. 需要配合ALSA或者JACK总线使用. 快速入门 http://brunoruviaro.github.io/ardour4- ...

  8. <Android Framework 之路>Android5.1 Camera Framework(四)——框架总结

    前言 从之前的几篇文件,可以基本弄清楚 Camera从APK,经过framework的衔接,与HAL层进行交互,最终通过驱动完成Camera的一些动作. Camera层次分析 APP层 Framewo ...

  9. Edison:FL Studio中的常用音频录制与剪辑插件

    Edison是FL Studio中的一个完全集成的音频编辑和录制工具.Edison加载到效果插槽(在任何调音台音轨中),然后录制或播放该位置的音频.您可以在任意数量的混音器轨道或效果插槽中根据需要加载 ...

随机推荐

  1. 了解一下Git的常用语句

    简单学习了一下Git,整理了一点常用语句 http连接 git clone https://仓库地址 连接githup cd shop 进入文件夹 git config --global user.n ...

  2. js--数组的 Array.of() 和 Array.from() 方法的使用总结

    前言 JavaScript 中数组的本质是一个对象,它存在的 length 属性值随数组元素的长度变化,但是开发中经常会遇到拥有 length 属性和若干索引属性的对象,被称为类数组对象,类数组对象和 ...

  3. Windows内核中的CPU架构-8-任务段TSS(task state segment)

    Windows内核中的CPU架构-8-任务段TSS(task state segment) 任务段tss(task state segment)是针对于CPU的一个概念. 举一个简单的例子,你一个电脑 ...

  4. PKIX path building failed: sun.security.provider.certpath.SunCertPathBuilder,阿里MAVEN仓库地址更新为了https问题

    http://maven.aliyun.com/nexus/content/groups/public/,仓库地址更新为了https,所以下载时需要ssl认证,我们可以忽略ssl检查导致的问题,我们可 ...

  5. C#与dotNET项目想要另存为一个新项目sln文件丢了怎么办

    如下图所示,我想要另存一个工程,把 V4.4整个的项目另存为V4.5,我可以把解决方案文件(.sln)改名字,但是我没法把文件夹改名字,改了打开sln就说找不到. 很简单的一个思路是反正sln是多余的 ...

  6. 大爽Python入门教程 2-2 序列: 字符串、元组与列表

    大爽Python入门公开课教案 点击查看教程总目录 序列 序列(sequence): 顾名思义,有序的排列. 有序排列的一串数据. 一种容器,容器内成员有序排列. python的字符串str,元组tu ...

  7. Linux——搭建Samba(CIFS)服务器

    一.Samba的基本概念 Samba服务:是提供基于Linux和Windows的共享文件服务,服务端和客户端都可以是Linux或Windows操作系统.可以基于特定的用户访问,功能比NFS更强大. S ...

  8. 利用Fastjson注入Spring内存马

    此篇文章在于记录自己对spring内存马的实验研究 一.环境搭建 搭建漏洞环境,利用fastjson反序列化,通过JNDI下载恶意的class文件,触发恶意类的构造函数中代码,注入controller ...

  9. [Aizu1410]Draw in Straight Lines

    注意到当操作确定后,显然操作顺序总是涂黑色的1操作->涂白色的1操作->2操作 用$b/w_{r/c}(i,j)$表示$(i,j)$是否被黑色/白色 横着/竖着 涂过(1表示涂过,0表示没 ...

  10. [spojQTREE7]Query on a tree VII

    即QTREE5和QTREE6组合,即将原本维护子树范围内点数改为维护子树范围内最小值即可,由于最小值没有可减性,因此需要使用set (虽然形式上与QTREE5类似,但QTREE5维护的信息更巧妙一些, ...