美文网首页
音视频学习(五)

音视频学习(五)

作者: 主音King | 来源:发表于2020-08-06 11:57 被阅读0次

    音频编码

    • WAV编码
      是在PCM数据格式的前面加44个字节,分别用来存储PCM的采样率、声道数、数据格式等信息
      特点:音质好,大量软件支持
      场景:多媒体开发中间文件、保存音乐和音效素材

    • MP3编码
      使用LAME编码(MP3编码格式的一种实现)中高码率的MP3文件,听感接近WAV文件。
      特点:音质128Kbit/s 压缩比比较高,大量软件和硬件支持,兼容性好
      场景:高比特率下对兼容性有要求。

    • AAC编码
      新一代音频有损压缩技术,附加的编码技术(PS、SBR)等,衍生出LC-AAC、HE-AAC、HE-AAC v2三种主要编码格式。
      特点:在小于128Kbit/s码率表现优异,多用于视频中音频编码
      场景:128Kbit/s一下的音频编码,多用于视频音频轨的编码。

    • Ogg编码
      潜力编码,音质好,完全免费。支持情况不好,无法和MP3相比。
      特点:比MP3更小的码率实现比MP3更好的音质,兼容性不好,流媒体特性不支持
      场景:语言聊天音频消息场景

    Android平台音频渲染

    AudioTrack

    是Android SDK提供最底层音频播放API,允许输入裸数据PCM。和MediaPlayer相比,压缩的音频文件(MP3、AAC等),只需要自行解码操作和缓冲区控制。
    1、配置AudioTrack

    public AudioTrack(int streamType, int sampleRateInHz, int channelConfig, int audioFormat,
                int bufferSizeInBytes, int mode)
    

    streamType:多种音频管理策略,定义在AudioManager中

        /**电话铃声 */
        public static final int STREAM_VOICE_CALL = AudioSystem.STREAM_VOICE_CALL;
        /** 系统铃声 */
        public static final int STREAM_SYSTEM = AudioSystem.STREAM_SYSTEM;
        /** 铃声*/
        public static final int STREAM_RING = AudioSystem.STREAM_RING;
        /** 音乐声 */
        public static final int STREAM_MUSIC = AudioSystem.STREAM_MUSIC;
        /** 警告声 */
        public static final int STREAM_ALARM = AudioSystem.STREAM_ALARM;
        /** 通知声 */
        public static final int STREAM_NOTIFICATION = AudioSystem.STREAM_NOTIFICATION;
    

    sampleRateInHz:采样率,可选:8000, 16000, 22050, 24000, 32000, 44100, 48000等。

    channelConfig:声道数的配置,常量在AudioFormat中,CHANNEL_IN_MONO(单声道)、CHANNEL_IN_STEREO(双声道), 建议采用单声道。

    audioFormat:数据位宽,即采样格式,常量定义在AudioFormat中,ENCODING_PCM_16BIT(兼容所有手机)、ENCODING_PCM_8BIT

    bufferSizeInBytes:配置内部音频缓冲区大小,AudioTrack提供bufferSizeInBytes函数 getMinBufferSize,建议该函数计算大小,不要手动计算。
    mode:AudioTrack提供两种播放模式,在AudioTrack中定义MODE_STATIC,需要一次性写入缓冲区,简单高效,用于播放铃声、系统提醒音频片段;另一个MODE_STREAM,需要按照一定时间间隔不断写入音频数据,理论可以应用任何音频播放场景。
    Play:

    //当前播放实例是否初始化成功,如果处于初始化成功的状态并且未播放的状态,那么就调用 play
    if (null != mAudioTrack && mAudioTrack.getState() != AudioTrack.STATE_UNINITIALIZED && mAudioTrack.getPlayState() != PLAYSTATE_PLAYING)
       mAudioTrack.play();
    

    OpenSL ES使用

    Open Sound Library for Embedded System 嵌入式音频加速标准。
    是无授权、跨平台、针对嵌入式硬件音频加速API,提供标准、高性能、低响应时间音频功能实现方法,实现了软/硬音频性能的直接跨平台部署,降低执行标准,促进高音频市场发展。


    image.png

    总结

    一些基础知识和AudioTrack以及OpenSL ES渲染裸流音频数据。

    相关文章

      网友评论

          本文标题:音视频学习(五)

          本文链接:https://www.haomeiwen.com/subject/dxjslktx.html