Android使用ExoPlayer播放音频实现报听写功能

项目中需要实现报听写的功能,音频都是后台一个一个返回的链接,考虑到多个音频的连续播放,就选用了google的Exoplayer,主要实现随机播放,按次数播放(这里最多播放3次)的功能,ExoPlayer的集成,请查看https://google.github.io/ExoPlayer/guide.html

1.界面很简单

<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
    android:orientation="vertical" android:layout_width="match_parent"
    android:layout_height="match_parent">
    <Button
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:text="播放"
        android:id="@+id/play_btn"
        android:onClick="play"
        />
    <Button
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:text="不随机"
        android:id="@+id/suiji_btn"
        android:onClick="suijiPlay"
        />
    <Button
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:text="1次"
        android:id="@+id/num_btn"
        android:onClick="numPlay"
        />
</LinearLayout>

2.具体实现

package com.anshi.testvideo;

import android.net.Uri;
import android.os.Bundle;
import android.support.annotation.Nullable;
import android.support.v7.app.AppCompatActivity;
import android.view.View;
import android.widget.Button;

import com.google.android.exoplayer2.ExoPlayerFactory;
import com.google.android.exoplayer2.Player;
import com.google.android.exoplayer2.SimpleExoPlayer;
import com.google.android.exoplayer2.source.ConcatenatingMediaSource;
import com.google.android.exoplayer2.source.ExtractorMediaSource;
import com.google.android.exoplayer2.source.LoopingMediaSource;
import com.google.android.exoplayer2.source.MediaSource;
import com.google.android.exoplayer2.trackselection.AdaptiveTrackSelection;
import com.google.android.exoplayer2.trackselection.DefaultTrackSelector;
import com.google.android.exoplayer2.trackselection.TrackSelection;
import com.google.android.exoplayer2.trackselection.TrackSelector;
import com.google.android.exoplayer2.upstream.DataSource;
import com.google.android.exoplayer2.upstream.DefaultDataSourceFactory;
import com.google.android.exoplayer2.util.Util;

import java.util.ArrayList;
import java.util.Collections;
import java.util.List;

public class NewTestVideoTwo extends AppCompatActivity implements Player.EventListener {
    private int num =1;
    private Button mNumBtn;
    private Button mSuijiBtn;
    private Button mPlayBtn;
    private List<String> mUrl = new ArrayList<>();
    private SimpleExoPlayer player;
    private ConcatenatingMediaSource concatenatedSource =new ConcatenatingMediaSource();//该类可以合成视频或音频资源
    @Override
    protected void onCreate(@Nullable Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_test_two);
        initVideo();
        initView();
        initData(num);
    }

    /**
     * 初始化player
     */
    private void initVideo(){
        TrackSelection.Factory videoTrackSelectionFactory =  new AdaptiveTrackSelection.Factory();

        TrackSelector trackSelector = new DefaultTrackSelector(videoTrackSelectionFactory);
        
         player=  ExoPlayerFactory.newSimpleInstance(this, trackSelector);
         player.addListener(this);
    }
    //监听完成情况,恢复播放事件
    @Override
    public void onPlayerStateChanged(boolean playWhenReady, int playbackState) {
        switch (playbackState){
            case Player.STATE_ENDED:
                player.stop(true);
                mPlayBtn.setText("播放");
                break;
        }
    }




    //初始化数据
    private void initData(int num) {
        concatenatedSource.clear();
        mUrl.clear();
        mUrl.add("xxx.mp3");
        mUrl.add("xxx.mp3");
        if (suiji){
            Collections.shuffle(mUrl);
        }
        DataSource.Factory dataSourceFactory = new DefaultDataSourceFactory(this,
                Util.getUserAgent(this, getString(R.string.app_name)));
        for (int i = 0; i <mUrl.size() ; i++) {
            MediaSource firstSource = new ExtractorMediaSource.Factory(dataSourceFactory)
                    .createMediaSource(Uri.parse(mUrl.get(i)));
            LoopingMediaSource firstSourceTwice = new LoopingMediaSource(firstSource, num);
            concatenatedSource.addMediaSource(firstSourceTwice);
        }

    }
    //初始化控件
    private void initView() {
        mNumBtn = findViewById(R.id.num_btn);
        mSuijiBtn = findViewById(R.id.suiji_btn);
        mPlayBtn = findViewById(R.id.play_btn);
        mNumBtn.setText(String.valueOf(num));

    }
    
    //播放或停止
    public void play(View view) {
       if (mPlayBtn.getText().toString().equals("播放")){
           player.prepare(concatenatedSource);
           player.setPlayWhenReady(true);
           mPlayBtn.setText("停止");
       }else {
           player.stop(true);
           mPlayBtn.setText("播放");
       }
    }


    
    @Override
    protected void onStop() {
        super.onStop();
        if (player!=null){
            player.stop();
        }
    }

    @Override
    protected void onDestroy() {
        super.onDestroy();
        if (player != null) {
            player.removeListener(this);
            player.release();
        }
    }
    
    
    private boolean suiji = false;
    
    //随机播放
    public void suijiPlay(View view) {
        if (mSuijiBtn.getText().toString().equals("随机")){
            mSuijiBtn.setText("不随机");
            suiji = false;
            initData(num);
        }else {
            mSuijiBtn.setText("随机");
            suiji = true;
            initData(num);
        }
    }
    //改变播放次数
    public void numPlay(View view) {
        num++;
        if (num>3){
            num=1;
            mNumBtn.setText(String.valueOf(num));
            initData(num);
        }else {
            mNumBtn.setText(String.valueOf(num));
            initData(num);
        }
    }
}

    

猜你喜欢

转载自blog.csdn.net/hardWork_yulu/article/details/86655417