Android如何播放一组音频文件(类似支付宝收款播报或者叫号播报)

最近项目有个需求,一个app需要能够播报金额,另一个需要播报叫号,因为金额和排队号是可变的,所以需要播放的音频是不固定的。方案有如下几种:

1、集成百度TTS,通过离在线的sdk接口进行播报;

2、录制表示数字,金额,小数点,英文字母的单个字符,然后先将所需的音频合成为一个音频,再播报,或者直接顺序播报一组音频;

具体实现:

由于本人在别的项目中使用过百度TTS语音播报,这种离在线系统的机制在网络不稳定时,可能出现不播报的情况,而本项目app很可能在一些网络环境较差的情况下使用,所以选择第二种实现方案。

需要使用的库

//exoplayer
implementation 'com.google.android.exoplayer:exoplayer:2.8.1'
implementation 'com.google.android.exoplayer:exoplayer-core:2.8.1'

具体播报方法如下:

首先根据数量或队列号获取一组音频文件,然后使用以下方法正常播放。

[En]

First get a set of audio files according to the amount or queue number, and then use the following method to broadcast normally.

音频文件放在app/assets目录下

public void playAudios(Context context, List<string> fileNames){
        if (fileNames == null){
            return;
        }
        if (player == null){
            player = ExoPlayerFactory.newSimpleInstance(context, new DefaultTrackSelector());
            //&#x7B2C;&#x4E00;&#x4E2A;&#x53C2;&#x6570;&#x662F;&#x64AD;&#x653E;&#x901F;&#x5EA6;&#xFF0C;&#x7B2C;&#x4E8C;&#x4E2A;&#x53C2;&#x6570;&#x662F;&#x64AD;&#x653E;&#x97F3;&#x8C03;&#x7684;&#x9AD8;&#x4F4E;
            player.setPlaybackParameters(new PlaybackParameters(0.8f, 1.0f));
        }
        //  userAgent -> audio/mpeg  &#x4E0D;&#x80FD;&#x4E3A;&#x7A7A;
        DefaultDataSourceFactory defaultDataSourceFactory = new DefaultDataSourceFactory(context, "audio/mpeg");
        //&#x521B;&#x5EFA;&#x4E00;&#x4E2A;&#x5A92;&#x4F53;&#x8FDE;&#x63A5;&#x6E90;
        ConcatenatingMediaSource concatenatingMediaSource = new ConcatenatingMediaSource();
        for (int i=0;i<filenames.size();i++){ string filename="fileNames.get(i);" log.e(tag, "playaudios filename: " + filename); 创建一个播放数据源 mediasource extractormediasource.factory(defaultdatasourcefactory).createmediasource(uri.parse("file: android_asset filename)); concatenatingmediasource.addmediasource(mediasource); } player.setplaywhenready(true); player.prepare(concatenatingmediasource); }< code></filenames.size();i++){></string>

如果在Activity直接调用该方法,可能出现未播报完,页面中止的情况,导致音频播报不完全,所以可以定义一个Service,然后在Service中开启一个线程播报,这样即使当前页面中止了,音频也可以正常完成播报。

/**
     * &#x8FDB;&#x884C;&#x8BED;&#x97F3;&#x64AD;&#x62A5;&#x64CD;&#x4F5C;&#xFF08;&#x652F;&#x4ED8;&#x7684;&#x8BED;&#x97F3;&#x64AD;&#x62A5;&#xFF09;
     * @param numFileNames
     */
    private void playAudio(ArrayList<string> numFileNames){
        Log.e(TAG, "playAudio execute");
        new Thread(){
            @Override
            public void run() {
                List<string> fileNames2 = new ArrayList<>();
                fileNames2.add("xxx.mp3");
                player.playAudios(mContext, fileNames2);
                try {
                    Thread.sleep(2000);
                } catch (InterruptedException e) {
                    e.printStackTrace();
                }
                if (numFileNames != null){
                    List<string> fileNames = new ArrayList<>();
                    fileNames.addAll(numFileNames);
                    player.playAudios(mContext, fileNames);
                    numFileNames.clear();
                }
            }
        }.start();
    }</string></string></string>

使用时应注意以下几点:

[En]

You should pay attention to the following points when using it:

1、Service需要在AndroidManifest.xml当中进行配置


2、每次调用playAudios方法时,传入的一组音频文件格式需要相同,因为默认是根据一组音频的第一个音频格式去解析后面的所有音频文件格式,如果这种音频格式不同,可能导致跟第一个音频不同格式的音频文件不能被正常解析,也不能正常播报。

具体代码,你可以去我的资源下载相关类。

[En]

Specific code, you can go to my resources to download related classes.

Original: https://blog.csdn.net/chali1314/article/details/122918769
Author: 晒干的老咸鱼
Title: Android如何播放一组音频文件(类似支付宝收款播报或者叫号播报)

原创文章受到原创版权保护。转载请注明出处:https://www.johngo689.com/497978/

转载文章受原作者版权保护。转载请注明原作者出处!

(0)

大家都在看

亲爱的 Coder【最近整理,可免费获取】👉 最新必读书单  | 👏 面试题下载  | 🌎 免费的AI知识星球