【问题标题】:Should have subtitle controller already set Mediaplayer error Android应该有字幕控制器已经设置 Mediaplayer 错误 Android
【发布时间】:2013-12-03 23:10:08
【问题描述】:

每当我播放媒体时,它都会在 DDMS Should have subtitle controller already set 中显示警告

我的代码:

private void start() {
    mediaPlayer.start();

        mediaPlayer.setOnCompletionListener(new OnCompletionListener() {
        @Override
        public void onCompletion(MediaPlayer mp) {
            mp.stop();
            mp.release();
        }
    });
}

DDMS 日志

应该已经设置了字幕控制器

信息/警告 (2, 0)

当我在 Google 上搜索时,甚至没有一个与之相关的主题。我怎样才能摆脱或禁用它?

【问题讨论】:

    标签: android android-mediaplayer


    【解决方案1】:

    最近一个开发者added subtitle support to VideoView

    MediaPlayer 开始播放音乐(或其他来源)时,它会检查是否存在 SubtitleController,如果未设置则显示此消息。 它似乎并不关心您要播放的源是音乐还是视频。不知道他为什么这样做。

    简答:不要在意这个“例外”。


    编辑:

    仍然存在于Lollipop

    如果MediaPlayer 仅用于播放音频文件,并且您确实想在 logcat 中删除这些错误,则下面的代码将empty SubtitleController 设置为MediaPlayer

    不应在生产环境中使用,可能会有一些副作用。

    static MediaPlayer getMediaPlayer(Context context){
    
        MediaPlayer mediaplayer = new MediaPlayer();
    
        if (android.os.Build.VERSION.SDK_INT < android.os.Build.VERSION_CODES.KITKAT) {
            return mediaplayer;
        }
    
        try {
            Class<?> cMediaTimeProvider = Class.forName( "android.media.MediaTimeProvider" );
            Class<?> cSubtitleController = Class.forName( "android.media.SubtitleController" );
            Class<?> iSubtitleControllerAnchor = Class.forName( "android.media.SubtitleController$Anchor" );
            Class<?> iSubtitleControllerListener = Class.forName( "android.media.SubtitleController$Listener" );
    
            Constructor constructor = cSubtitleController.getConstructor(new Class[]{Context.class, cMediaTimeProvider, iSubtitleControllerListener});
    
            Object subtitleInstance = constructor.newInstance(context, null, null);
    
            Field f = cSubtitleController.getDeclaredField("mHandler");
    
            f.setAccessible(true);
            try {
                f.set(subtitleInstance, new Handler());
            }
            catch (IllegalAccessException e) {return mediaplayer;}
            finally {
                f.setAccessible(false);
            }
    
            Method setsubtitleanchor = mediaplayer.getClass().getMethod("setSubtitleAnchor", cSubtitleController, iSubtitleControllerAnchor);
    
            setsubtitleanchor.invoke(mediaplayer, subtitleInstance, null);
            //Log.e("", "subtitle is setted :p");
        } catch (Exception e) {}
    
        return mediaplayer;
    }
    

    此代码试图从隐藏的 API 执行以下操作

    SubtitleController sc = new SubtitleController(context, null, null);
    sc.mHandler = new Handler();
    mediaplayer.setSubtitleAnchor(sc, null)
    

    【讨论】:

    • 我同意 - 如果字幕轨道不存在,这不是错误。最多提供信息。
    • 好的,当然,但是有没有简单的方法来抑制它?它正在破坏我的 logcat 输出......
    • 可以做一个过滤器,如果真的很烦,重新编译android,或者为你的歌曲设置一个空的SubtitleController。
    • @Haketo 你如何设置一个空的 SubtitleController?抱歉,我在文档中没有看到这个。
    • 当然文档没有提供这些信息。如果您看过 MediaPlayer 的共享代码,您会看到 SubtitleController 有一个 setter(所以应该可以),但不幸的是似乎不可用。
    【解决方案2】:

    要删除 logcat 上的消息,我添加了一个字幕来跟踪。 在 Windows 上,右键单击轨道 -> 属性 -> 详细信息 -> 在字幕上插入文本。 完成:)

    【讨论】:

    • 对此有几个想法:1)在很多情况下修改源文件并不可行。 2) 你没有解释为什么添加字幕轨道会修复 MediaPlayer 中字幕控制器上的错误。
    • 错误是“应该已经设置了字幕控制器”,所以我添加了一个字幕来跟踪以避免出现此错误消息。
    • 字幕或字幕控制器。您是说通过在视频上添加字幕轨道,媒体播放器会自动生成控制器?
    【解决方案3】:

    您也只能设置mediaPlayer.reset() 并在onDestroy 中将其设置为释放。

    【讨论】:

      猜你喜欢
      • 2013-12-08
      • 2014-03-14
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2014-10-07
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多