如何显示使用srt文件在媒体播放器中播放的歌曲的歌词?

时间:2018-07-11 07:41:59

标签: android android-mediaplayer android-handler srt

我正在开发其他一些开发人员开发的媒体播放器应用程序,其中我需要显示在媒体播放器中播放的歌曲的歌词。我在项目中放置了一个srt文件,歌曲播放正常。我从以下示例创建了一个演示: https://github.com/iTech-Developer/TimedTextTest

我正在为此使用MP3文件。我认为演示使用的是MP4。

我已将此代码集成到我的代码中,如下所示(我在开始和结束处添加了注释,而且由于此方法很大,因此我从此方法中删除了一些额外的代码):

private void playSongWithMediaPLayer(final int position) {
    new Handler().post(new Runnable() {
        @Override
        public void run() {
            setSongData(position);
            if (mediaPlayer != null) {
                mediaPlaying = getIntent().getBooleanExtra("isAlreadyPlaying", true);
                if (!mediaPlaying)
                    mediaPlaying = mediaPlayer.isPlaying();
            }

            if (CallWebService.isNetConnectionAvailable() || Constants.songsInQueue != null) {
                final int duration = mediaPlayer.getDuration();
                seekBar.setMax(duration);
                Log.d("seekpro", "" + spro);
                if (!mediaPlaying) {
                    if (mediaPlayer != null)
                        mediaPlayer.pause();
                    ivPlayStop.setImageDrawable(getResources().getDrawable(R.drawable.home_play_icon));
                } else {
                    if (mediaPlayer != null) {
                        try{

//Code for lyrics start here
if(Constants.songsInQueue.get(intPOsSong).getTitle().toLowerCase().contains("baby")){
                                mediaPlayer.addTimedTextSource(getSubtitleFile(R.raw.babyftludacrislyrics), MediaPlayer.MEDIA_MIMETYPE_TEXT_SUBRIP);
                                int textTrackIndex = findTrackIndexFor(MediaPlayer.TrackInfo.MEDIA_TRACK_TYPE_TIMEDTEXT, mediaPlayer.getTrackInfo());
                                if (textTrackIndex >= 0) {
                                    Log.d("TimedText", "Inside 1");
                                    mediaPlayer.selectTrack(textTrackIndex);
                                    Log.d("TimedText", "Inside 2");
                                } else {
                                    Log.d("TimedText", "Cannot find text track!");
                                }
                                Log.d("TimedText", "Inside 3");
                                mediaPlayer.setOnTimedTextListener(MusicPlayerActivity.this);
                                Log.d("TimedText", "Inside 4");
                            }
                            mediaPlayer.start();
                            Log.d("TimedText", "Inside 5 Media player started");
                        } catch (Exception e) {
                            Log.d("TimedText", "Exception occurred");
                            e.printStackTrace();
                        }
//Ends here
                        //mediaPlayer.start();
                    }

                    ivPlayStop.setImageDrawable(getResources().getDrawable(R.drawable.home_stop_icon));
                }
                mediaPlayer.seekTo(spro);


                seekBar.setOnSeekBarChangeListener(new SeekBar.OnSeekBarChangeListener() {
                    @Override
                    public void onProgressChanged(SeekBar seekBar, int progress, boolean fromUser) {
                        if (mediaPlayer != null && fromUser) {
                            mediaPlayer.seekTo(progress);
                        }
                    }

                    @Override
                    public void onStartTrackingTouch(SeekBar seekBar) {

                        if (mediaPlayer != null)

                            seekBar.setProgress(mediaPlayer.getCurrentPosition());
                    }

                    @Override
                    public void onStopTrackingTouch(SeekBar seekBar) {
                        if (mediaPlayer != null)
                            seekBar.setProgress(mediaPlayer.getCurrentPosition());
                    }
                });


            } else {
                new NoInternetConnectionDialog(MusicPlayerActivity.this) {
                    @Override
                    public void retry() {
                        super.retry();
                        playSong(intPOsSong);
                    }

                    @Override
                    public void cancel() {
                        super.cancel();
                        finish();
                    }
                };
            }
        }
    });
}

其重写方法如下:

 @Override
public void onTimedText(final MediaPlayer mp, final TimedText text) {
    Log.d("TimedText", "The text is " + text.toString());
    if (text != null) {
        Handler shandler = new Handler();
        //Handler sHandler = new Handler(Looper.getMainLooper());
        shandler.post(new Runnable() {
            @Override
            public void run() {
                int seconds = mp.getCurrentPosition() / 1000;

                Log.d("TimedText", "Lyrics - [" + secondsToDuration(seconds) + "] "
                        + text.getText());
            }
        });
    }
}

演示代码在我运行时工作正常。但是,当我运行我的代码时,我添加了日志,我只得到以下日志。

  

D / TimedText:字幕已经存在

     

D / TimedText:内部1

     

D / TimedText:内部2

     

D / TimedText:内部3

     

D / TimedText:内部4

     

D / TimedText:内部5 Media Player启动

从日志中可以看到,重写方法中的代码永远不会执行,因为看不到任何日志。任何人都可以指导我做错了什么,因为除了在媒体播放器上设置定时文本侦听器时传递的上下文外,代码完全符合演示要求。根据我的猜测,问题出在代码的工作过程中,媒体播放器在另一个处理程序中启动,而在重写方法中,正在创建另一个处理程序。

谢谢

0 个答案:

没有答案