项目中需要实现报听写的功能,音频都是后台一个一个返回的链接,考虑到多个音频的连续播放,就选用了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);
}
}
}