安卓音视频开发(3)—— AudioTrack两种方式播放pcm音频

这篇具有很好参考价值的文章主要介绍了安卓音视频开发(3)—— AudioTrack两种方式播放pcm音频。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

前言

之前学习了AudioRecord录制pcm音频,与之对应的就是AudioTrack播放pcm音频(MediaPlayer、SoundPool有其他应用场景),它有两种数据加载模式(MODE_STATIC、MODE_STREAM)。

模式

  • MODE_STATIC:这种模式下,一次将所有的数据放入一个固定的buffer,然后写入到AudioTrack中,后续就不用继续write了。这种模式占用的内存较小,适用于短小的音频,例如手机铃声和系统提示音等。

  • MODE_STREAM:这种模式会持续的把音频数据写入AudioTrack中,write动作将堵塞直到数据流从java层传输到native层,适用于大文件或者播放时间较长的文件。

STATIC模式流程

1.另起线程,将音频文件写入固定buffer。

2.写入完成后,初始化AudioTrack(参数在上一节有详细介绍),接收buffer并播放(play)。

    public void initStatic() {
        if (staticThread != null) {
            staticThread.interrupt();
        }
        staticThread = new Thread(new Runnable() {
            @Override
            public void run() {
                FileInputStream fileInputStream = null;
                try {
                    File file = new File(filePath);
                    fileInputStream = new FileInputStream(file);
                    long size = fileInputStream.getChannel().size();

                    ByteArrayOutputStream byteArrayOutputStream = new ByteArrayOutputStream(audiodata.length);
                    int byteValue = 0;
                    long startTime = System.currentTimeMillis();
                    while ((byteValue = fileInputStream.read()) != -1) {
                        byteArrayOutputStream.write(byteValue);
                    }
                    LogUtils.i("初始化完成" + (System.currentTimeMillis() - startTime));
                    audiodata = byteArrayOutputStream.toByteArray();

                    audioTrack = new AudioTrack(AudioManager.STREAM_MUSIC, 8000, AudioFormat.CHANNEL_OUT_MONO,
                            AudioFormat.ENCODING_PCM_16BIT, audiodata.length, AudioTrack.MODE_STATIC);
                    audioTrack.write(audiodata, 0, audiodata.length);
                    audioTrack.play();
                    LogUtils.i("Static播放");

                } catch (Exception e) {
                    e.printStackTrace();
                    LogUtils.e(e);
                } finally {
                    if (fileInputStream != null) {
                        try {
                            fileInputStream.close();
                        } catch (IOException e) {
                            e.printStackTrace();
                        }
                    }
                }
            }
        });
        staticThread.start();
    }

STREAM模式流程

1.初始化AudioTrack。

2.另起线程,一边写入音频流文件,一边播放。

3.播放结束,关闭流。

    public void startStream() {
        if (streamThread != null) {
            streamThread.interrupt();
        }
        if (audioTrack != null) {
            audioTrack = null;
        }
        audioTrack = new AudioTrack(AudioManager.STREAM_MUSIC, 8000, AudioFormat.CHANNEL_OUT_MONO,
                AudioFormat.ENCODING_PCM_16BIT, 1600, AudioTrack.MODE_STREAM);
        streamThread = new Thread(new Runnable() {
            @Override
            public void run() {
                FileInputStream fileInputStream = null;
                File file = new File(filePath);
                try {
                    audioTrack.play();
                    fileInputStream = new FileInputStream(file);
                    int byteValue = 0;
                    while ((byteValue = fileInputStream.read(audiodata)) != -1) {
                        audioTrack.write(audiodata, 0, byteValue);
                    }
                } catch (Exception e) {
                    e.printStackTrace();
                    LogUtils.e(e);
                } finally {
                    if (audioTrack != null) {
                        audioTrack.stop();
                        audioTrack = null;
                    }
                    if (fileInputStream != null) {
                        try {
                            fileInputStream.close();
                        } catch (IOException e) {
                            e.printStackTrace();
                        }
                    }
                }
            }
        });
        streamThread.start();
    }

结语

其实MediaPlayer底层同样使用了AudioTrack,但它封装得比较全面,能支持多种格式得声音,如MP3,AAC,WAV,OGG等,但是无法直接播放pcm文件。我们使用AudioTrack,它能控制和播放每一帧的音频数据,更接近底层。

本期博客参考:

灰色飘零博客园

需要源码的盆友也可以访问我的gitlub,源码文章来源地址https://www.toymoban.com/news/detail-420801.html

