【Android RTMP】音频数据采集编码 ( FAAC 头文件与静态库拷贝到 AS | CMakeList.txt 配置 FAAC | AudioRecord 音频采样 PCM 格式 )(二)

简介: 【Android RTMP】音频数据采集编码 ( FAAC 头文件与静态库拷贝到 AS | CMakeList.txt 配置 FAAC | AudioRecord 音频采样 PCM 格式 )(二)

三、 Java 层 AudioRecord 音频采样 PCM 格式


1 . 初始化 AudioRecord :



① 计算最小缓冲区大小 : 获取 44100 立体声 / 单声道 16 位采样率的最小缓冲区大小 , 使用最小缓冲区大小, 不能保证声音流畅平滑, 这里将缓冲区大小翻倍, 保证采集数据的流畅 , 否则会有电流产生

int minBufferSize = AudioRecord.getMinBufferSize(44100,
        AudioFormat.CHANNEL_IN_STEREO, AudioFormat.ENCODING_PCM_16BIT) * 2;



② 创建 AudioRecord 对象 : AudioRecord 构造函数需要传入 音频来源 , 采样率 , 声道配置 , 采样位数 , 采样缓冲区大小 信息 ;


AudioRecord mAudioRecord = new AudioRecord(
        MediaRecorder.AudioSource.MIC,  // 声音来源 麦克风
        44100,            // PCM 音频采样率 44100 Hz
        AudioFormat.CHANNEL_IN_STEREO,  // 立体声
        AudioFormat.ENCODING_PCM_16BIT, // 采样位数 16 位
        minBufferSize);                 // 最小采样缓冲区个数



③ AudioRecord 构造函数原型 :


public AudioRecord(int audioSource, int sampleRateInHz, int channelConfig, int audioFormat,
            int bufferSizeInBytes)



① int audioSource 参数 : 声音来源, 麦克风 ;


② int sampleRateInHz 参数 : 音频采样率, 一般是 44100 Hz, 该采样率在所有设备支持比较好 ;


③ int channelConfig 参数 : 单声道 AudioFormat.CHANNEL_IN_MONO / 立体声 AudioFormat.CHANNEL_IN_STEREO ;


④ int audioFormat 参数 : 采样位数, 8 位 AudioFormat.ENCODING_PCM_8BIT / 16 , AudioFormat.ENCODING_PCM_16BIT ;


⑤ int bufferSizeInBytes 参数 : 每次采集数据的最大缓冲区大小 ;




2 . PCM 音频采样线程 :



① 独立线程封装 : 音频采样需要持续进行操作 , 并且该操作非常耗时 , 肯定要封装在一个独立线程中完成 ;


② 开始采样 : 调用 AudioRecord 对象的 startRecording 方法 , 开始进行音频采样 ;


mAudioRecord.startRecording();



③ 读取数据 : 循环读取麦克风采样数据 , 调用 AudioRecord 对象的 read 方法 , 可以获取麦克风采样的数据 ;


④ 停止采样 : 调用 AudioRecord 对象的 stop 方法 , 可以停止采样 ;


mAudioRecord.stop();


⑤ 代码示例 :


/**
 * 音频采样线程
 */
class AudioSampling implements Runnable{
    @Override
    public void run() {
        // 开始录音采样
        mAudioRecord.startRecording();
        while (isStartPush){
            // 循环读取录音, 需要传入一系列参数
            //mAudioRecord.read( ... );
        }
        // 停止录音采样
        mAudioRecord.stop();
    }
}






四、 Java 层 AudioRecord 音频采样 PCM 格式代码示例


package kim.hsl.rtmp;
import android.media.AudioFormat;
import android.media.AudioRecord;
import android.media.MediaRecorder;
import java.util.concurrent.ExecutorService;
import java.util.concurrent.Executors;
/**
 * 音频处理类
 * 音频采样, 编码, 推流控制
 */
