文档章节

Android实现录音、播音、录制视频功能

vga
 vga
发布于 2017/01/09 16:26
字数 1098
阅读 164
收藏 1

智能手机操作系统IOS与Android平分天下(PS:WP与其他的直接无视了),而Android的免费招来了一大堆厂商分分向Android示好,故Android可能会有“较好”的前景。

Android实现简单的录音、播音与视频录制功能。当然了、无论是出场绑定的还是第三方都有很多很好的应用。但是对于一名开发人员来说及时做的UI再丑、功能再烂那也是一种成就!

实现录音、录制视频功能需要调用【MediaRecorder】类,播放音频则需要【MediaPlayer】类。那简单以实现录音、录制视频、播放音频为例写一个自己的SoundRecordingHelper类。

思路:Android已经封装好了这两个类只需要进行简单的设置就可以实现这三个功能了
1、需要在工程文件中添加需要的权限
2、设置布局文件
3、调用自己封装的SoundRecordingHelper类。下面主要讲SoundRecordingHelper类,实现功能直接调用此类中的Start与Stop方法即可。

package com.clown.tools;

import android.content.Context;
import android.media.MediaPlayer;
import android.media.MediaRecorder;
import android.os.Environment;
import android.view.SurfaceHolder;
import android.view.SurfaceView;

/*
 * Android录音辅助类 
 * 需要添加的权限:
 * <uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE" />  
 * <uses-permission android:name="android.permission.MOUNT_UNMOUNT_FILESYSTEMS"/>  
 * <uses-permission android:name="android.permission.RECORD_AUDIO" /> 
 * 视频录制添加的权限:
 * <uses-permission android:name="android.permission.CAMERA" />  
 * <uses-permission android:name="android.permission.RECORD_AUDIO" />  
 * <uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE" /> 
 * 文件格式:Environment.getExternalStorageDirectory().getAbsolutePath() + "/TonFun.amr"
 */