到了这里,关于安卓音视频开发(3)—— AudioTrack两种方式播放pcm音频的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • 安卓音视频多对多级联转发渲染

    最近利用自己以前学习和用到的音视频知识和工程技能做了一个android的sdk,实现了本地流媒体ipc rtsp 拉流以及自带mip usb等camera audio节点产生的流媒体通过webrtc sfu的方式进行多对多级联发布共享,网状结构,p2p组网,支持实时渲染以及转推rtmp,webrtc,h264 h265 opus aac g711,均支持,在

    2024年02月14日
    浏览(76)
  • 哔哩哔哩视频合并 B站缓存视频合并 安卓版 音视频合并 基于ffmpeg

    此软件是为了帮助网友合并哔哩哔哩缓存视频,Android上将bilibili缓存视频合并导出为mp4,你可以将它理解为一个专用的格式工厂,并不涉及破解相关内容,仅仅用于学习技术交流,严禁用于商业用途,如有侵权请联系我删档,对你带来困惑和不便我深感抱歉。 合并(导出)B站缓

    2024年02月02日
    浏览(52)
  • 音视频学习(二十)——rtsp收流(udp方式)

    本文主要介绍通过udp方式实现rtsp拉流。 流程说明: 相较于tcp方式“信令+数据”复用同一连接拉流,udp方式拉流“信令+数据”采用不同的连接,信令传输采用tcp,流数据传输采用udp; 客户端向服务端(设备等)发起tcp请求,用于后续信令交互; tcp连接成功后,开始rtsp信令

    2024年02月04日
    浏览(29)
  • linux 音视频架构 linux音视频开发

    转载 mob6454cc65110a 2023-07-26 22:27:01 文章标签 linux 音视频架构 ci QT 视频教程 文章分类 架构 后端开发 阅读数 117 目录 前言 1、软件工具准备 a. 录音软件 b. 录屏软件 c. 摄像头软件 d. 安卓屏幕操作软件 e. 视频剪辑软件

    2024年02月07日
    浏览(49)
  • 音视频学习(二十一)——rtmp收流(tcp方式)

    本文主要介绍rtmp协议收流流程,在linux上搭建rtmp服务器,通过自研的rtmp收流库发起取流请求,使用ffmpeg+qt实现视频流的解码与播放。 关于rtmp协议基础介绍可查看:https://blog.csdn.net/www_dong/article/details/131026072 下载nginx 解压,将nginx-rtmp-module拷贝至nginx-1.24.0目录,如下所示:

    2024年02月03日
    浏览(34)
  • JavaCV音视频开发宝典:UDP局域网组播推流,多播推流,局域网多网段推流,使用UDP方式推送TS组播流,实现UDP一对多组播

    《JavaCV音视频开发宝典》专栏目录导航 《JavaCV音视频开发宝典》专栏介绍和目录 ​ 在之前文章中我们已经实现rtp点到点传输JavaCV音视频开发宝典:rtp点到点音视频传输(一对一音视频直播)和rtp广播JavaCV音视频开发宝典:rtp广播方式发送TS流音视频传输(一对多音视频会议

    2024年02月03日
    浏览(44)
  • Qt音视频开发45-音视频类结构体参数的设计

    视频监控内核组件重构和完善花了一年多时间,整个组件个人认为设计的最好的部分就是各种结构体参数的设计,而且分门别类,有枚举值,也有窗体相关的结构体参数,解码相关的结构体参数,同时将部分常用的结构体参数的获取和设置单独提供了函数,参阅海康大华等大

    2024年02月05日
    浏览(56)
  • FFmpeg 播放器实现音视频同步的三种方式

    我们基于 FFmpeg 利用 OpenGL ES 和 OpenSL ES 分别实现了对解码后视频和音频的渲染,本文将实现播放器的最后一个重要功能:音视频同步。 老人们经常说, 播放器对音频和视频的播放没有绝对的静态的同步,只有相对的动态的同步,实际上音视频同步就是一个“你追我赶”的过

    2024年02月06日
    浏览(48)
  • 开源IM即时通讯源码-社交+电商+音视频+直播-pc+web+ios+安卓-uniapp+php+mysql

      / 产品介绍 /     即时通讯源码是一个平台或聊天应用程序,使用户能够发送和接收即时消息并进行连接。如今,在线交流已成为一种新常态。目前据统计超过30亿人定期使用聊天应用程序而这一数字将保持持续增长。目前您可能需要一个新的聊天应用程序来简化您自己组织

    2024年02月05日
    浏览(44)
  • Qt/C++音视频开发46-音视频同步保存到MP4

    用ffmpeg单独做视频保存不难,单独做音频保存也不难,难的是音视频同步保存到MP4中,重点是音视频要同步,其实这也不难,只要播放那边音视频同步后的数据,写入到文件即可。最难的是在播放过程中不断随机的切换播放进度,而且还会暂停播放、暂停录制的情况出现,这

    2024年02月17日
    浏览(51)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包