2016-05-25 9 views
0

mit der Position 0 fortzufahren. Der Chromecast Remote Player versucht, bei Verwendung des nanohttpd-Servers an der Suchposition 0 fortzusetzen. Hauptproblem bekommen, wenn ich in den Videoplayer in Gerät suchen, funktioniert es gut, aber auf TV-Suchleiste auf 0 Position und Musik stat am Anfang eingestellt.Chromcast RemotePlayer versucht, bei der Verwendung von nanohttpd

Wann mRemoteMediaPlayer.seek() in onSeekChanged() aufgerufen werden Ergebnis Erfolg, aber in TV-Suchleiste auf 0 Position und Musik stat am Anfang eingestellt.

public class webserver extends NanoHTTPD { 
     FileInputStream fileInputStream; 
     public webserver(){ 
       super(8080); 
     } 
     @Override 
     public Response serve(String uri, Method method, Map<String, String> header,Map<String, String> parameters, Map<String, String> files) { 
      String mediasend=" "; 
      long size=0; 
      FileInputStream fis = null; 
      try { 
       fis = new FileInputStream(path); 
       //byte[] buffer = new byte[(int) fis.getChannel().size()]; 
       size=fis.getChannel().size(); 

      } catch (Exception e) { 
        e.printStackTrace(); 
     } 


     switch(mediatype){ 
      case "photo": 
      mediasend="image/jpeg"; 
      break; 
      case "audio": 
      mediasend="audio/mp3"; 
      break; 
      case "video": 
      mediasend="video/mp4"; 
      break; 
     } 

     return new NanoHTTPD.Response(com.castoffline.castActivity.NanoHTTPD.Response.Status.OK,mediasend,fis,size); 
     } 
    } 

Cast Verbindungscode

Cast.CastApi.launchApplication(mApiClient,getString(R.string.app_id),false).setResultCallback(new ResultCallback<Cast.ApplicationConnectionResult>() { 
        @Override 
        public void onResult(ApplicationConnectionResult result) { 
        Status status = result.getStatus(); 
        if (status.isSuccess()) { 
         ApplicationMetadata applicationMetadata = result.getApplicationMetadata(); 
         mSessionId = result.getSessionId(); 
         String applicationStatus = result.getApplicationStatus(); 
         boolean wasLaunched = result.getWasLaunched(); 
         Log.d(TAG,"application name: "+ applicationMetadata.getName()+ ", status: "+ applicationStatus+ ", sessionId: "+ mSessionId+ ", wasLaunched: "+ wasLaunched); 
         mApplicationStarted = true; 
         mRemoteMediaPlayer = new RemoteMediaPlayer(); 
         /* 
         * Identify the mediatype and send the metadata details to media info  
         */ 
         switch(mediatype) 
         { 
          case "audio" : mediaMetadata = new MediaMetadata(MediaMetadata.MEDIA_TYPE_MUSIC_TRACK); 
              mediaMetadata.putString(MediaMetadata.KEY_TITLE, "MY MUSIC TRACK"+": "+audioTitle); 
              mediaMetadata.putString(MediaMetadata.KEY_ARTIST,audioArtist); 
              mediaMetadata.addImage(new WebImage(Uri.parse("https://www.googledrive.com/host/0B61ekPEN_94sZ21mcnQtbVU2RHM/media.png"))); 
              mediaInfo = new MediaInfo.Builder(ipdevice).setContentType(mimetype).setStreamType(MediaInfo.STREAM_TYPE_BUFFERED).setMetadata(mediaMetadata).build(); 
          break; 
          case "video" : mediaMetadata = new MediaMetadata(MediaMetadata.MEDIA_TYPE_MOVIE); 
              mediaMetadata.addImage(new WebImage(Uri.parse("https://www.googledrive.com/host/0B61ekPEN_94sZ21mcnQtbVU2RHM/film_reel.png"))); 
              mediaMetadata.putString(MediaMetadata.KEY_TITLE, "My MOVIE"+": "+videoTitle); 
              mediaInfo = new MediaInfo.Builder(ipdevice).setContentType(mimetype).setStreamType(MediaInfo.STREAM_TYPE_BUFFERED).setMetadata(mediaMetadata).build(); 
          break; 
          case "photo" : mediaMetadata = new MediaMetadata(MediaMetadata.MEDIA_TYPE_PHOTO); 
              mediaMetadata.putString(MediaMetadata.KEY_TITLE, "My PHOTO"+": "); 
              mediaInfo = new MediaInfo.Builder(ipdevice).setContentType(mimetype).setStreamType(MediaInfo.STREAM_TYPE_BUFFERED).setMetadata(mediaMetadata).build(); 
          break; 
          default: 
         } 
         try { 
           Cast.CastApi.setMessageReceivedCallbacks(mApiClient,mRemoteMediaPlayer.getNamespace(), mRemoteMediaPlayer); 
          } catch (IOException e) { 
               Log.d(TAG, "Exception while creating media channel", e); 
          } 
         try { 

           mRemoteMediaPlayer.load(mApiClient, mediaInfo, false,0).setResultCallback(new ResultCallback<RemoteMediaPlayer.MediaChannelResult>() { 
           @Override 
           public void onResult(MediaChannelResult result) { 
            if (result.getStatus().isSuccess()) { 
                 Log.d(TAG, "Media loaded successfully"); 
            } 
           }}); 
           /* 
           * checks if the video is playing or if it is paused and according it will be played/paused in the receiver 
           */ 
           videoview.setPlayPauseListener(new CustomVideoView.PlayPauseListener() { 
           AudioManager amanager=(AudioManager)getSystemService(Context.AUDIO_SERVICE); 
           @Override 
           public void onPlay() { 
            playbackPaused=false; //videoView is playing 
            if(mSelectedDevice!=null && mApiClient != null && mRemoteMediaPlayer != null){ 
             //volume is set to mute if media is casting in Chromecast 
             amanager.setStreamMute(AudioManager.STREAM_MUSIC, true); 
             sendMediaControl(playbackPaused,false); 
            }else{ 
              amanager.setStreamVolume(AudioManager.STREAM_MUSIC, 3,1); 
              } 

           } 
           @Override 
           public void onPause(){ 
            playbackPaused=true; //videoView is paused 
            if (mSelectedDevice != null && mApiClient != null && mRemoteMediaPlayer != null){ 
             amanager.setStreamMute(AudioManager.STREAM_MUSIC, false); 
             sendMediaControl(playbackPaused,false); 
            }else{ 
             amanager.setStreamVolume(AudioManager.STREAM_MUSIC, 3,1); } 
           } 
           /* Currently Seek function is not working for the media playback while casting 
            * (non-Javadoc) 
            * @see com.castoffline.castActivity.CustomVideoView.PlayPauseListener#onSeekChanged(int) 
            */ 


           @Override 
           public void onSeekChanged(int pos){ 
            Log.d(String.valueOf(videoview.getCurrentPosition()),"seekinsie"); 
            // seek(videoview.getCurrentPosition()); 

            Log.d("mimetype ",mimetype); 

            Log.d("seek1",""+pos); 

            if (mSelectedDevice != null && mApiClient != null && mRemoteMediaPlayer != null){ 

             videoview.pause(); 
             final long position=videoview.getCurrentPosition(); 
             Log.d("seek",""+position); 


             mRemoteMediaPlayer.seek(mApiClient,position,RemoteMediaPlayer.RESUME_STATE_UNCHANGED).setResultCallback(new ResultCallback<RemoteMediaPlayer.MediaChannelResult>(){ 
              @Override 
              public void onResult(MediaChannelResult result) { 
               if (result.getStatus().isSuccess()) { 
                Log.d(String.valueOf("State Code "+result.getStatus().getStatusCode()),""+mRemoteMediaPlayer.getApproximateStreamPosition()); 

               } 
              } 
             }); 
             mRemoteMediaPlayer.setOnStatusUpdatedListener(new RemoteMediaPlayer.OnStatusUpdatedListener(){ 
              @Override 
              public void onStatusUpdated() { 
               @SuppressWarnings("unused") 
               MediaStatus mediaStatus = mRemoteMediaPlayer.getMediaStatus(); 
               Log.d("seek state update",""+mediaStatus); 

              } 
             }); 
            } 


           } 
          }); 
         } catch (IllegalStateException e) { 
           Log.d(TAG, "Problem occurred with media during loading", e); 
       } catch (Exception e) { 
           Log.d(TAG, "Problem opening media during loading", e);} 
     } else { 
        Log.e(TAG,"application could not launch"); 
        teardown(); 
       } 
    } 
}); 
} 

