public class AdaptiveAudioPlayer {
private BandwidthEstimator bandwidthEstimator;
private AudioTrack audioTrack;
private ExecutorService decodeExecutor = Executors.newSingleThreadExecutor();
public void startStreaming(String url) {
// 使用ExoPlayer风格的ChunkSampleStream进行分块拉取
DataSource dataSource = new OkHttpDataSourceFactory(client).createDataSource();
ProgressiveMediaSource mediaSource = new ProgressiveMediaSource.Factory(dataSource)
.setCustomLoadErrorHandlingPolicy(new RetryOnWeakNetworkPolicy())
.createMediaSource(MediaItem.fromUri(url));
player.prepare(mediaSource);
player.setPlaybackSpeed(determineSpeedByNetwork());
}
private float determineSpeedByNetwork() {
int kbps = bandwidthEstimator.getBitrateKbps();
if (kbps < 40) return 0.8f; // 切换至低质音频
else if (kbps < 80) return 1.0f;
else return 1.2f; // 高速网络加速播放
}
}
五、流式解码与线程模型优化
graph TD
A[网络数据流入] --> B{是否为完整帧?}
B -- 是 --> C[放入解码队列]
B -- 否 --> D[继续接收缓冲]
C --> E[独立解码线程处理]
E --> F[输出PCM至AudioTrack]
F --> G[混音播放]
H[主线程] --> I[控制指令下发]
I --> J[状态同步更新UI]
E --> J