2017-11-06 10 views
1

私はconcatenatingMediaSourceを作成しましたが、画像urisをスキップします。 私はexoplayerが画像ファイルをサポートしていないことを知っています。私は画像URIが来て、画像ビューに画像をロードするときにexoplayerを一時停止して隠そうとしています。exoplayerのビデオファイルと画像ファイルのURIを含むConcatenatingMediaSourceを作成するにはどうすればよいですか?

public void loadMediaSources(){ 
      MediaSource[] mediaSourcesToLoad = new MediaSource[stories.size()]; 
      for(int i=0;i<stories.size();i++){ 
       MediaSource mediaSource = new ExtractorMediaSource(Uri.parse(stories.get(i).getVideoUrl()), 
         dataSourceFactory, extractorsFactory, null, null); 
       mediaSourcesToLoad[i] = mediaSource; 
      } 

      mediaSources = new ConcatenatingMediaSource(mediaSourcesToLoad); 

    if(player!=null && mediaSources!=null){ 
      player.prepare(mediaSources); 
     } 
} 

@Override 
public void onPositionDiscontinuity() { 
     exoPlayerView.setVisibility(View.VISIBLE); 
     ivStory.setVisibility(View.VISIBLE); 
     mPosition = player.getCurrentWindowIndex(); 
     Log.d("Position of Video", String.valueOf(mPosition)); 

     if(stories!=null && stories.size()>0 && stories.get(player.getCurrentWindowIndex()).getPhotoUrl()!=null){ 
      viewPhoto(stories.get(player.getCurrentWindowIndex()).getPhotoUrl()); 
     } 
    } 



private void viewPhoto(String url){ 

     Glide.with(this).load(url).listener(new RequestListener<String, GlideDrawable>() { 
      @Override 
      public boolean onException(Exception e, String model, Target<GlideDrawable> target, boolean isFirstResource) { 
       return false; 
      } 

      @Override 
      public boolean onResourceReady(GlideDrawable resource, String model, Target<GlideDrawable> target, boolean isFromMemoryCache, boolean isFirstResource) { 
       stopPlayingVideo(); 
       exoPlayerView.setVisibility(View.INVISIBLE); 
       ivStory.setVisibility(View.VISIBLE); 
       return false; 
      } 
     }).into(ivStory); 

    } 
+0

仲間こんにちは..私を言及してください。私はまた、この解決策を探しています。 plsは私を助けます –

+0

@RanjithKumarここでも問題を追跡できます。 https://github.com/google/ExoPlayer/issues/3434 – androidlab

+0

ありがとうございます。私も解決策を探しています。もし私が見つけたら、私は答えも投稿します。 –

答えて

1

現在、ExoPlayerは画像の再生をサポートしていません。 イメージトラックのために再生するN秒のモノクロームビデオ(例えばffmpegを使用)を生成することができます。

private MediaSource trackToMediaSource(@NonNull Track track) { 
    MediaSource source; 
    Uri trackUri; 
    switch (track.getType()) { 
     case VIDEO: 
      trackUri = Uri.parse(track.getUrl()); 
      ... 
      break; 
     case IMAGE: 
      // Currently images are not supported. We use hardcoded video URL as a workaround. 
      trackUri = Uri.parse("asset:///blue.mp4"); 
      ... 
      break; 
     ... 
    } 
     ... 
    return source; 
} 

FFmpegのコマンド:

ffmpeg -f lavfi -i color=c=#10408c -t 5 blue.mp4 

表示するIm​​ageViewの画像トラックにプレーヤーのスイッチが:あなたはすべてのソリューションを取得する場合

@Override 
public void onPositionDiscontinuity() { 
    int currentTrack = player.getCurrentWindowIndex(); 
    Track track = tracks.get(currentTrack); 
    switch (track.getType()) { 
     case IMAGE: 
      showImageAbovePlayer(track.getUrl()); // blue.mp4 is played for 5 seconds under the image, but user sees only image 
      break; 
     case VIDEO: 
      hideImageAbovePlayer(); // hide image, user sees current video track 
      break; 
    } 
} 
+0

image/imageurlをmediasourceに変換する方法を説明できますか?説明すれば、それは私にとって非常に役立つでしょう。ありがとう。 –

+0

可能であれば、この回答と同じ回答を投稿してください。https://stackoverflow.com/questions/47263105/how-to-convert-the-single-image-to-mp4-video-in-android –

+0

@RanjithKumarあなたdon ' imageUrlからMediaSourceを作成する必要があります。 ExoPlayerにはイメージ再生用のレンダラーがありません。私の考えは、モノクロビデオからMediaSourceを作成し、このモノクロビデオを再生するときにプレーヤーの上にイメージを表示することでした。自分の答えを更新して、画像を表示/非表示できる場所を表示しました。 –