Remote-Player-Steuercode.

private void sendMediaControl(final boolean playbackPaused,final boolean change) 
{ 
    if (mApiClient != null && mRemoteMediaPlayer != null){ 
     mRemoteMediaPlayer.requestStatus(mApiClient).setResultCallback(new ResultCallback<RemoteMediaPlayer.MediaChannelResult>() { 
     @Override 
     public void onResult(RemoteMediaPlayer.MediaChannelResult mediaChannelResult) { 

       if(playbackPaused ==true){ 
        mRemoteMediaPlayer.pause(mApiClient); 
       }else{ 
        mRemoteMediaPlayer.play(mApiClient); 

       }    
     } 
    }); 
    } 
} 

Antwort

0

Es kann hier zwei Dinge sein:

  1. Ich weiß nicht, ob es eine Beschränkung von nanohttpd oder ein Konfigurationsproblem ist aber, was Sie sehen, ist, weil die nanaohttpd (zumindest die wie Sie es konfiguriert haben) unterstützt die Suche nicht. Wenn Sie eine Suche durchführen, ruft Ihr Empfänger Ihren http-Server (in diesem Fall nanohttpd) an und übergibt eine Position und fordert den Webserver auf, diese Position zu suchen und von dort aus zu streamen. Wenn der Webserver dies nicht unterstützt, können Sie nicht erfolgreich suchen. Stellen Sie als Test einen Apache-Server auf Ihrem Laptop nur zum Testen ein und zeigen Sie auf diesen statt auf den eingebetteten Webserver, um zu sehen, ob das funktioniert oder nicht.
  2. Es kann zu einer Abweichung zwischen den Positionseinheiten kommen; Wenn also beispielsweise Ihr lokaler Player Sekunden verwendet und 60 Minuten meldet, wenn es eine Minute im Inhalt ist, und wenn Sie das an den Besetzungsempfänger senden, wird dies als 60 Millisekunden interpretiert, was praktisch gleich 0 Sekunden ist , also schau es dir auch an.
+0

Könnte sein, dass nanaohttpd Suche nicht unterstützt. Sie haben eine andere Möglichkeit, lokale mobile Songs auf Chrome-Cast mit Suchfunktion unterstützt zu spielen? – kishan