Android 使用librtmp推流【音频采集模块】
来源:互联网 发布:淘宝收货地址怎么定位 编辑:程序博客网 时间:2024/06/11 21:42
1.音频采集模块的接口initAudioDevice在RtmpPublisher初始化init()时被调用。
initAudioDevice中会创建AudioRecord对象
mAudioRecord = new AudioRecord(MediaRecorder.AudioSource.MIC, sampleRate, channelConfig,audioFormat, buffsize);
2.音频采集模块的接口start在RtmpPublisher中调用startGather()时被调用。
start函数中开启一个音频采集线程
音频采集线程每次都调用mAudioRecord.read(buffer,0, buffer.length)读取音频数据。
读取到音频数据后调用mCallback.audioData(audio)将采集到的音频数据转发给音频编码模块。
具体的音频采集代码如下:
public class AudioGatherer { private static final String TAG = "AudioGatherer"; private Config mConfig; private AudioRecord mAudioRecord; private byte[] buffer; private Thread workThread; private boolean loop; private Callback mCallback; public static AudioGatherer newInstance(Config config) { return new AudioGatherer(config); } private AudioGatherer(Config config){ this.mConfig =config; } public static class Params { public final int sampleRate; public final int channelCount; public Params(int sampleRate, int channelCount) { this.sampleRate = sampleRate; this.channelCount = channelCount; } } /** * 初始化录音 */ public Params initAudioDevice() { int[] sampleRates = {44100, 22050, 16000, 11025}; for (int sampleRate : sampleRates) { //编码制式 int audioFormat = mConfig.audioFormat; // stereo 立体声, int channelConfig = mConfig.channelConfig; int buffsize = 2 * AudioRecord.getMinBufferSize(sampleRate, channelConfig, audioFormat); mAudioRecord = new AudioRecord(MediaRecorder.AudioSource.MIC, sampleRate, channelConfig, audioFormat, buffsize); if (mAudioRecord.getState() != AudioRecord.STATE_INITIALIZED) { continue; } this.buffer = new byte[Math.min(4096, buffsize)]; return new Params(sampleRate, channelConfig == AudioFormat.CHANNEL_CONFIGURATION_STEREO ? 2 : 1); } return null; } /** * 开始录音 */ public void start() { workThread = new Thread() { @Override public void run() { mAudioRecord.startRecording(); while (loop && !Thread.interrupted()) { int size = mAudioRecord.read(buffer, 0, buffer.length); if (size < 0) { Log.i(TAG, "audio ignore ,no data to read"); break; } if (loop) { byte[] audio = new byte[size]; System.arraycopy(buffer, 0, audio, 0, size); if (mCallback != null) { mCallback.audioData(audio); } } } } }; loop = true; workThread.start(); } public void stop() { loop = false; workThread.interrupt(); Log.i(TAG, "run: 调用stop"); mAudioRecord.stop(); } public void release() { mAudioRecord.release(); } public void setCallback(Callback callback) { this.mCallback = callback; } public interface Callback { void audioData(byte[] data); }}
阅读全文
0 0
- Android 使用librtmp推流【音频采集模块】
- Android 使用librtmp推流【视频采集模块】
- Android 使用librtmp推流【推流接口调用模块】
- Android 使用librtmp推流【音视频编码模块】
- Android 使用librtmp推流
- Android 使用librtmp推流【视频YUV格式转化】
- Android 使用librtmp推流【音视频传输】
- android 音频采集、FLTP重采样与AAC编码推流
- 树莓派使用python-librtmp实现rtmp推流h264
- Android 音频采集---原始音频
- Android音频采集
- Android的音频采集
- android 音频采集1
- Android 音频采集
- h.264 aac librtmp推流应用
- android librtmp 推送h264流 aac流 基本过程总结四 推流x264
- android librtmp 推送h264流 aac流 基本过程总结五 推流aac
- 1小时学会:最简单的iOS直播推流(十)librtmp使用介绍
- PAT1031
- 1到10所有数的平方
- 设计模式实践系列 (2)
- 高并发一致性解决方案
- 高精度gettimeofday()函数用法
- Android 使用librtmp推流【音频采集模块】
- POJ2063---Investment(完全背包)
- HDU3015(树状数组+离散)详解版
- QT 使用qtcreator编写第一个登录程序
- .net linq
- Java文件压缩代码
- Linux下文件描述符配置
- Nodejs一些初识问题总结
- ZCMU1416