Android MediaPlayer';s字幕功能不工作(SRT文件)

Android MediaPlayer';s字幕功能不工作(SRT文件),android,media-player,subtitle,Android,Media Player,Subtitle,我正在尝试显示.srt文件中的字幕。(适用于Android 4.1+) 设备中同时存在mp4文件和srt文件 public class MainActivity extends Activity implements SurfaceHolder.Callback, OnPreparedListener{ MediaPlayer mediaPlayer; SurfaceHolder surfaceHolder; SurfaceView playerSurfaceView; TextView tv

我正在尝试显示.srt文件中的字幕。(适用于Android 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。我的目标SDK是22,我的设备高于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();
}
公共类MainActivity扩展活动实现SurfaceHolder.Callback,OnPreparedListener{
媒体播放器;
浮雕浮雕;
SurfaceView播放器SurfaceView;
TextView电视字幕;
字符串videoSrc=Environment.getExternalStorageDirectory().getPath()+“/video.mp4”;
字符串subTitleSrc=Environment.getExternalStorageDirectory().getPath()+“/sub.srt”;
@凌驾
创建时受保护的void(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);
}
@凌驾
公共无效表面更改(表面更改arg0、int arg1、int arg2、int arg3){
}
@凌驾
已创建公共空白表面(表面文件夹arg0){
试一试{
mediaPlayer=新的mediaPlayer();
mediaPlayer.setDisplay(surfaceHolder);
mediaPlayer.setDataSource(videoSrc);
mediaPlayer.setOnPreparedListener(这个);
mediaPlayer.prepare();
mediaPlayer.addTimedTextSource(subTitleSrc,mediaPlayer.MEDIA\u MIMETYPE\u TEXT\u SUBRIP);
int textTrackIndex=findTrackIndexFor(
MediaPlayer.TrackInfo.MEDIA_TRACK_TYPE_TIMEDTEXT,MediaPlayer.getTrackInfo());
如果(textTrackIndex>=0){
mediaPlayer。选择Track(textTrackIndex);
}否则{
Log.w(“测试”,“找不到文本跟踪!”);
}
setOnTimedTextListener(新的mediaPlayer.OnTimedTextListener(){
@凌驾
public void onTimedText(final MediaPlayer MediaPlayer,final TimedText TimedText){
if(timedText!=null){
Log.d(“test”,“subtitle:+timedText.getText());
}
}
});
mediaPlayer.setAudioStreamType(AudioManager.STREAM_MUSIC);
}捕获(例外e){
}
}
私有int-findTrackIndexFor(int-mediaTrackType,MediaPlayer.TrackInfo[]TrackInfo){
int指数=-1;
对于(int i=0;i

}

同样的问题E/Vitamio[4.2.1][Player]﹕ 本子标题无解码器0x53526970 E/Vitamio[4.2.1][Player]﹕ 未找到字幕数据