Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/android/198.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
带有字幕代码的Android视频流不工作_Android_Video_Video Streaming_Android Mediaplayer_Subtitle - Fatal编程技术网

带有字幕代码的Android视频流不工作

带有字幕代码的Android视频流不工作,android,video,video-streaming,android-mediaplayer,subtitle,Android,Video,Video Streaming,Android Mediaplayer,Subtitle,嗨,我正在使用上面的代码从一个url获取字幕,以便在我在android应用程序中播放的视频中播放。不幸的是,什么也没发生,肥皂水也没有显示在视频播放中 public class VideoPlayerActivity extends Activity implements SurfaceHolder.Callback, MediaPlayer.OnPreparedListener, VideoControllerView.MediaPlayerControl { SurfaceVie

嗨,我正在使用上面的代码从一个url获取字幕,以便在我在android应用程序中播放的视频中播放。不幸的是,什么也没发生,肥皂水也没有显示在视频播放中

 public class VideoPlayerActivity extends Activity implements SurfaceHolder.Callback,     MediaPlayer.OnPreparedListener, VideoControllerView.MediaPlayerControl {

SurfaceView videoSurface;
MediaPlayer player;
VideoControllerView controller;
String subtitleURL = "http://************/mp4/Despicable.Me.2.2013.srt";
private boolean mediaplayer_error_state = false;
private boolean mediaplayer_released = false;
private TimedTextObject srt;
static final int SUBTITLE_DISPLAY_CHECK = 100;

@Override
protected void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.activity_video_player);
    new SubtitleAsyncTask().execute();
    videoSurface = (SurfaceView) findViewById(R.id.videoSurface);
    SurfaceHolder videoHolder = videoSurface.getHolder();
    videoHolder.addCallback(this);
    player = new MediaPlayer();
    controller = new VideoControllerView(this);

    try {
        player.setAudioStreamType(AudioManager.STREAM_MUSIC);
        player.setDataSource(this,    Uri.parse("http://*************/mp4/Despicable.Me.2.2013.mp4"));
        player.setOnPreparedListener(this);
    } catch (IllegalArgumentException e) {
        e.printStackTrace();
    } catch (SecurityException e) {
        e.printStackTrace();
    } catch (IllegalStateException e) {
        e.printStackTrace();
    } catch (IOException e) {
        e.printStackTrace();
    }



}


private Handler subtitleDisplayHandler = new Handler();
private Runnable subtitle = new Runnable() {
 public void run() {
   if (isMediaPlayerStateValid() && player.isPlaying()) {
      int currentPos = player.getCurrentPosition();
      Collection<Caption> subtitles =  srt.captions.values();
      for(Caption caption : subtitles) {
         if (currentPos >= caption.start.getMilliseconds() && currentPos <= caption.end.getMilliseconds()) {
            onTimedText(caption);
            break;
     } else if (currentPos > caption.end.getMilliseconds()) {
        onTimedText(null);
         }
      }
   }
   subtitleDisplayHandler.postDelayed(this, SUBTITLE_DISPLAY_CHECK);
 };
};

protected boolean isMediaPlayerStateValid() {
    if (player != null && mediaplayer_error_state == false
                    && mediaplayer_released == false) {
            return true;
    }
    return false;
}

@Override
public boolean onTouchEvent(MotionEvent event) {
    controller.show();
    return false;
}

// Implement SurfaceHolder.Callback
@Override
public void surfaceChanged(SurfaceHolder holder, int format, int width, int height) {

}

@Override
public void surfaceCreated(SurfaceHolder holder) {
    player.setDisplay(holder);
    player.prepareAsync();
}

@Override
public void surfaceDestroyed(SurfaceHolder holder) {

}
// End SurfaceHolder.Callback

// Implement MediaPlayer.OnPreparedListener
@Override
public void onPrepared(MediaPlayer mp) {
    controller.setMediaPlayer(this);
    controller.setAnchorView((FrameLayout) findViewById(R.id.videoSurfaceContainer));
    player.start();
}
// End MediaPlayer.OnPreparedListener
// Implement VideoMediaController.MediaPlayerControl
@Override
public boolean canPause() {
    return true;
}
@Override
public boolean canSeekBackward() {
    return true;
}
@Override
public boolean canSeekForward() {
    return true;
}

@Override
public int getBufferPercentage() {
    return 0;
}

@Override
public int getCurrentPosition() {
    return player.getCurrentPosition();
}

@Override
public int getDuration() {
    return player.getDuration();
}

@Override
public boolean isPlaying() {
    return player.isPlaying();
}

@Override
public void pause() {
    player.pause();
}

@Override
public void seekTo(int i) {
    player.seekTo(i);
}
@Override
public void start() {
    player.start();
}
@Override
public boolean isFullScreen() {
    return false;
}
@Override
public void toggleFullScreen() {

}
// End VideoMediaController.MediaPlayerControl

public void onTimedText(Caption text) {
       TextView subtitles = (TextView) findViewById(R.id.txtSubtitles);
       if (text == null) {
          subtitles.setVisibility(View.INVISIBLE);
          return;
       }
       subtitles.setText(Html.fromHtml(text.content));
       subtitles.setVisibility(View.VISIBLE);
    }

public class SubtitleAsyncTask extends AsyncTask<Void, Void, Void> {

      @Override
      protected Void doInBackground(Void... params) {
        if (subtitleURL != null) {
           try {
              URL url = new URL(subtitleURL);
              InputStream stream = url.openStream();
              FormatSRT formatSRT = new FormatSRT();

            srt = formatSRT.parseFile(stream);
              subtitleDisplayHandler.post(subtitle);

           } catch (Exception e) {
              Log.e(getClass().getName(), e.getMessage(), e);
           }
        }
        // TODO Auto-generated method stub
        return null;
      }
    }

  }
