应该有字幕控制器已经设置 Mediaplayer 错误 Android

Posted

技术标签:

【中文标题】应该有字幕控制器已经设置 Mediaplayer 错误 Android【英文标题】:Should have subtitle controller already set Mediaplayer error 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 上搜索时,甚至没有一个与之相关的主题。我怎样才能摆脱或禁用它?

【问题讨论】:

【参考方案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 中将其设置为释放。

【讨论】:

以上是关于应该有字幕控制器已经设置 Mediaplayer 错误 Android的主要内容,如果未能解决你的问题,请参考以下文章

Android MediaPlayer 警告:应该已经设置了字幕控制器

MediaPlayer 在暂停或 seekTo 后不会继续显示字幕 (.SRT)

MediaPlayer 的字幕功能不起作用(SRT 文件)

mediaplayer不能播放视频怎么办

如何为 VideoView 添加字幕?

如何一键暂停/播放多个 MediaPlayer 对象?