public class AudioChannel {
    /**
     * 直播推流器
     */
    private LivePusher mLivePusher;
    /**
     * 音频录制对象
     */
    private AudioRecord mAudioRecord;
    /**
     * 是否已经开始推流
     */
    private boolean isStartPush;
    /**
     * 单线程线程池, 在该线程中进行音频采样
     */
    private ExecutorService mExecutorService;
    public AudioChannel(LivePusher mLivePusher) {
        this.mLivePusher = mLivePusher;
        // 初始化线程池, 单线程线程池
        mExecutorService = Executors.newSingleThreadExecutor();
        /*
            获取 44100 立体声 / 单声道 16 位采样率的最小缓冲区大小
            使用最小缓冲区大小, 不能保证声音流畅平滑, 这里将缓冲区大小翻倍, 保证采集数据的流畅
            否则会有电流产生
         */
        int minBufferSize = AudioRecord.getMinBufferSize(44100,
                AudioFormat.CHANNEL_IN_STEREO, AudioFormat.ENCODING_PCM_16BIT) * 2;
        /*
            public AudioRecord(int audioSource, int sampleRateInHz,
                               int channelConfig, int audioFormat,
                               int bufferSizeInBytes)
            int audioSource 参数 : 声音来源, 麦克风
            int sampleRateInHz 参数 : 音频采样率, 一般是 44100 Hz, 该采样率在所有设备支持比较好
            int channelConfig 参数 : 单声道 AudioFormat.CHANNEL_IN_MONO / 立体声 AudioFormat.CHANNEL_IN_STEREO,
            int audioFormat 参数 : 采样位数, 8 位 AudioFormat.ENCODING_PCM_8BIT / 16 位 AudioFormat.ENCODING_PCM_16BIT
            int bufferSizeInBytes 参数 : 每次采集数据的最大缓冲区大小
         */
        mAudioRecord = new AudioRecord(
                MediaRecorder.AudioSource.MIC,  // 声音来源 麦克风
                44100,            // PCM 音频采样率 44100 Hz
                AudioFormat.CHANNEL_IN_STEREO,  // 立体声
                AudioFormat.ENCODING_PCM_16BIT, // 采样位数 16 位
                minBufferSize);                 // 最小采样缓冲区个数
    }
    /**
     * 开始推流
     */
    public void startLive() {
        isStartPush = true;
        // 执行音频采样线程
        // 如果在启动一个线程, 后续线程就会排队等待
        mExecutorService.submit(new AudioSampling());
    }
    /**
     * 停止推流
     */
    public void stopLive() {
        isStartPush = false;
    }
    public void release(){
        //释放音频录音对象
        mAudioRecord.release();
    }
    /**
     * 音频采样线程
     */
    class AudioSampling implements Runnable{
        @Override
        public void run() {
            // 开始录音采样
            mAudioRecord.startRecording();
            while (isStartPush){
                // 循环读取录音
                mAudioRecord.read();
            }
            // 停止录音采样
            mAudioRecord.stop();
        }
    }
}




