Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/352.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java “错误”;E/MediaPlayer:应已设置字幕控制器;导致没有音频播放_Java_Android_Audio_Android Mediaplayer - Fatal编程技术网

Java “错误”;E/MediaPlayer:应已设置字幕控制器;导致没有音频播放

Java “错误”;E/MediaPlayer:应已设置字幕控制器;导致没有音频播放,java,android,audio,android-mediaplayer,Java,Android,Audio,Android Mediaplayer,我已经阅读了这两篇文章: 这一个谈论忽略和抑制错误。不能解决我的问题 还有这个: 没有有效的答案 我遇到的问题是:过去音频播放,但我们不得不改变框架(我们删除了人行横道),现在音频不再播放。问题是,删除人行横道与我的mediaplayer代码无关 所以我得到的错误连续出现了两次。在我的代码中,我执行以下操作: _activeMediaPlayer.prepare(); _activeMediaPlayer.start(); 调用这两行中的任何一行时,将抛出错

我已经阅读了这两篇文章:

这一个谈论忽略和抑制错误。不能解决我的问题

还有这个:

没有有效的答案

我遇到的问题是:过去音频播放,但我们不得不改变框架(我们删除了人行横道),现在音频不再播放。问题是,删除人行横道与我的mediaplayer代码无关

所以我得到的错误连续出现了两次。在我的代码中,我执行以下操作:

        _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();