【Android基础】五、多媒体编程

原创 2016年06月02日 10:12:43

一、图片:
存放在内存中的图像数据会通过Bitmap对象来表示,实现了Parcelable接口,说明图像数据可以进行序列化和反序列化,便捷地在进程间传递。
不同格式的图像数据在内存中有着不同的存储方式,占用的内存大小不同。
在图片使用完毕后,手动释放图片占用的内存空间,保证内存可以更快的进行回收:

        if(!bitmap.isRecycled()){
            //对图片进行处理
            ...
            //手动释放内存
            bitmap.recycle();
            bitmap = null;
        }

1.图像的读取和输出
图像的读取用BitmapFactory类来处理,使用BitmapFactory可以从不同的数据源中读取图像数据:
比如从图像文件中读取(参数为文件的绝对路径):BitmapFactory.decodeFile(“sdcard/example.png”);
从资源文件中读取:BitmapFactory.decodeResource(R.drawable.example);
从流中读取:BitmapFactory.decodeStream(inputStream);

读取到内存的图片文件过大时,可能会导致内存溢出,所以读取大图片需要控制读入的图像大小,使用BitmapFactory.Options对象可以设置图像读取的参数,in开头的参数表示控制图像读取的输入参数,以out开头的参数用来预取该图片文件中图像的基本信息,比如长度、宽度、图片类型等。

        BitmapFactory.Options options = new BitmapFactory.Options();
        options.inJustDecodeBounds = true;
        Bitmap bitmap = BitmapFactory.decodeFile("sdcard/example.jpg",options);
        int imageWidth = options.outWidth;
        int imageHeight = options.outHeight;

        Display display = getWindowManager().getDefaultDisplay();
        int screenWidth = display.getWidth();
        int screenHeight = display.getHeight();

        int scale = 1;
        int scaleWidth = imageWidth / screenWidth;
        int scaleHeight = imageHeight / screenHeight;
        if(scaleWidth > scaleHeight && scaleWidth > 1){
            scale = scaleWidth;
        }else if(scaleHeight > scaleWidth && scaleHeight > 1){
            scale = scaleHeight;
        }
        options.inJustDecodeBounds = false;
        options.inSampleSize = scale;
        Bitmap bm = BitmapFactory.decodeFile("sdcard/example.jpg",options);

通过Bitmap.compress方法将内存中的图像压缩成png,gif,jpg等格式输出出来。既可以输出到本地文件中,也可以直接输出到网络流中

bitmap.compress(Bitmap.CompressFormat.JPEG,100,outputStream);

2.图像的呈现
ImageView适用于简单的小图像呈现(比如图标、用户头像),在其他很多场景下,开发者需要自行控制图像的读取或交互。比如大图片不能使用ImageView.setImageURI函数设置文件路径,而需要对图片进行读取和压缩,再调用ImageVIew.setImageBitmap函数呈现图片文件。
对图片进行一些自定义的操作,需要拷贝图片副本,然后运用Paint的相关函数对图片进行操作:

        //这个图片是只读的
        Bitmap bm = BitmapFactory.decodeFile("sdcard/example.png");
        //创建一个与原图大小相同的空白Bitmap对象
        Bitmap bitmap = Bitmap.createBitmap(bm.getWidth(),bm.getHeight(),bm.getConfig());
        //创建画笔对象
        Paint paint = new Paint();
        //利用空白的Bitmap对象创建画板
        Canvas canvas = new Canvas(bitmap);
        //将原图的内容绘制在空白的Bitmap对象上
        canvas.drawBitmap(bm,new Matrix(),paint);

3.图片的管理
图片的三级缓存
二、音视频
音视频操作中最核心的编码解码、进度控制等功能实现,由开源项目OpenCORE提供,android.media包通过JNI方式封装了OpenCORE的实现
MediaPlayer
数据源可以是存放在资源文件中的音视频信息,也可以是存储在扩展存储器中的音视频文件,也可以是来自网络的音视频流(必须是流格式不能是数据块格式,否则必须先下载到本地扩展存储设备中再进行播放)
基本格式和常用API:


        final MediaPlayer mediaPlayer = new MediaPlayer();
        try {
            mediaPlayer.setDataSource("sdcard/example.mp3");
//            mediaPlayer.prepare();
            mediaPlayer.prepareAsync();
            mediaPlayer.setOnPreparedListener(new MediaPlayer.OnPreparedListener() {
                @Override
                public void onPrepared(MediaPlayer mp) {
                    mediaPlayer.start();
                }
            });

        } catch (Exception e) {
            e.printStackTrace();
        }
        mediaPlayer.reset();
        mediaPlayer.pause();
        mediaPlayer.stop();
        mediaPlayer.release();

MediaRecoder

