没有合适的资源?快使用搜索试试~ 我知道了~
Android音视频开发学习思路.pdf
![star](https://csdnimg.cn/release/downloadcmsfe/public/img/star.98a08eaa.png)
温馨提示
Android音视频开发学习思路
资源推荐
资源详情
资源评论
![zip](https://img-home.csdnimg.cn/images/20210720083736.png)
![pdf](https://img-home.csdnimg.cn/images/20210720083512.png)
![CHM](https://img-home.csdnimg.cn/images/20210720083646.png)
![pdf](https://img-home.csdnimg.cn/images/20210720083512.png)
![zip](https://img-home.csdnimg.cn/images/20210720083736.png)
![txt](https://img-home.csdnimg.cn/images/20210720083642.png)
![pdf](https://img-home.csdnimg.cn/images/20210720083512.png)
![pdf](https://img-home.csdnimg.cn/images/20210720083512.png)
![pdf](https://img-home.csdnimg.cn/images/20210720083512.png)
![pdf](https://img-home.csdnimg.cn/images/20210720083512.png)
![txt](https://img-home.csdnimg.cn/images/20210720083642.png)
![zip](https://img-home.csdnimg.cn/images/20210720083736.png)
![zip](https://img-home.csdnimg.cn/images/20210720083736.png)
![png](https://img-home.csdnimg.cn/images/20210720083516.png)
![zip](https://img-home.csdnimg.cn/images/20210720083736.png)
![](https://csdnimg.cn/release/download_crawler_static/13799941/bg1.jpg)
Android音视频开发学习思路
在 Android 音视频开发学习思路 里面,我们写到了,想要逐步入门音视频开发,就需要一步步的去学习
整理,并积累。本文是音视频开发积累的第一篇。 对应的要学习的内容是:在 Android 平台绘制一张图
片,使用至少 3 种不同的 API,ImageView,SurfaceView,自定义 View。
1. ImageView 绘制图片
这个想必做过Android开发的都知道如何去绘制了。很简单:
很轻松,在界面上看到了我们绘制的图片。
2. SurfaceView 绘制图片
这个比 ImageView 绘制图片稍微复杂一点点:
Bitmap bitmap =
BitmapFactory.decodeFile(Environment.getExternalStorageDirectory().getPath() +
File.separator + "11.jpg");
imageView.setImageBitmap(bitmap);
SurfaceView surfaceView = (SurfaceView) findViewById(R.id.surface);
surfaceView.getHolder().addCallback(new SurfaceHolder.Callback() {
@Override
public void surfaceCreated(SurfaceHolder surfaceHolder) {
if (surfaceHolder == null) {
return;
}
Paint paint = new Paint();
paint.setAntiAlias(true);
paint.setStyle(Paint.Style.STROKE);
Bitmap bitmap =
BitmapFactory.decodeFile(Environment.getExternalStorageDirectory().getPath() +
File.separator + "11.jpg"); // 获取bitmap
Canvas canvas = surfaceHolder.lockCanvas(); // 先锁定当前surfaceView的画布
canvas.drawBitmap(bitmap, 0, 0, paint); //执行绘制操作
surfaceHolder.unlockCanvasAndPost(canvas); // 解除锁定并显示在界面上
}
@Override
public void surfaceChanged(SurfaceHolder surfaceHolder, int i, int i1, int
i2) {
}
@Override
![](https://csdnimg.cn/release/download_crawler_static/13799941/bg2.jpg)
3. 自定义 View 绘制图片
这个有绘制自定义View经验的可以很轻松的完成,本人也简单整理过 Android 自定义 View 绘制 这一
块的知识:
注:别忘记了权限,*
否
则
是
不会
展
示
成
功
的
。
*
这三种方式都成功了展示出来了,我们可以继续学习并整理后面的知识了—— Android 音视频开发
(二):使用 AudioRecord 采集音频PCM并保存到文件
public void surfaceDestroyed(SurfaceHolder surfaceHolder) {
}
});
public class CustomView extends View {
Paint paint = new Paint();
Bitmap bitmap;
public CustomView(Context context) {
super(context);
paint.setAntiAlias(true);
paint.setStyle(Paint.Style.STROKE);
bitmap =
BitmapFactory.decodeFile(Environment.getExternalStorageDirectory().getPath() +
File.separator + "11.jpg"); // 获取bitmap
}
@Override
protected void onDraw(Canvas canvas) {
super.onDraw(canvas);
// 不建议在onDraw做任何分配内存的操作
if (bitmap != null) {
canvas.drawBitmap(bitmap, 0, 0, paint);
}
}
}
<uses-permission android:name="android.permission.READ_EXTERNAL_STORAGE"/>
![](https://csdnimg.cn/release/download_crawler_static/13799941/bg3.jpg)
一、*AudioRecord API详解**
AudioRecord是Android系统提供的用于实现录音的功能类。
要想了解这个类的具体的说明和用法,我们可以去看一下官方的文档:
AndioRecord类的主要功能是让各种JAVA应用能够管理音频资源,以便它们通过此类能够录制声音
相关的硬件所收集的声音。此功能的实现就是通过”pulling”(读取)AudioRecord对象的声音数据来完
成的。在录音过程中,应用所需要做的就是通过后面三个类方法中的一个去及时地获取AudioRecord对
象的录音数据. AudioRecord类提供的三个获取声音数据的方法分别是read(byte[], int, int),
read(short[], int, int), read(ByteBuffer, int). 无论选择使用那一个方法都必须事先设定方便用户的声音
数据的存储格式。 开始录音的时候,AudioRecord需要初始化一个相关联的声音buffer, 这个buffer
主要是用来保存新的声音数据。这个buffer的大小,我们可以在对象构造期间去指定。它表明一个
AudioRecord对象还没有被读取(同步)声音数据前能录多长的音(即一次可以录制的声音容量)。声音数
据从音频硬件中被读出,数据大小不超过整个录音数据的大小(可以分多次读出),即每次读取初始化
buffer容量的数据。
实现Android录音的流程为:
1. 构造一个AudioRecord对象,其中需要的最小录音缓存buffer大小可以通过getMinBufferSize方法得
到。如果buffer容量过小,将导致对象构造的失败。
2. 初始化一个buffer,该buffer大于等于AudioRecord对象用于写声音数据的buffer大小。
3. 开始录音
4. 创建一个数据流,一边从AudioRecord中读取声音数据到初始化的buffer,一边将buffer中数据导
入数据流。
5. 关闭数据流
6. 停止录音
二、使用 AudioRecord 实现录音,并生成
wav
2.1 创建一个AudioRecord对象
首先要声明一些全局的变量参数:
获取buffer的大小并创建AudioRecord:
private AudioRecord audioRecord = null; // 声明 AudioRecord 对象
private int recordBufSize = 0; // 声明recoordBufffer的大小字段
public void createAudioRecord() {
recordBufSize = AudioRecord.getMinBufferSize(frequency, channelConfiguration,
EncodingBitRate); //audioRecord能接受的最小的buffer大小
audioRecord = new AudioRecord(MediaRecorder.AudioSource.MIC, frequency,
channelConfiguration, EncodingBitRate, recordBufSize);
}
![](https://csdnimg.cn/release/download_crawler_static/13799941/bg4.jpg)
2.2 初始化一个buffer
2.3 开始录音
audioRecord.startRecording();
isRecording = true;
2.4 创建一个数据流,一边从AudioRecord中读取声音数据到初始化
的buffer,一边将buffer中数据导入数据流。
2.5 关闭数据流
修改标志位:isRecording 为false,上面的while循环就自动停止了,数据流也就停止流动了,Stream
也就被关闭了。
byte data[] = new byte[recordBufSize];
FileOutputStream os = null;
try {
os = new FileOutputStream(filename);
} catch (FileNotFoundException e) {
e.printStackTrace();
}
if (null != os) {
while (isRecording) {
read = audioRecord.read(data, 0, recordBufSize);
// 如果读取音频数据没有出现错误,就将数据写入到文件
if (AudioRecord.ERROR_INVALID_OPERATION != read) {
try {
os.write(data);
} catch (IOException e) {
e.printStackTrace();
}
}
}
try {
os.close();
} catch (IOException e) {
e.printStackTrace();
}
}
isRecording = false;
![](https://csdnimg.cn/release/download_crawler_static/13799941/bg5.jpg)
2.6 停止录音
停止录音之后,注意要释放资源。
注:权限需求:WRITE_EXTERNAL_STORAGE、RECORD_AUDIO
到现在基本的录音的流程就介绍完了。但是这时候,有人就提出问题来了:
1)、我按照流程,把音频数据都输出到文件里面了,停止录音后,打开此文件,发现不能播放,到底是
为什么呢?
答:按照流程走完了,数据是进去了,但是现在的文件里面的内容仅仅是最原始的音频数据,术语称为
raw(中文解释是“原材料”或“未经处理的东西”),这时候,你让播放器去打开,它既不知道保存的格
式是什么,又不知道如何进行解码操作。当然播放不了。
2)、那如何才能在播放器中播放我录制的内容呢?
答: 在文件的数据开头加入WAVE HEAD数据即可,也就是文件头。只有加上文件头部的数据,播放器
才能正确的知道里面的内容到底是什么,进而能够正常的解析并播放里面的内容。具体的头文件的描
述,在Play a WAV file on an AudioTrack里面可以进行了解。
添加WAVE文件头的代码如下:
if (null != audioRecord) {
audioRecord.stop();
audioRecord.release();
audioRecord = null;
recordingThread = null;
}
public class PcmToWavUtil {
/**
* 缓存的音频大小
*/
private int mBufferSize;
/**
* 采样率
*/
private int mSampleRate;
/**
* 声道数
*/
private int mChannel;
/**
* @param sampleRate sample rate、采样率
* @param channel channel、声道
* @param encoding Audio data format、音频格式
*/
PcmToWavUtil(int sampleRate, int channel, int encoding) {
this.mSampleRate = sampleRate;
this.mChannel = channel;
this.mBufferSize = AudioRecord.getMinBufferSize(mSampleRate, mChannel,
encoding);
剩余237页未读,继续阅读
资源评论
![avatar-default](https://csdnimg.cn/release/downloadcmsfe/public/img/lazyLogo2.1882d7f4.png)
- j6106221062022-02-10很好的入门级读物
![avatar](https://profile-avatar.csdnimg.cn/e61ef9f77724447ab1edbb01570ac62b_zhou452840622.jpg!1)
zJianFlys
- 粉丝: 66
- 资源: 39
上传资源 快速赚钱
我的内容管理 展开
我的资源 快来上传第一个资源
我的收益
登录查看自己的收益我的积分 登录查看自己的积分
我的C币 登录后查看C币余额
我的收藏
我的下载
下载帮助
![voice](https://csdnimg.cn/release/downloadcmsfe/public/img/voice.245cc511.png)
![center-task](https://csdnimg.cn/release/downloadcmsfe/public/img/center-task.c2eda91a.png)
最新资源
- 打包和分发Rust工具.pdf
- SQL中的CREATE LOGFILE GROUP 语句.pdf
- C语言-leetcode题解之第172题阶乘后的零.zip
- C语言-leetcode题解之第171题Excel列表序号.zip
- C语言-leetcode题解之第169题多数元素.zip
- ocr-图像识别资源ocr-图像识别资源
- 图像识别:基于Resnet50 + VGG16模型融合的人体细胞癌症分类模型实现-图像识别资源
- C语言-leetcode题解之第168题Excel列表名称.zip
- C语言-leetcode题解之第167题两数之和II-输入有序数组.zip
- C语言-leetcode题解之第166题分数到小数.zip
资源上传下载、课程学习等过程中有任何疑问或建议,欢迎提出宝贵意见哦~我们会及时处理!
点击此处反馈
![feedback](https://img-home.csdnimg.cn/images/20220527035711.png)
![feedback](https://img-home.csdnimg.cn/images/20220527035711.png)
![feedback-tip](https://img-home.csdnimg.cn/images/20220527035111.png)
安全验证
文档复制为VIP权益,开通VIP直接复制
![dialog-icon](https://csdnimg.cn/release/downloadcmsfe/public/img/green-success.6a4acb44.png)