目录
相关文章
|
开发框架 前端开发 Android开发
Flutter 与原生模块(Android 和 iOS)之间的通信机制,包括方法调用、事件传递等,分析了通信的必要性、主要方式、数据传递、性能优化及错误处理,并通过实际案例展示了其应用效果,展望了未来的发展趋势
本文深入探讨了 Flutter 与原生模块(Android 和 iOS)之间的通信机制,包括方法调用、事件传递等,分析了通信的必要性、主要方式、数据传递、性能优化及错误处理,并通过实际案例展示了其应用效果,展望了未来的发展趋势。这对于实现高效的跨平台移动应用开发具有重要指导意义。
1697 4
|
11月前
|
数据采集 监控 API
告别手动埋点!Android 无侵入式数据采集方案深度解析
传统的Android应用监控方案需要开发者在代码中手动添加埋点,不仅侵入性强、工作量大,还难以维护。本文深入探讨了基于字节码插桩技术的无侵入式数据采集方案,通过Gradle插件 + AGP API + ASM的技术组合,实现对应用性能、用户行为、网络请求等全方位监控,真正做到零侵入、易集成、高稳定。
1062 94
|
安全 数据库 Android开发
在Android开发中实现两个Intent跳转及数据交换的方法
总结上述内容,在Android开发中,Intent不仅是活动跳转的桥梁,也是两个活动之间进行数据交换的媒介。运用Intent传递数据时需注意数据类型、传输大小限制以及安全性问题的处理,以确保应用的健壯性和安全性。
752 11
|
存储 XML Java
Android 文件数据储存之内部储存 + 外部储存
简介:本文详细介绍了Android内部存储与外部存储的使用方法及核心原理。内部存储位于手机内存中,默认私有,适合存储SharedPreferences、SQLite数据库等重要数据,应用卸载后数据会被清除。外部存储包括公共文件和私有文件,支持SD卡或内部不可移除存储,需申请权限访问。文章通过代码示例展示了如何保存、读取、追加、删除文件以及将图片保存到系统相册的操作,帮助开发者理解存储机制并实现相关功能。
3156 2
|
前端开发 Java Shell
【08】flutter完成屏幕适配-重建Android,增加GetX路由,屏幕适配,基础导航栏-多版本SDK以及gradle造成的关于fvm的使用(flutter version manage)-卓伊凡换人优雅草Alex-开发完整的社交APP-前端客户端开发+数据联调|以优雅草商业项目为例做开发-flutter开发-全流程-商业应用级实战开发-优雅草Alex
【08】flutter完成屏幕适配-重建Android,增加GetX路由,屏幕适配,基础导航栏-多版本SDK以及gradle造成的关于fvm的使用(flutter version manage)-卓伊凡换人优雅草Alex-开发完整的社交APP-前端客户端开发+数据联调|以优雅草商业项目为例做开发-flutter开发-全流程-商业应用级实战开发-优雅草Alex
1119 20
【08】flutter完成屏幕适配-重建Android,增加GetX路由,屏幕适配,基础导航栏-多版本SDK以及gradle造成的关于fvm的使用(flutter version manage)-卓伊凡换人优雅草Alex-开发完整的社交APP-前端客户端开发+数据联调|以优雅草商业项目为例做开发-flutter开发-全流程-商业应用级实战开发-优雅草Alex
|
开发框架 Android开发 iOS开发
安卓与iOS开发中的跨平台策略:一次编码,多平台部署
在移动应用开发的广阔天地中,安卓和iOS两大阵营各占一方。随着技术的发展,跨平台开发框架应运而生,它们承诺着“一次编码,到处运行”的便捷。本文将深入探讨跨平台开发的现状、挑战以及未来趋势,同时通过代码示例揭示跨平台工具的实际运用。
507 3
|
安全 API 开发工具
Android平台RTMP推送|轻量级RTSP服务如何实现麦克风|扬声器声音采集切换
Android平台扬声器播放声音的采集,在无纸化同屏等场景下,意义很大,早期低版本的Android设备,是没法直接采集扬声器audio的(从Android 10开始支持),所以,如果需要采集扬声器audio,需要先做系统版本判断,添加相应的权限。
703 0
|
编解码 开发工具 Android开发
Android平台实现屏幕录制(屏幕投影)|音频播放采集|麦克风采集并推送RTMP或轻量级RTSP服务
Android平台屏幕采集、音频播放声音采集、麦克风采集编码打包推送到RTMP和轻量级RTSP服务的相关技术实现,做成高稳定低延迟的同屏系统,还需要有配套好的RTMP、RTSP直播播放器
735 1
|
XML IDE 开发工具
🔧Android Studio高级技巧大公开!效率翻倍,编码不再枯燥无味!🛠️
【9月更文挑战第11天】在软件开发领域,Android Studio凭借其强大的功能成为Android开发者的首选IDE。本文将揭示一些提升开发效率的高级技巧,包括自定义代码模板、重构工具、高级调试技巧及多模块架构。通过对比传统方法,这些技巧不仅能简化编码流程,还能显著提高生产力。例如,自定义模板可一键插入常用代码块;重构工具能智能分析并安全执行代码更改;高级调试技巧如条件断点有助于快速定位问题;多模块架构则提升了大型项目的可维护性和团队协作效率。掌握这些技巧,将使你的开发之旅更加高效与愉悦。
398 5
|
Java Android开发 芯片
使用Android Studio导入Android源码:基于全志H713 AOSP,方便解决编译、编码问题
本文介绍了如何将基于全志H713芯片的AOSP Android源码导入Android Studio以解决编译和编码问题,通过操作步骤的详细说明,展示了在Android Studio中利用代码提示和补全功能快速定位并修复编译错误的方法。
1834 0
使用Android Studio导入Android源码:基于全志H713 AOSP,方便解决编译、编码问题

热门文章

最新文章