MediaRecorder recorder = new MediaRecorder();
        //初始化需要录制的文件来源、格式、路径
        recorder.setAudioSource(MediaRecorder.AudioSource.MIC);
        recorder.setOutputFormat(MediaRecorder.OutputFormat.THREE_GPP);
        recorder.setAudioEncoder(MediaRecorder.AudioEncoder.AMR_NB);
        recorder.setOutputFile("sdcard/record.3gp");
        //开始录制
        try {
            recorder.prepare();
            recorder.start();
        } catch (IOException e) {
            e.printStackTrace();
        }

三、相机
1.使用第三方摄像应用来完成拍照或视频录制

        Intent intent = new Intent(MediaStore.ACTION_IMAGE_CAPTURE);
        //由于拍摄的图片较大,因此可以为拍照应用指定一个文件地址,存放照片
        intent.putExtra(MediaStore.EXTRA_OUTPUT, fileUri);
        //发出请求,并等待回调
        startActivityForResult(intent, REQUEST_CODE);

拍摄完成后,回调该函数

    protected void onActivityResult(int requestCode, int resultCode, Intent data) {
        if (requestCode == REQUEST_CODE && resultCode == RESULT_OK) {
            image_uri = data.getData();
        }
    }

摄像

        Intent intent = new Intent();  
        intent.setAction(MediaStore.ACTION_VIDEO_CAPTURE);  
        intent.putExtra(MediaStore.EXTRA_OUTPUT, Uri.fromFile(new File(getFilesDir(), "video.3gp")));  
        intent.putExtra(MediaStore.EXTRA_VIDEO_QUALITY,1);  
        startActivityForResult(intent,20); 
版权声明:本文为博主原创文章,未经博主允许不得转载。

Android基础第十一篇-多媒体编程

1. 计算机图片的大小首先我们打开电脑中的画图板,截取像素800*400的区域,在图中作画: 点击左上角另存为,有如下几种常见的图片格式: 我们以bmp格式保存图片,保存图片的类型如下: 分别以...
  • gj782128729
  • gj782128729
  • 2016年09月17日 10:12
  • 480

Android 面试题总结之Android 基础(六)

Android 面试题总结之Android 基础(六) 在上一章节Android 面试题总结之Android 基础ListView(五) 主要是ListView的优化,原理以及一些基本问题。 ...
  • vfush
  • vfush
  • 2016年05月30日 15:29
  • 7818

Android多媒体编程

多媒体概念 文字、图片、音频、视频 计算机图片大小的计算 图片大小 = 图片的总像素 * 每个像素占用的大小单色图:每个像素占用1/8个字节 16色图:每个像素占用1/2个字节 256色图:每个像...
  • axi295309066
  • axi295309066
  • 2015年12月16日 17:16
  • 815

Android 面试题总结之Android 基础(五)

Android 面试题总结之Android 基础(ListView)(五) 前几篇面试总结中,主要讲了Android 的四大组件的相关知识点,希望在大家日常工作中有所帮助,那么在本节中主要是And...
  • vfush
  • vfush
  • 2016年05月24日 13:28
  • 4283

Android多媒体编程基础

#多媒体概念 * 文字、图片、音频、视频 #计算机图片大小的计算 > 图片大小 = 图片的总像素 * 每个像素占用的大小 * 单色图:每个像素占用1/8个字节 * 16色图:每个像素占用...
  • z_fishLong
  • z_fishLong
  • 2016年03月28日 19:52
  • 209

一个简单地vb开发多媒体播放器软件的方法 适用初学者

  • zgqtxwd
  • zgqtxwd
  • 2008年05月01日 05:31
  • 320

android基础之六——多媒体编程

01_计算机表示图形的形式 png:以高质量的形式保存图片,并将其应用于计算机或网络;203 KB ,255*340像素,位深度32; png是计算机图形的工业压缩算法,使用类map的一种...
  • duruishan
  • duruishan
  • 2016年02月21日 22:20
  • 190

JAVA基础编程50题(4-6题)详解

一、描述 1、将一个正整数分解质因数。例如:输入90,打印出90=2*3*3*5。 程序分析:对n进行分解质因数,应先找到一个最小的质数k,然后按下述步骤完成: (1)如果这个质数恰等于n,则说...
  • tongyuehong
  • tongyuehong
  • 2015年03月19日 18:12
  • 617

Android基础笔记(十七)- 多媒体编程

MediaPlayer播放音频的基本使用 音乐播放器的完善 视频播放SurfaceView 视频播放VideoView vitamio框架 如何调用照相机和录像机...
  • biezhihua
  • biezhihua
  • 2015年03月19日 22:09
  • 1164

【Android基础】多媒体编程部分总结

一、MediaPlayer的使用 1)如何获得MediaPlayer实例: 可以使用直接new的方式: MediaPlayer mp = new MediaPlayer(); 也可以使用cre...
  • scboyhj__
  • scboyhj__
  • 2015年03月15日 09:22
  • 878
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:【Android基础】五、多媒体编程
举报原因:
原因补充:

(最多只允许输入30个字)