android - MediaPlayer 的字幕功能不工作(SRT 文件)

标签 android media-player subtitle

我正在尝试显示 .srt 文件中的字幕。 (适用于安卓 4.1+) 设备中同时存在mp4文件和srt文件。

public class MainActivity extends Activity implements SurfaceHolder.Callback, OnPreparedListener{

MediaPlayer mediaPlayer;
SurfaceHolder surfaceHolder;
SurfaceView playerSurfaceView;
TextView tv_subtitle;
String videoSrc = Environment.getExternalStorageDirectory().getPath() + "/video.mp4";
String subTitleSrc = Environment.getExternalStorageDirectory().getPath() + "/sub.srt";

@Override
protected void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.activity_main);
    playerSurfaceView = (SurfaceView)findViewById(R.id.playersurface);
    tv_subtitle = (TextView)findViewById(R.id.tv_subtitle);
    surfaceHolder = playerSurfaceView.getHolder();
    surfaceHolder.addCallback(this);
}

@Override
public void surfaceChanged(SurfaceHolder arg0, int arg1, int arg2, int arg3) {

}

@Override
public void surfaceCreated(SurfaceHolder arg0) {

    try {
        mediaPlayer = new MediaPlayer();
        mediaPlayer.setDisplay(surfaceHolder);
        mediaPlayer.setDataSource(videoSrc);
        mediaPlayer.setOnTimedTextListener(new MediaPlayer.OnTimedTextListener() {
            @Override
            public void onTimedText(final MediaPlayer mediaPlayer, final TimedText timedText) {
                if (timedText != null) {
                    Log.d("test", "subtitle: " + timedText.getText());
                }
            }
        });

        mediaPlayer.addTimedTextSource(subTitleSrc, MediaPlayer.MEDIA_MIMETYPE_TEXT_SUBRIP);
        mediaPlayer.prepare();
        mediaPlayer.setOnPreparedListener(this);
        mediaPlayer.setAudioStreamType(AudioManager.STREAM_MUSIC);
    } catch (Exception e) {
    }
}

@Override
public void surfaceDestroyed(SurfaceHolder arg0) {
}

@Override
public void onPrepared(MediaPlayer mp) {
    mediaPlayer.start();
}

布局:

<FrameLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:layout_width="match_parent"
android:layout_height="match_parent" >

<SurfaceView
    android:id="@+id/playersurface"
    android:layout_width="match_parent"
    android:layout_height="match_parent"/>

<TextView
    android:layout_gravity="center"
    android:id="@+id/tv_subtitle"
    android:textColor="@android:color/holo_red_dark"
    android:textSize="20sp"
    android:layout_width="match_parent"
    android:layout_height="wrap_content" />

OnTimedTextListener 未被调用。我的 Target SDK 是 22,我的设备是 Android 4.1 以上

我错过了什么吗?

最佳答案

我找到了答案。
信用:Looking for a working example of addTimedTextSource for adding subtitle to a video from an .srt file in Android 4.1

我的代码中缺少 mediaPlayer.selectTrack() 方法。

完整代码如下:

public class MainActivity extends Activity implements SurfaceHolder.Callback, OnPreparedListener{

MediaPlayer mediaPlayer;
SurfaceHolder surfaceHolder;
SurfaceView playerSurfaceView;
TextView tv_subtitle;
String videoSrc = Environment.getExternalStorageDirectory().getPath() + "/video.mp4";
String subTitleSrc = Environment.getExternalStorageDirectory().getPath() + "/sub.srt";

@Override
protected void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.activity_main);
    playerSurfaceView = (SurfaceView)findViewById(R.id.playersurface);
    tv_subtitle = (TextView)findViewById(R.id.tv_subtitle);
    surfaceHolder = playerSurfaceView.getHolder();
    surfaceHolder.addCallback(this);
}

@Override
public void surfaceChanged(SurfaceHolder arg0, int arg1, int arg2, int arg3) {

}


@Override
public void surfaceCreated(SurfaceHolder arg0) {

    try {
        mediaPlayer = new MediaPlayer();
        mediaPlayer.setDisplay(surfaceHolder);
        mediaPlayer.setDataSource(videoSrc);
        mediaPlayer.setOnPreparedListener(this);
        mediaPlayer.prepare();

        mediaPlayer.addTimedTextSource(subTitleSrc, MediaPlayer.MEDIA_MIMETYPE_TEXT_SUBRIP);
        int textTrackIndex = findTrackIndexFor(
                MediaPlayer.TrackInfo.MEDIA_TRACK_TYPE_TIMEDTEXT, mediaPlayer.getTrackInfo());
        if (textTrackIndex >= 0) {
            mediaPlayer.selectTrack(textTrackIndex);
        } else {
            Log.w("test", "Cannot find text track!");
        }

        mediaPlayer.setOnTimedTextListener(new MediaPlayer.OnTimedTextListener() {
            @Override
            public void onTimedText(final MediaPlayer mediaPlayer, final TimedText timedText) {
                if (timedText != null) {
                    Log.d("test", "subtitle: " + timedText.getText());
                }
            }
        });

        mediaPlayer.setAudioStreamType(AudioManager.STREAM_MUSIC);
    } catch (Exception e) {
    }
}

private int findTrackIndexFor(int mediaTrackType, MediaPlayer.TrackInfo[] trackInfo) {
    int index = -1;
    for (int i = 0; i < trackInfo.length; i++) {
        if (trackInfo[i].getTrackType() == mediaTrackType) {
            return i;
        }
    }
    return index;
}

@Override
public void surfaceDestroyed(SurfaceHolder arg0) {
}

@Override
public void onPrepared(MediaPlayer mp) {
    mediaPlayer.start();
}

关于android - MediaPlayer 的字幕功能不工作(SRT 文件),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/31484639/

相关文章:

android - 如何为 android 构建 flutter 应用程序?

android - for循环使用原始音乐数组android

java - 为什么 mediaPlayer.stop();不在这里工作?

java - 无法使用Media Player在android中播放音频

html - HTML5视频是否可以将嵌入在mp4文件中的字幕作为轨道播放?

android - 如何使用 Handheld.PlayFullScreenMovie 统一在移动视频中添加字幕

java - 谷歌地图,基于纬度/经度值绘制标记

安卓源 : How to unpack files and edit source code

ios - 在 iOS 中将字幕嵌入到视频文件中

android - 在 Kotlin 中单击外部时如何关闭 Bottom Sheet fragment ?