如何为 VideoView 添加字幕?

Posted

技术标签:

【中文标题】如何为 VideoView 添加字幕?【英文标题】:How to add subtitles to VideoView? 【发布时间】:2019-10-14 20:42:41 【问题描述】:

我想知道如何成功地将字幕添加到 VideoView。我不知道怎么做。我不知道如何正确使用 addSubtitleSource、addTimedTextSource 方法以及它们是否正确。

android 文档说 addTimedTextSource 仅与 MediaPlayer 一起使用(VideoView 不是),但有一些关于轨道的信息,即 getTrackInfo 等。我不知道从哪里开始。互联网上有一些解决方案,但我不明白那些代码 sn-ps,我认为它们没有给出简单的解决方案。

有人可以帮我吗?

让我们有一个附有视频的简单 VideoView。下一步是什么?

    @Override
    protected void onCreate(Bundle savedInstanceState) 
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_video);

        videoView = findViewById(R.id.video_view1);

        MediaController mMedia = new MediaController(this);
        mMedia.setMediaPlayer(videoView);
        mMedia.setAnchorView(videoView);

        videoView.setMediaController(mMedia);

        String path1 = VIDEO_URL;

        Uri uri = Uri.parse(path1);

        videoView.setVideoURI(uri);
        videoView.start();

编辑: 我已将侦听器添加到 VideoView,然后将 OnTimedTextListener 添加到 MediaPlayer mp。这个 MediaPlayer mp 是否附加到我的 VideoView?这是创建与 VideoView 对应的 MediaPlayer 的正确方法吗?

videoView.setOnPreparedListener(new MediaPlayer.OnPreparedListener() 
            @Override
            public void onPrepared(MediaPlayer mp) 
                try 
                    mp.addTimedTextSource("android.resource://"+getPackageName()+"/"+ R.raw.sub,MediaPlayer.MEDIA_MIMETYPE_TEXT_SUBRIP);
                 catch (IOException e) 
                    e.printStackTrace();
                

                mp.setOnTimedTextListener(new MediaPlayer.OnTimedTextListener() 
                    @Override
                    public void onTimedText(MediaPlayer mp, TimedText text) 
                        text.getBounds();
                        text.getText();
                    
                );

我不知道如何使用 getBounds() 和 getText() 方法。

编辑 2: 现在我做了这样的东西......

videoView.setOnPreparedListener(new MediaPlayer.OnPreparedListener() 
            @Override
            public void onPrepared(MediaPlayer mp) 

                try 
                      mp.addTimedTextSource("android.resource://" + getPackageName() + "/"+R.raw.sub,
                                                            MediaPlayer.MEDIA_MIMETYPE_TEXT_SUBRIP);

                 catch (IOException e) 
                    e.printStackTrace();
                
                mp.selectTrack(2);

                mp.setOnTimedTextListener(new MediaPlayer.OnTimedTextListener() 
                    @Override
                    public void onTimedText(MediaPlayer mp, TimedText text) 

                        txtDisplay.setText(text.getText());

                    
                );
                mp.start();
            
        );
    我将 "android.resource://" + getPackageName() + "/"+R.raw.sub 路径放到文件中,但它给了我一个错误 E/TaskPersister: File error access recents directory (目录没有不存在?)。后来我把它移到了资产文件夹,但结果是一样的。怎么了? 我添加了 mp.selectTrack(2); index = 2 因为我在某处读到这是强制性的,对于视频 getTrackInfo 在大多数情况下返回 2。 最后我认为 txtDisplay.setText() 方法就可以了。是吗?

请告诉我,这里只有 1 个问题还是更多?

【问题讨论】:

我只看了videoView 并没有看到任何添加字幕或文本的方法。为什么不能只使用 mediaPlayermediaPlayer 类非常健壮,并允许许多功能,如背景播放、锁屏控制……各种很棒的东西。我会说走mediaPlayer 路线,因为有很多很多功能会派上用场。 好的,我会走这条路,但是如何设置媒体播放器?它使用什么视图? 阅读本教程,它应该可以帮助您入门 o7planning.org/en/10487/… 。我认为您仍然需要videoView,但字幕将添加到mediaPlayer EDITED 的实例中,以获取videoView 示例。按照本教程,然后尝试将字幕添加到您的 mediaPlayer 实例中 MediaPlayer中检查这个方法。 developer.android.com/reference/android/media/… 可以调用 videoView.setOnpreparedListener(new new MediaPlayer.OnPreparedListener() @Override public void onPrepared(MediaPlayer mp) ... ?? 这是 mp 是 MediaPlayer。是它附加到我拥有的 VideoView 上? 【参考方案1】:

您可以为此目的使用ExoPlayer 库。这是一个medium post,它解释了如何将SRT 字幕添加到 ExoPlayer 轨道。

【讨论】:

以上是关于如何为 VideoView 添加字幕?的主要内容,如果未能解决你的问题,请参考以下文章

如何为 YouTube 直播添加字幕?

如何为单元格添加额外的字幕

Android VideoView没有在iplayer中添加VTT字幕

如何为VOD点播配置字幕

VideoView 上的字幕

如何为 Flash 视频加载字幕文本?