项目中播放FLV流 https://devflytopull.codroner.com/live/flytodev-stream-7CTDL9K00A0121.flv 时出现播放慢或无法播放的问题。
通过测试脚本验证,FLV流可以正常访问:
原问题:
解决方案:
// 使用更合理的缓冲设置
ijkPlayer.setOption(IjkMediaPlayer.OPT_CATEGORY_FORMAT, "max-buffer-size", "1024000"); // 1MB
ijkPlayer.setOption(IjkMediaPlayer.OPT_CATEGORY_FORMAT, "probesize", "50000"); // 50KB
ijkPlayer.setOption(IjkMediaPlayer.OPT_CATEGORY_FORMAT, "analyzeduration", "100000"); // 100ms
ijkPlayer.setOption(IjkMediaPlayer.OPT_CATEGORY_FORMAT, "timeout", "5000000"); // 5秒
ijkPlayer.setOption(IjkMediaPlayer.OPT_CATEGORY_FORMAT, "stimeout", "5000000"); // 5秒
// 启用缓冲机制
ijkPlayer.setOption(IjkMediaPlayer.OPT_CATEGORY_PLAYER, "packet-buffering", 1);
ijkPlayer.setOption(IjkMediaPlayer.OPT_CATEGORY_PLAYER, "sync-av-start", 1);
ijkPlayer.setOption(IjkMediaPlayer.OPT_CATEGORY_PLAYER, "infbuf", 1);
原问题:
解决方案:
// 在Surface创建后再开始准备
@Override
public void surfaceCreated(@NonNull SurfaceHolder holder) {
ijkPlayer.setDisplay(holder);
if (!playerObj.isPlayerPlaying()) {
ijkPlayer.prepareAsync();
}
}
原问题:
解决方案:
// 添加重试机制
private void retryConnection(ChannelPlayerObj playerObj) {
new Thread(() -> {
try {
Thread.sleep(2000); // 等待2秒后重试
if (getActivity() != null) {
getActivity().runOnUiThread(() -> {
try {
IjkMediaPlayer ijkPlayer = playerObj.getIjkPlayer();
if (ijkPlayer != null) {
ijkPlayer.reset();
ijkPlayer.setDataSource(playerObj.getCurrentPlayingUrl());
ijkPlayer.prepareAsync();
}
} catch (Exception e) {
LogUtil.e("重试连接失败: " + e.getMessage());
}
});
}
} catch (InterruptedException e) {
LogUtil.e("重试连接被中断: " + e.getMessage());
}
}).start();
}
创建了 test_flv_stream.py 用于测试FLV流的可访问性:
创建了两个测试Activity:
FlvTestActivity:完整的FLV测试界面SimpleFlvTestActivity:简化的测试界面修复后应该能够: