2016-05-25 50 views
0

Chromcast當使用nanohttpd服務器時,遠程播放器在尋找位置0尋求恢復。當我在設備中尋找視頻播放器時,主要問題是它的工作正常,但在電視上的seek-bar設置在0位置並且開始時是音樂統計。Chromcast Remoteplayer在使用nanohttpd時尋求恢復尋找0位置

何時調用onSeekChanged()中的mRemoteMediaPlayer.seek()獲取結果成功,但在電視上將seek-bar設置爲0位置並在開始時設置音樂屬性。

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

遠程播放控制代碼。

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

       }    
     } 
    }); 
    } 
} 

回答

0

可以有此兩件事情:

  1. 我不知道這是否是nanohttpd或配置問題,但你所看到的限制是因爲nanaohttpd(至少你配置它的方式)不支持seek。當你進行尋找時,你的接收器會調用你的http服務器(在這種情況下是nanohttpd)並傳遞一個位置,並要求Web服務器尋找那個位置並從那裏開始流式傳輸。如果Web服務器不支持,則無法成功搜索。作爲測試,在您的筆記本電腦上設置一個Apache服務器,僅用於測試,並指出該服務器而不是您的嵌入式Web服務器,然後查看是否有效。
  2. 位置單元之間可能存在不匹配;因此,如果您的本地播放器正在使用秒數,並在報告內容爲60分鐘時報告內容,並且如果您將其發送給演員接收器,則它將被解釋爲60毫秒,實際上與0秒相同,請檢查一下。
+0

可能是nanaohttpd不支持seek。在支持查找功能的Chrome上播放本地移動歌曲有什麼其他方法? – kishan