public class SoundRecordingHelper implements SurfaceHolder.Callback {

// 文件路径 private String strFilePath = ""; // 数据上下文 private Context context = null; // 媒体播放对象 private MediaPlayer mPlayer = null; // 媒体录音对象 private MediaRecorder mRecorder = null; // 用来显示视频的一个接口,我靠不用还不行,也就是说用mediarecorder录制视频还得给个界面看 // 想偷偷录视频的同学可以考虑别的办法。。嗯需要实现这个接口的Callback接口 private SurfaceHolder surfaceHolder;

public String getStrFilePath() { return strFilePath; }

public void setStrFilePath(String strFilePath) { this.strFilePath = strFilePath; }

/*

  • 音频录制的构造函数 */ public SoundRecordingHelper(Context context, String strFilePath) { this.context = context; this.strFilePath = strFilePath; }

/*

  • 视频录制的构造函数 */ @SuppressWarnings("deprecation") public SoundRecordingHelper(Context context, SurfaceView surfaceview, String strFilePath) { this.context = context; this.surfaceHolder = surfaceview.getHolder(); this.surfaceHolder.addCallback(this); // 加入回调接口 this.surfaceHolder.setType(SurfaceHolder.SURFACE_TYPE_PUSH_BUFFERS); // 这个方法已经过时了,但是为了兼容低版本必须设置 this.strFilePath = strFilePath; }

/*

  • 开始录音 */ public boolean startSoundRecording() { boolean bResult = false; mRecorder = new MediaRecorder(); mRecorder.setAudioSource(MediaRecorder.AudioSource.MIC); // 设置音频来源(MIC表示麦克风) mRecorder.setOutputFormat(MediaRecorder.OutputFormat.DEFAULT); // 设置音频输出格式 mRecorder.setOutputFile(strFilePath); mRecorder.setAudioEncoder(MediaRecorder.AudioEncoder.DEFAULT); // 设置音频编码 try { mRecorder.prepare(); mRecorder.start(); bResult = true; } catch (Exception ex) { System.out.println("Error:录音失败、" + ex.getMessage()); bResult = false; } return bResult; }

/*

  • 停止录音 */ public boolean stopSoundRecording() { boolean bResult = false; if (mRecorder != null) { mRecorder.stop(); mRecorder.release(); mRecorder = null; bResult = true; } else { bResult = false; } return bResult; }

/*

  • 开始播放音频 */ public boolean startPlay() { boolean bResult = false; mPlayer = new MediaPlayer(); try { mPlayer.setDataSource(strFilePath); mPlayer.prepare(); mPlayer.start(); bResult = true; } catch (Exception ex) { System.out.println("Error:播放失败、" + ex.getMessage()); bResult = false; } return bResult; }

/*

  • 停止播放音频 */ public boolean stopPlay() { boolean bResult = false; if (mPlayer != null) { mPlayer.stop(); mPlayer.release(); mPlayer = null; bResult = true; } else { bResult = false; } return bResult; }

/*

  • 调用摄像头进行视频录制 nWidth:视频的宽
  • nHeight:视频的高nRate:视频帧数nType:视频格式(MediaRecorder.OutputFormat.THREE_GPP) */ public boolean startVideoRecording(int nWidth, int nHeight, int nRate, int nType) { boolean bResult = false; mRecorder = new MediaRecorder(); mRecorder.setVideoSource(MediaRecorder.VideoSource.CAMERA); // 设置视频源为摄像头 mRecorder.setOutputFormat(nType);// 设置录制完成后视频的封装格式THREE_GPP为3gp.MPEG_4为mp4 mRecorder.setVideoEncoder(MediaRecorder.VideoEncoder.H263); // 设置录制的视频编码h263 // h264 mRecorder.setVideoSize(nWidth, nHeight);// 设置视频录制的分辨率。必须放在设置编码和格式的后面,否则报错 mRecorder.setVideoFrameRate(nRate);// 设置录制的视频帧率。必须放在设置编码和格式的后面,否则报错 mRecorder.setPreviewDisplay(surfaceHolder.getSurface()); // 设置显示预览 mRecorder.setOutputFile(strFilePath); // 设置输出路径 try { mRecorder.prepare(); mRecorder.start(); bResult = true; } catch (Exception ex) { System.out.print("Error:视频录制错误、" + ex.getMessage()); bResult = false; } return bResult; }

/*

  • 停止视频录制 */ public boolean stopVideoRecording() { boolean bResult = false; if (mRecorder != null) { mRecorder.stop(); mRecorder.release(); mRecorder = null; bResult = true; } else { bResult = false; } return bResult; }

/*

  • SurfaceHolder.Callback接口实现方法 */ @Override public void surfaceChanged(SurfaceHolder holder, int format, int width, int height) { // TODO Auto-generated method stub System.out.println(holder.toString()); }

@Override public void surfaceCreated(SurfaceHolder holder) { // TODO Auto-generated method stub System.out.println(holder.toString()); }

@Override public void surfaceDestroyed(SurfaceHolder holder) { // TODO Auto-generated method stub if (context != null) { context = null; } if (mPlayer != null) { mPlayer = null; } if (mRecorder != null) { mRecorder = null; } } }

注:实现视频录制时需要在UI布局中添加 Surfaceview控件,用以实时预览视频。如分辨率过低是会导致视频花屏!

本文转载自:http://www.51hei.com/bbs/dpj-36708-1.html

vga

vga

粉丝 23
博文 371
码字总数 26854
作品 0
佳木斯
私信 提问
加载中

评论(3)

vga
vga 博主
根据 音频频谱 绘制能量柱 Visualizer - MediaPlayer 控制(详细注释) http://www.apkbus.com/android-182057-1-1.html
vga
vga 博主
Android 音乐频谱实现
http://blog.sina.com.cn/s/blog_5da93c8f0102v4z7.html

Android应用源码音乐实时跳动频谱显示 http://www.javaapk.com/media/music/519.html#comments
vga
vga 博主
Android实现音频录制的两种方式 http://www.2cto.com/kf/201503/382894.html
最鲁棒的Android声音录制和播放封装库了 http://www.open-open.com/lib/view/open1456372083980.html
android进阶4step2:Android音视频处理——音视频录制与播放

录音 MediaRecoder Android有一个内置的麦克风,通过它可以捕获音频和存储,或在手机进行播放。 有很多方法可以做到这一点,但最常见的方法是通 过MediaRecorder类。 MediaRecoder常用方法 ...

发条鱼
2018/12/17
0
0
Android5.0以上版本录屏实现,录屏与反控

-- Android5.0以上版本录屏实现,录屏与反控(反向控制) Android系统的版本是否大于5.0,并且动态申请一下权限(读写,录音,照相机),录屏的方式是分别录制音频和视频,最后合并成mp4格式...

desaco
03/22
0
0
Android中的录音效果

其实我们要是想实现录音效果的话,大脑里第一个想的就是先把布局写好,完事以后我们在设置录音按钮点击事件。完事创建录音对象,我们还应该想到的就是设置输出格式、设置编码格式、设置输出文...

长平狐
2012/08/14
587
1
Android中的录音效果

其实我们要是想实现录音效果的话,大脑里第一个想的就是先把布局写好,完事以后我们在设置录音按钮点击事件。完事创建录音对象,我们还应该想到的就是设置输出格式、设置编码格式、设置输出文...

长平狐
2012/08/21
249
1
Android Camera模块解析之视频录制

《Android Camera架构》 《Android Camera进程间通信类总结》 《Android Camera模块解析之拍照》 《Android Camera模块解析之视频录制》 《Android Camera原理之CameraDeviceCallbacks回调模...

天王盖地虎626
06/18
55
0

没有更多内容

加载失败,请刷新页面

加载更多

家庭作业——苗钰婷

2 编写一个程序,发出一声警报,然后打印下面的文本: Startled by the sudden sound, Sally shouted, "By the Great Pumpkin, what was that! #include<stdio.h>int main(){......

OSC_Okruuv
31分钟前
5
0
经典系统设计面试题解析:如何设计TinyURL(一)

原文链接: https://www.educative.io/courses/grokking-the-system-design-interview/m2ygV4E81AR 编者注:本文以一道经典的系统设计面试题:《如何设计TinyURL》的参考答案和解析为例,帮助...

APEMESH
32分钟前
3
0
2.面向对象设计原则(7条)

开闭原则 开闭原则的含义是:当应用的需求改变时,在不修改软件实体的源代码或者二进制代码的前提下,可以扩展模块的功能,使其满足新的需求。 实现方法 可以通过“抽象约束、封装变化”来实...

Eappo_Geng
34分钟前
7
0
8086汇编基础 debug P命令 一步完成loop循环

    IDE : Masm for Windows 集成实验环境 2015     OS : Windows 10 x64 typesetting : Markdown    blog : my.oschina.net/zhichengjiu    gitee : gitee.com/zhichengjiu   ......

志成就
38分钟前
7
0
使用nodeJS实现前端项目自动化之项目构建和文件合并

本文转载于:专业的前端网站➜使用nodeJS实现前端项目自动化之项目构建和文件合并 前面的话   一般地,我们使用构建工具来完成项目的自动化操作。本文主要介绍如何使用nodeJS来实现简单的项...

前端老手
52分钟前
8
0

没有更多内容

加载失败,请刷新页面

加载更多

返回顶部
顶部