如何显示在下方的Andr​​oid播放视频的文字?文字、视频、Andr、oid

2023-09-08 09:10:06 作者:_____苏默染°

我正在开发中,我使用VideoView播放视频的应用程序。我想是我需要显示正在播放的视频下面的一些文本和文本应该随我的意思是根据经过时间的视频播放。像SRT。因此,如何获得录像的剩余时间在android系统?而当我们暂停根据视频文字也应被暂停,之后,当我们恢复视频的文本,应显示以下文字。

I am developing an application in which I used VideoView to play a video. What I want is I need to display some text underneath the playing video and the text should be changed as the video plays I mean depending on elapsed time. Like SRT. So, How to get elapsed time of video in android? And when we pause the video according text should be paused as well and after that when we resume video the text and the following text should be displayed.

任何帮助将是AP preciated。

Any help would be appreciated.

@Override
public void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    requestWindowFeature(Window.FEATURE_NO_TITLE);
    getWindow().setFlags(WindowManager.LayoutParams.FLAG_FULLSCREEN, WindowManager.LayoutParams.FLAG_FULLSCREEN);
    setContentView(R.layout.playing);

    mVideoView = (VideoView)findViewById(R.id.VideoView);
    uri = Uri.parse("android.resource://com.abhan.video/" + R.raw.abhan);

    Date dt = new Date();
    mHours = dt.getHours();
    mMinutes = dt.getMinutes();
    mSeconds = dt.getSeconds();
    String curTime = mHours + ":"+ mMinutes + ":" + mSeconds;

    mVideoView.setVideoURI(uri);
    mVideoView.start();

    Runnable runnable = new CountDownRunner();
    myThread= new Thread(runnable);   
    myThread.start();

    mVideoView.setOnPreparedListener(new OnPreparedListener() {
        @Override
        public void onPrepared(MediaPlayer mp) {
            Log.i("TAG", "On Prepared");
        }
    });

    mVideoView.setOnCompletionListener(new MediaPlayer.OnCompletionListener() {
        @Override
        public void onCompletion(MediaPlayer mp) {
        Log.v("TAG", "On Completion");
        myThread.stop();
        Intent i = new Intent(Playing.this, VideoPlay.class);
        startActivity(i);
        finish();
        }
    });
}

class CountDownRunner implements Runnable {
    public void run() {
        while(!Thread.currentThread().isInterrupted()) {
            try {
                doWork();
                Thread.sleep(1000);
            } catch (InterruptedException e) {
                Thread.currentThread().interrupt();
                e.printStackTrace();
            } catch(Exception e) {
                e.printStackTrace();
            }
        }
    }
}

public void doWork() {
    runOnUiThread(new Runnable() {
        public void run()  {
            try {
                mText = (TextView)findViewById(R.id.SetText);
                Date dt = new Date();
                int hours = dt.getHours();
                int minutes = dt.getMinutes();
                int seconds = dt.getSeconds();
                String curTime = hours + ":"+ minutes + ":" + seconds;
                if(minutes == mMinutes && seconds == mSeconds) {
                    mText.setText(getString(R.string.one));
                } else if(minutes == mMinutes && seconds == mSeconds+20) {
                    mText.setText(getString(R.string.two));
                } else if(minutes == mMinutes && seconds == mSeconds+38) {
                    mText.setText(getString(R.string.three));
                } else if(minutes == mMinutes && seconds == mSeconds+47) {
                    mText.setText(getString(R.string.four));
                } else if(minutes == mMinutes+1 && seconds == mSeconds2+2) {
                    mText.setText(getString(R.string.five));
                } else if(minutes == mMinutes+1 && seconds == mSeconds2+22) {
                    mText.setText(getString(R.string.six));
                } else if(minutes == mMinutes+2) {
                    mText.setText(getString(R.string.seven));
                } else if(minutes == mMinutes+2 && seconds == mSeconds2+2) {
                    mText.setText("");
                }
            } catch (Exception e) {
                e.printStackTrace();
            }
        }
    });
}

@Override
public boolean onKeyDown(int keyCode, KeyEvent event) {
    if ((!(android.os.Build.VERSION.SDK_INT > android.os.Build.VERSION_CODES.DONUT) 
            &&keyCode == KeyEvent.KEYCODE_BACK && event.getRepeatCount() == 0))
    {
        onBackPressed();
    }
    return super.onKeyDown(keyCode, event);
}

public void onBackPressed() {
    Intent intent = new Intent(Playing.this, VideoPlay.class);
    intent.setFlags(Intent.FLAG_ACTIVITY_EXCLUDE_FROM_RECENTS);
    startActivity(intent);
    finish();
    return;
}

感谢。

推荐答案

是不是VideoView的 getCurrentPosition()您正在寻找什么?

Isn't it VideoView's getCurrentPosition() what you are looking for?

要改变你的TextView(或任何哟希望使用)的内容,我会设置一个计时器,有足够的frecuency来更新你的字幕。它的TimerTask可以与getCurrentPosition获得播放时间(),并使用地图来存储邮件值和时间的关键。

To change the contents of your TextView (or whatever yo want to use), I would set a Timer, with enough frecuency to update your "subtitle". Its TimerTask could get the playback time with that getCurrentPosition(), and use a Map to store messages values and the time as the key.

这是和例子我想什么:

00 - 视频开始了!结果05 - 有趣的事情发生结果12 - !视频结束

00 - "Video begins!" 05 - "something funny happens" 12 - "Video ends!"

class MySubtitlePoster extends TimerTask{
    private VideoView video;
    private TreeMap <Integer, String> messages; // populate it somewhere

    public MySubtitlePoster(VideoView v) {
        video = v;
    }

    public void run() {
        int videoPos = video.getCurrentPosition();
        String messageToDisplay = messages.floorKey(new Integer(videoPos));
        // If all this is right, now you can get the message and post it, probably using a Handler
    }
}

==========================================

==========================================

看到你的完整code后,我可以给你更详细的提示,但编码的是你的工作,所以...

After seeing your complete code, I can give you more detailed tips, but the coding thing is your job, so...

要创建映射:

messages = new TreeMap();
messages.put(new Integer(0), getString(R.string.one));
messages.put(new Integer(20), getString(R.string.two));
...
messages.put(new Integer(62), getString(R.string.four));

做的工作:

public void doWork(){
    runOnUiThread(new Runnable() {
        public void run() {
            try{
                mText = (TextView)findViewById(R.id.SetText);
                //If it returns  milliseconds, divide by 1000
                int playTime = mVideoView.getCurrentPosition();  
                String textValue = messages.ceilingEntry(new Integer(playtime)).getValue();
                mText.setText(textValue);
            }catch (Exception e) {
                e.printStackTrace();
            }
        }
    });
}

最后,使用定时器的,而不是这个(有文章在这里关于定时器和UI ):

public void run() 
{
    while(!Thread.currentThread().isInterrupted())
    {
        try 
        {
            doWork();
            Thread.sleep(1000);
        }catch (InterruptedException e) 
        {
            Thread.currentThread().interrupt();
            e.printStackTrace();
        }catch(Exception e)
        {
            e.printStackTrace();
        }
    }
}

这实在是丑陋和低效的。

It is really ugly and inefficient .

所以,快乐编码,并请,如果你发现一些inccurancy尝试自行解决它,而不是因为我不是那种帮助,但它是提高你的技能,你最好的机会。

So, happy coding, and please if you find some inccurancy try to solve it yourself, not because I'm not kind on helping, but it's your best chance to improve your skills.

问候,曼努埃尔。