Java “错误”;E/MediaPlayer:应已设置字幕控制器;导致没有音频播放
我已经阅读了这两篇文章: 这一个谈论忽略和抑制错误。不能解决我的问题 还有这个: 没有有效的答案 我遇到的问题是:过去音频播放,但我们不得不改变框架(我们删除了人行横道),现在音频不再播放。问题是,删除人行横道与我的mediaplayer代码无关 所以我得到的错误连续出现了两次。在我的代码中,我执行以下操作:Java “错误”;E/MediaPlayer:应已设置字幕控制器;导致没有音频播放,java,android,audio,android-mediaplayer,Java,Android,Audio,Android Mediaplayer,我已经阅读了这两篇文章: 这一个谈论忽略和抑制错误。不能解决我的问题 还有这个: 没有有效的答案 我遇到的问题是:过去音频播放,但我们不得不改变框架(我们删除了人行横道),现在音频不再播放。问题是,删除人行横道与我的mediaplayer代码无关 所以我得到的错误连续出现了两次。在我的代码中,我执行以下操作: _activeMediaPlayer.prepare(); _activeMediaPlayer.start(); 调用这两行中的任何一行时,将抛出错
_activeMediaPlayer.prepare();
_activeMediaPlayer.start();
调用这两行中的任何一行时,将抛出错误:
E/MediaPlayer:应已设置字幕控制器
设置流类型不会以任何方式影响这一点。此外,它不会抛出异常,但也不会触发CompletionListener的OnCompletionListener
_activeMediaPlayer.setOnCompletionListener
(
new MediaPlayer.OnCompletionListener()
{
@Override
public void onCompletion(MediaPlayer mp)
{
_activeMediaPlayer = null;
Log.d("AudioPlayer", "Completed audio playing");
}
}
);
你知道为什么音频不能播放吗?(100%可确认手机音频是否正常工作,音量是否达到最大值)。这段代码曾经工作过
更新
这是我的整个音频播放课。这曾经非常有效。它播放的音频文件没有更改路径或格式。它实际上只是停止工作,没有抛出错误
public class AudioPlayer
{
//region Variables
private static final String AUDIO_TYPE_DOWNLOADED = "downloaded";
private static final String AUDIO_TYPE_BUNDLED = "bundled";
private static final String AUDIO_BUNDLED_PATH = "www/audio/";
private static final String AUDIO_DOWNLOADED_PATH = "file:///data/data/co.app.app/Documents/";
private static AudioManager _audioManager;
private static AudioPlayer _singleton;
private static Activity _activity;
private static ArrayList<MediaPlayer> _audioList;
private static MediaPlayer _activeMediaPlayer = null;
//endregion
//region Initialization
/*
* Must be called before using Singleton. Will initialize with activity.
*/
public static void initialize(Activity activity)
{
_activity = activity;
_singleton = new AudioPlayer();
_audioList = new ArrayList<>();
_audioManager = SINGLETON().createAudioManager();
}
/**
* Access this to play audio.
*/
public static AudioPlayer SINGLETON()
{
if (_singleton == null)
{
System.out.println("Error audio helper not initialized, call Initialize first");
return null;
}
return _singleton;
}
/**
* Creates an audio manager.
*/
private AudioManager createAudioManager()
{
final AudioManager audioManager =
(AudioManager) _activity.getBaseContext().getSystemService(Context.AUDIO_SERVICE);
return audioManager;
}
//endregion
//region Audio Focus
/**
* Listener for audio focus changes.
*/
private AudioManager.OnAudioFocusChangeListener createAudioFocusChangeListener()
{
return new AudioManager.OnAudioFocusChangeListener()
{
public void onAudioFocusChange(int focusChange)
{
if (focusChange == AudioManager.AUDIOFOCUS_LOSS_TRANSIENT_CAN_DUCK)
{
//TODO leave in case features are desired here
} else if (focusChange == AudioManager.AUDIOFOCUS_GAIN)
{
//TODO leave in case features are desired here
}
}
};
}
/*
* Sets audio focus to duck others.
*/
private int requestAudioFocus(AudioManager audioManager,
AudioManager.OnAudioFocusChangeListener audioFocusListener)
{
// Use the music stream and request permanent focus.
return audioManager.requestAudioFocus
(
audioFocusListener,
AudioManager.STREAM_MUSIC,
AudioManager.AUDIOFOCUS_GAIN_TRANSIENT_MAY_DUCK
);
}
//endregion
//region Playing & Queueing Audio
/*
* Enqueue audio for play.
*/
private static void enqueueAudio(String path, String audioType)
{
MediaPlayer mediaPlayer = new MediaPlayer();
if (audioType.equals(AUDIO_TYPE_BUNDLED))
{
try
{
AssetFileDescriptor afd =
_activity.getAssets().openFd(AUDIO_BUNDLED_PATH + path + ".m4a");
mediaPlayer.setDataSource
(
afd.getFileDescriptor(),
afd.getStartOffset(),
afd.getLength()
);
} catch (IOException e)
{
System.out.println("Error bundled file not found ");
e.printStackTrace();
return;
}
} else
{
Uri uri = Uri.parse(AUDIO_DOWNLOADED_PATH + path + ".m4a");
try
{
mediaPlayer.setDataSource(_activity,uri);
} catch (IOException e)
{
e.printStackTrace();
System.out.println("Could not find audio at " + path);
return;
}
}
_audioList.add(mediaPlayer);
}
/**
* Enqueues all audio then plays it.
* Example format: String json = "{\"audio\":[{\"path\":\"a\",\"type\":\"bundled\"},
* {\"path\":\"444-1438314705229\",\"type\":\"downloaded\"}]}";
*/
public static void playAudio(String json)
{
try
{
JSONObject rootJson = new JSONObject(json);
JSONArray arrayJson = rootJson.getJSONArray("audio");
for (int i = 0; i < arrayJson.length(); i++)
{
JSONObject audioJson = (JSONObject) arrayJson.get(i);
enqueueAudio(audioJson.getString("path"), audioJson.getString("type"));
}
} catch (Exception e)
{
System.err.println("JSON parsing error " + e.getMessage());
if (Bridge.audioCallback != null)
{
Bridge.audioCallback.error(e.getMessage());
}
}
playQueuedAudio();
}
/**
* Plays the top most queued audio (is called by the onComplete listener)
*/
private static void playQueuedAudio()
{
final AudioManager.OnAudioFocusChangeListener audioFocusListener =
SINGLETON().createAudioFocusChangeListener();
int result = SINGLETON().requestAudioFocus(_audioManager, audioFocusListener);
if (_audioList.isEmpty())
{
_audioManager.abandonAudioFocus(audioFocusListener);
if (Bridge.audioCallback != null)
{
Bridge.audioCallback.success();
}
return;
}
if (result != AudioManager.AUDIOFOCUS_REQUEST_GRANTED)
{
System.err.println("Could not gain audio focus, not playing audio");
return;
}
try
{
_activeMediaPlayer = _audioList.get(0);
_audioList.remove(0);
_activeMediaPlayer.prepare();
_activeMediaPlayer.start();
_activeMediaPlayer.setOnCompletionListener
(
new MediaPlayer.OnCompletionListener()
{
@Override
public void onCompletion(MediaPlayer mp)
{
_activeMediaPlayer = null;
playQueuedAudio();
}
}
);
} catch (IOException e)
{
String message = "Unable to open media file: " + e.getMessage();
System.err.println(message);
if(Bridge.audioCallback != null)
{
Bridge.audioCallback.error(message);
}
}
}
/**
* Stops audio.
*/
public static void stopAudio(CallbackContext callbackContext)
{
if (_activeMediaPlayer != null && _activeMediaPlayer.isPlaying())
{
_activeMediaPlayer.stop();
}
_audioList.clear();
_activeMediaPlayer = null;
callbackContext.success();
}
//endregion
}
这也不起作用。这里正在进行一些事情…经过大量研究,我得出结论,用于编码音频文件的编解码器已损坏。m4a适用于Android,但似乎有些编解码器无法正常工作(据我所知,标题部分可能会出错)
因此,我将所有内容都转换为mp3,现在可以正常工作。在Emulator(Nexus S API 22)中运行音频应用程序时发生了这种情况
我做了一个很酷的引导,错误消失了。不再发生崩溃。我想说,“字幕控制器…”消息很有可能与导致音频无法播放的原因完全无关。我经常在播放音乐的媒体播放器对象中看到该消息。另外,您的媒体播放器数据源是什么?你正在播放音频流吗?如果是的话,你有上网许可吗?设置onPreparedListener。有人打电话吗?嗯,如果是这样的话,当音频不播放时,不应该有某种错误记录吗(我的数据源是.m4a文件(用于工作)。所有权限都在那里。我将立即检查onPreparedListener onPreparedListener正在启动。
MediaPlayer mediaPlayer = MediaPlayer.create(context,R.raw.test);
mediaPlayer.start();