首页 > 解决方案 > 如何为 VideoView 添加字幕?

问题描述

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

Android 文档说 addTimedTextSource 仅与 MediaPlayer 一起使用(VideoView 不是),但有一些关于轨道的信息,即 getTrackInfo 和其他信息。我不知道从哪里开始。互联网上有一些解决方案,但我不理解这些代码片段,我认为它们没有提供简单的解决方案。

有人可以帮助我吗?

让我们有一个附有视频的简单 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();
            }
        });
  1. 我把 "android.resource://" + getPackageName() + "/"+R.raw.sub 路径放到文件中,但它给了我一个错误 E/TaskPersister: File error access recents directory (directory doesn't exist ?)。后来我把它移到了资产文件夹,但结果是一样的。怎么了?
  2. 我添加了 mp.selectTrack(2); index = 2 因为我在某处读到这是强制性的,并且对于视频 getTrackInfo 在大多数情况下返回 2。
  3. 最后我认为 txtDisplay.setText() 方法就可以了。是吗?

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

标签: androidsubtitle

解决方案


您可以ExoPlayer为此目的使用库。这是一篇中篇文章,解释了如何SRT为 ExoPlayer 曲目添加字幕。


推荐阅读