zoukankan      html  css  js  c++  java
  • 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/

  • 相关阅读:
    用sp_change_users_login消除Sql Server的孤立用户
    数据库连接字符串大全
    系统登录的设计与研究
    DB2常用命令大全(转)
    哈希表(HashTable)探究(转)
    转: C#实现的18位身份证格式验证算法
    通过SQLNET.ora文件限制Ip地址访问(转)
    AS/400(iSeries)
    使用Asp.Net构建安全网站
    DB2备份命名(转)
  • 原文地址:https://www.cnblogs.com/chhom/p/4789271.html
Copyright © 2011-2022 走看看