0

我正在开发一个使用 VideoView 播放视频的应用程序。我想要的是我需要在播放视频下方显示一些文本,并且文本应该随着视频播放而更改,我的意思是根据经过的时间。就像 SRT。那么,如何在android中获取视频的经过时间?当我们暂停视频时,文本也应该暂停,然后当我们恢复视频时,应该显示文本和以下文本。

任何帮助,将不胜感激。


@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;
}

谢谢。

4

1 回答 1

3

这不是getCurrentPosition()你要找的 VideoView 吗?

要更改 TextView 的内容(或您想使用的任何内容),我会设置一个计时器,它有足够的频率来更新您的“字幕”。它的 TimerTask 可以通过 getCurrentPosition() 获取播放时间,并使用 Map 存储消息值和时间作为键。

这是我在想的例子:

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

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
    }
}

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

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

创建地图:

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();
            }
        }
    });
}

最后,使用Timer代替它(这里有一篇关于 Timers 和 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();
        }
    }
}

这真是丑陋而低效。

所以,快乐的编码,如果你发现一些错误,请尝试自己解决它,不是因为我不善于提供帮助,而是你提高技能的最佳机会。

问候,曼努埃尔。

于 2011-02-03T11:38:23.217 回答