• 1. 第八章 多媒体编程技术 基于OpenCore开发
  • 2. 本章目标多媒体格式简介 Android多媒体框架概述 多媒体应用接口 MediaPlayer播放器 MediaRecoder录音器 Camera照相机 音频控制AudioManager以及铃声控制RingtoneManager
  • 3. 多媒体类型格式扩展名主要用途说明WMV .wmv 电脑视频、 网络流媒体 WMV格式的主要优点包括:本地或网络回放、可扩充的媒体类型、可伸缩的媒体类型、多语言支持、环境独立性、丰富的流间关系以及扩展性等。 Real Media .rm .ra .ram 电脑视频、 网络流媒体 Real Media可以根据不同的网络传输速率制定出不同的压缩比率,从而实现在低速率的网络上进行影像数据实时传送和播放。 RMVB .rmvb .rm 压缩影碟 RMVB是一种由RM视频格式升级延伸出的新视频格式,它的先进之处在于在图像质量和文件大小之间就达到了微妙的平衡。小体积实现高画质。 Flash .swf .flv 电脑视频、 网络流媒体 FLV格式不仅可以轻松的导入Flash 中,同时也可以通过rtmp 协议从Flashcom 服务器上流式播出。目前网上大量的视频网站都使用这种格式的在线视频。 MOV .qt .mov 电脑视频、 网络流媒体 Apple公司开发的一种视频格式。具有较高的压缩比率和较完美的视频清晰度等特点,不仅能支持MacOS,同样也能支持Windows系列操作系统。 ASF .asf 电脑视频、 网络流媒体 ASF是微软为了和的 Real 竞争而发展出来的一种可以直接在网上观看视频节目的文件压缩格式。
  • 4. 多媒体详细框架
  • 5. android多媒体框架基于第三方PacketVideo 公司的OpenCORE platform来实现 CODEC(编解码器)使用OpenMAX 1L interface 接口进行扩展,可以方便得支持hardware / software codec plug-ins(硬件/软件编解码器插件)
  • 6. 框架调用关系图
  • 7. 支持的格式MPEG4、H.264、MP3、AAC、AMR、JPG、PNG、GIF、BMP Open Core多媒体框架有一套通用可扩展的接口针对第三方的多媒体编解码器,输入,输出设备等等 。 多媒体文件的播放,下载,包括3GPP, MPEG-4,AAC and MP3 containers 流媒体文件的下载,实时播放,包括:3GPP, HTTP and RTSP/RTP 动态视频和静态图像的编码,解码,例如:MPEG-4, H.263 and AVC (H.264), JPEG 语音编码格式: AMR-NB and AMR-WB 音乐编码格式: MP3, AAC, AAC+ 视频和图像格式: 3GPP, MPEG-4 and JPEG 视频会议:基于H324-M standard
  • 8. Android多媒体应用接口多媒体ContentProvider调用 MediaStore MediaStore.Audio/MediaStore.Video/… 媒体播放器MediaPlayer 用于播放视频、音频和流媒体 媒体记录器MediaRecoder/AudioRecoder 麦克风mic 照相机Camera 摄像头
  • 9. Android相关接口服务AudioManager 为上层应用提供声音设置管理接口 RingtoneManager 为上层应用提供铃声和闹铃的播放以及管理接口 SoundPool 为同时支持多种声音的播放提供接口 ToneGenerator 提供播放DTMF TONE的支持PCM数据 VibrateManager 为上层应用提供震动设置管理接口
  • 10. MediaPlayer生命周期
  • 11. MediaPlayer重要属性属性 Duration 以毫秒为单位,媒体的持久时间 videoHeight/videoWight setLoop 是否循环播放 setDisplay(SurfaceHolder) 播放器的视频显示接口 setDataSource(FileInputStream)或setDataSource(String mediaPath) setAudioStreamType(AudioManager.STREAM_MUSIC)
  • 12. MediaPlayer重要方法重要方法 构造方法MediaPlayer 静态方法create(Context,int resId)创建 prepare/prepareAsyn start/stop/pause getCurrentPosition 当前播放进度 seekTo 拖放到相应位置播放 Release 释放 MediaPlayer 对象
  • 13. 主要监听器监听器 onBufferingUpdateListener(MediaPlayer ,int ) onCompletionListener(MediaPlayer) onSeekCompleteListener(MediaPlayer) onPreparedListener onErrorListener
  • 14. 示例:播放多媒体//MediaPlayer mp=MediaPlayer.create(context,R.raw.sound_file); 1. MediaPlayer mp=new MediaPlayer(); 2. mp.setDataSource(PATH_TO_FILE); 3. mp.prepare(); 4. mp.start();
  • 15. 音量控制通过系统服务AudioManager AudioManager mAudioManager = (AudioManager) context.getSystemService(Context.AUDIO_SERVICE); mAudioManager.setStreamVolume(AudioManager.STREAM_MUSIC, maxVolume * mLastProgress / 10, 0);
  • 16. 播放视频控件VideoView: 继承了SurfaceView SurfaceView 双缓冲View
  • 17. Camera照像机调用系统照相程序 Intent intent=new Intent();   intent.setAction("android.media.action.STILL_IMAGE_CAMERA"); this.startActivity(intent);
  • 18. 自定义拍照程序(1)1、定义surfaceview(取景屏幕) mSurfaceView = (SurfaceView) this.findViewById(R.id.sv); mHolder = mSurfaceView.getHolder(); mHolder.addCallback(new CameraCallback(this)); mHolder.setFixedSize(176, 144);
  • 19. 自定义拍照程序(2)2、摄像头初始化try { cam = Camera.open(); Camera.Parameters params = cam.getParameters(); params.setPreviewFrameRate(3); params.setPreviewFormat(PixelFormat.JPEG); WindowManager wm = (WindowManager) mContext.getSystemService(Context.WINDOW_SERVICE); Display display = wm.getDefaultDisplay(); params.setPictureSize(display.getWidth(), display.getHeight()); params.setJpegQuality(85);//params.set("jpeg-quality", 85); cam.setPreviewDisplay(holder); cam.startPreview(); } catch (IOException e) { e.printStackTrace(); }
  • 20. 自定义拍照程序(3)3、拍照并存储switch(keyCode){ case KeyEvent.KEYCODE_CAMERA: cam.takePicture(null,null,new Camera.PictureCallback() { @Override public void onPictureTaken(byte[] data, Camera camera) { Bitmap bm = BitmapFactory.decodeByteArray(data, 0, data.length); try { FileOutputStream fos = new FileOutputStream("1.jpg"); bm.compress(Bitmap.CompressFormat.JPEG, 100, fos); fos.close(); cam.stopPreview(); cam.startPreview(); } catch (FileNotFoundException e) {e.printStackTrace();} catch (IOException e) {e.printStackTrace();} } }); break;
  • 21. MediaRecorder1、使用new创建一个实例android.media.MediaRecorder 2、创建一个 android.content.ContentValues 实例并设置一些标准的属性,像 TITLE,TIMESTAMP,最重要的是MIME_TYPE 3、创建一个要放置的文件的路径,这可以通过android.content.ContentResolver 在内容数据库中来创建一个入口,并且自动地标志一个取得这个文件的路径 4、使用 MediaRecorder.setAudioSource()方法来设置音频资源;这将会很可能使用到MediaRecorder.AudioSource.MIC 5、使用MediaRecorder.setOutputFormat()方法设置输出文件格式 6、用MediaRecorder.setAudioEncoder()方法来设置音频编码 7、最后,prepare()和start()所录制的音频,stop()和release()在要结束的时候调用
  • 22. MediaRecorder的生命周期
  • 23. 示例:录制声音1. recorder=new MediaRecorder(); 2. ContentValues values=new ContentValues(3); 3. values.put(MediaStore.MediaColumns.TITLE,SOME_NAME_HERE); 4. values.put(MediaStore.MediaColumns.TIMESTAMP,System.currentTimeMillis()); 5. values.put(MediaStore.MediaColumns.MIME_TYPE,recorder.getMimeContentType(); 6. ContentResolver contentResolver=new ContentResolver(); 7. Uri base=MediaStore.Audio.Media.INTERNAL_CONTENT_URI; Uri newUri=contentResolver.insert(base,values); if(newUri==null){ 10. //这里需要异常处理,我们在这里不能创建一个新的内容入口 11. } 12. String path=contentResolver.getDataFilePath(newUri); 13. //可以使用setPreviewDisplay()来陈列一个preview 来使View适合 14. recorder.setAudioSource(MediaRecorder.AudioSource.MIC); 15. recorder.setOutputFormat(MediaRecorder.OutputFormat.THREE_GPP); 16. recorder.setAudioEncoder(MediaRecorder.AudioEncoder.AMR_NB); 17. recorder.setOutputFile(path); 18. recorder.prepare(); 19. recorder.start();
  • 24. MediaStore相关知识MediaStore媒体库 /data/data/com.android.providers.media MediaScanner扫描器 ACTION_BOOT_COMPLETED ACTION_MEDIA_MOUNTED ACTION_MEDIA_SCANNER_SCAN_FILE