2017-01-07 4 views
6

ExoPlayer를 사용하여 일부 오디오를 스트리밍하기 시작했습니다. "301 Moved Permanently"리다이렉션이있는 URL을 찾을 때까지 모든 것이 잘되었습니다. ExoPlayer2는 기본적으로이를 처리하지 않습니다.ExoPlayer2 - HTTP 301 리디렉션 작업을 어떻게 만듭니 까?

이미이 스레드를 본 적이

:이 그들이 새로운 "allowCrossDomainRedirects"플래그를 추가하는 말을 https://github.com/google/ExoPlayer/issues/423

에 중 하나 HttpDataSource 또는 UriDataSource. 문제는 내가 그 클래스 중 하나를 사용하지 않는 것이있다 :

//I am NOT using SimpleExoPlayer because I need a different renderer. 
exoPlayer = ExoPlayerFactory.newInstance(renderers, trackSelector, loadControl); 

final DataSource.Factory dataSourceFactory = new DefaultDataSourceFactory(
      context, 
      Util.getUserAgent(context, applicationInfo.getAppName()) 
); 

// Produces Extractor instances for parsing the media data. 
final ExtractorsFactory extractorsFactory = new DefaultExtractorsFactory(); 

// This is the MediaSource representing the media to be played. 
MediaSource mediaSource = new ExtractorMediaSource(
      Uri.parse(media.getUriString()) /* uri */, 
      dataSourceFactory, 
      extractorsFactory, 
      10, 
      null /* eventHandler */, 
      null /* eventListener */); 

exoPlayer.prepare(mediaSource); 

가 ExtractorMediaSource 대신 데이터 소스의 된 DataSourceFactory을 필요로하는 방법을 참조하십시오. 사실 ExoPlayer2에서 HttpDataSource 및 UriDataSource 클래스도 찾을 수 없습니다. 그들이 제거 된 것 같습니다.

따라서 게시물에 언급 된 플래그를 추가하는 방법을 찾을 수 없습니다. 누군가 나를 도울 수 있습니까?

답변

15

문제는 크로스 프로토콜 리디렉션 (http에서 https로 또는 그 반대)에서 설명한 문제가 있습니다. Exoplayer는이를 지원하지만 allowCrossProtocolRedirectstrue으로 설정해야합니다. 일반 리디렉션 (301 리디렉션 포함)은 기본적으로 지원됩니다. 수신중인 리디렉션은 대부분 교차 프로토콜 리디렉션입니다.

DefaultDataSourceFactory(Context context, String userAgent) 

이 생성자는 false-allowCrossProtocolRedirects 세트가있는 DefaultHttpDataSourceFactory를 만듭니다

는 호출하고 데이터 소스를 만듭니다.

DefaultDataSourceFactory(Context context, TransferListener<? super DataSource> listener, 
    DataSource.Factory baseDataSourceFactory) 

을 그리고 baseDataSourceFactorytrue에 자신의 DefaultHttpDataSourceFactoryallowCrossProtocolRedirects 세트를 사용 :

이를 변경하려면 호출해야합니다. 예를 들어

:

String userAgent = Util.getUserAgent(context, applicationInfo.getAppName()); 

// Default parameters, except allowCrossProtocolRedirects is true 
DefaultHttpDataSourceFactory httpDataSourceFactory = new DefaultHttpDataSourceFactory(
    userAgent, 
    null /* listener */, 
    DefaultHttpDataSource.DEFAULT_CONNECT_TIMEOUT_MILLIS, 
    DefaultHttpDataSource.DEFAULT_READ_TIMEOUT_MILLIS, 
    true /* allowCrossProtocolRedirects */ 
); 

DefaultDataSourceFactory dataSourceFactory = new DefaultDataSourceFactory(
    context, 
    null /* listener */, 
    httpDataSourceFactory 
); 

이 더 자주 당신은 또한 도우미 메서드를 만들 수 있습니다 할 필요가있는 경우 :

public static DefaultDataSourceFactory createDataSourceFactory(Context context, 
     String userAgent, TransferListener<? super DataSource> listener) { 
    // Default parameters, except allowCrossProtocolRedirects is true 
    DefaultHttpDataSourceFactory httpDataSourceFactory = new DefaultHttpDataSourceFactory(
     userAgent, 
     listener, 
     DefaultHttpDataSource.DEFAULT_CONNECT_TIMEOUT_MILLIS, 
     DefaultHttpDataSource.DEFAULT_READ_TIMEOUT_MILLIS, 
     true /* allowCrossProtocolRedirects */ 
    ); 

    DefaultDataSourceFactory dataSourceFactory = new DefaultDataSourceFactory(
     context, 
     listener, 
     httpDataSourceFactory 
    ); 

    return dataSourceFactory; 
} 

이 교차 프로토콜을 수는 리디렉션합니다.

시드 : "301 Moved Permanently"은 클라이언트가 URL을 새로운 URL로 업데이트해야한다는 것을 의미합니다. "302 Found"는 일반 리디렉션에 사용됩니다. 가능하면 "301 Moved Permanently"을 반환하는 URL을 업데이트하십시오.

+0

샘플 코드 및 설명 주셔서 감사합니다 - 대단히 감사합니다! – gmcnaughton