公共类VideoPlayerActivity扩展活动实现SurfaceHolder.Callback、MediaPlayer.OnPreparedListener、VideoControllerView.MediaPlayerControl{
表面查看视频表面;
媒体播放器;
视频控制器;
String subtitleURL=“http://************/mp4/skipable.Me.2.2013.srt”;
私有布尔mediaplayer_错误_状态=false;
私有布尔mediaplayer_released=false;
私有时间对象srt;
静态最终整型字幕显示检查=100;
@凌驾
创建时受保护的void(Bundle savedInstanceState){
super.onCreate(savedInstanceState);
setContentView(R.layout.activity\u video\u player);
新任务().execute();
videoSurface=(SurfaceView)findViewById(R.id.videoSurface);
SurfaceHolder-videoHolder=videoSurface.getHolder();
videoHolder.addCallback(这个);
player=新媒体播放器();
控制器=新的VideoControllerView(此);
试一试{
player.setAudioStreamType(AudioManager.STREAM_MUSIC);
player.setDataSource(这是Uri.parse(“http://************/mp4/skipable.Me.2.2013.mp4”);
player.setOnPreparedListener(此);
}捕获(IllegalArgumentException e){
e、 printStackTrace();
}捕获(安全异常e){
e、 printStackTrace();
}捕获(非法状态){
e、 printStackTrace();
}捕获(IOE异常){
e、 printStackTrace();
}
}
私有处理程序subtitleDisplayHandler=新处理程序();
private Runnable subtitle=new Runnable(){
公开募捐{
if(isMediaPlayerStateValid()&&player.isPlaying()){
int currentPos=player.getCurrentPosition();
集合字幕=srt.captions.values();
用于(字幕:字幕){
if(currentPos>=caption.start.getmillizes()&¤tPos caption.end.getmillizes()){
onTimedText(空);
}
}
}
subtitleDisplayHandler.postDelayed(这是SUBTITLE\u DISPLAY\u CHECK);
};
};
受保护的布尔值isMediaPlayerStateValid(){
如果(player!=null&&mediaplayer\u错误\u状态==false
&&mediaplayer_发布==错误){
返回true;
}
返回false;
}
@凌驾
公共布尔onTouchEvent(运动事件){
controller.show();
返回false;
}
//实现SurfaceHolder.Callback
@凌驾
公共空白表面更改(表面文件夹持有者、整型格式、整型宽度、整型高度){
}
@凌驾
已创建的公共空白表面(表面持有人){
播放器设置显示器(支架);
player.prepareAsync();
}
@凌驾
公共空间表面覆盖(表面覆盖物持有人){
}
//结束SurfaceHolder.Callback
//实现MediaPlayer.OnPreparedListener
@凌驾
已准备好公开作废(MediaPlayer mp){
控制器.setMediaPlayer(此);
controller.setAnchorView((FrameLayout)findViewById(R.id.videoSurfaceContainer));
player.start();
}
//结束MediaPlayer.OnPreparedListener
//实现VideoMediaController.MediaPlayerControl
@凌驾
公共布尔canPause(){
返回true;
}
@凌驾
公共布尔值canSeekBackward(){
返回true;
}
@凌驾
公共布尔值canSeekForward(){
返回true;
}
@凌驾
public int getBufferPercentage(){
返回0;
}
@凌驾
public int getCurrentPosition(){
返回player.getCurrentPosition();
}
@凌驾
public int getDuration(){
返回player.getDuration();
}
@凌驾
公共布尔值显示(){
返回player.isPlaying();
}
@凌驾
公共空间暂停(){
player.pause();
}
@凌驾
公共空间seekTo(内部一){
球员:希克托(一);
}
@凌驾
公开作废开始(){
player.start();
}
@凌驾
public boolean isFullScreen(){
返回false;
}
@凌驾
公共无效切换全屏(){
}
//结束VideoMediaController.MediaPlayerControl
公共void onTimedText(标题文本){
TextView字幕=(TextView)findViewById(R.id.txtSubtitles);
if(text==null){
字幕。设置可见性(视图。不可见);
返回;
}
subtitles.setText(Html.fromHtml(text.content));
字幕.setVisibility(View.VISIBLE);
}
公共类AsyncTask扩展了AsyncTask{
@凌驾
受保护的Void doInBackground(Void…参数){
如果(URL!=null){
试一试{
URL URL=新URL(URL);
InputStream=url.openStream();
FormatSRT FormatSRT=新FormatSRT();
srt=formatSRT.parseFile(流);
subtitleDisplayHandler.post(subtitle);
}捕获(例外e){
Log.e(getClass().getName(),e.getMessage(),e);
}
}
//TODO自动生成的方法存根
返回null;
}
}
}
我还在使用上面链接中的serenity应用程序中的文件:


有人能帮我做这个项目吗

我有几个问题。1) 你正在试用哪个版本的Android?2) 根据您的代码,我的印象是您正在使用
VideoController
text
曲目播放视频,即使用
MediaPlayer
播放字幕。我的假设正确吗?如果是,您如何在
视频
文本
曲目之间进行同步?3) 为什么不使用一个
MediaPlayer
一起播放
video
text
曲目呢?我想我的应用程序将在2.3及更高版本的android中使用!你能给我一个单一MediaPlayer的例子,以及如何同时播放视频和文本吗?评论晚了,但我不得不添加line=line.replaceAll(“[^\\d]”,“”);在lineCounter++之前;让它工作。trim()函数不够,因为我在formatSRT.java文件中得到了numberformatexception