2017-03-12 42 views
2

Exoplayerを使用して、バイト配列からオーディオファイルを再生しようとしています。私はByteArrayDataSourceを使用しようとしているが、コンストラクタを呼び出すときにエラーを取得しています:ここでnew ByteArrayDataSource(data); は、私が作ってみたコードは次のとおりです。Exoplayerがバイト配列からオーディオを再生する - ByteArrayDataSource

private void prepareExoPlayerFromByteArray(byte[] data){ 
     exoPlayer = ExoPlayerFactory.newSimpleInstance(this, new DefaultTrackSelector(null), new DefaultLoadControl()); 
     exoPlayer.addListener(eventListener); 


     final ByteArrayDataSource byteArrayDataSource = new ByteArrayDataSource(data); 

     /* 
     DataSpec dataSpec = new DataSpec(byteArrayDataSource.getUri()); 
     try { 
      byteArrayDataSource.open(dataSpec); 
     } catch (IOException e) { 
      e.printStackTrace(); 
     } 
     */ 

     DataSource.Factory factory = new DataSource.Factory() { 
      @Override 
      public DataSource createDataSource() { 
       return byteArrayDataSource; 
      } 
     }; 

     MediaSource audioSource = new ExtractorMediaSource(byteArrayDataSource.getUri(), 
       factory, new DefaultExtractorsFactory(),null,null); 
     exoPlayer.prepare(audioSource); 
    } 

私は取得していますエラーはこれです:

E/ExoPlayerImplInternal: Internal runtime error. 
                       java.lang.NullPointerException 
                        at com.google.android.exoplayer2.util.Assertions.checkNotNull(Assertions.java:107) 
                        at com.google.android.exoplayer2.source.ExtractorMediaPeriod$ExtractingLoadable.<init>(ExtractorMediaPeriod.java:591) 
                        at com.google.android.exoplayer2.source.ExtractorMediaPeriod.startLoading(ExtractorMediaPeriod.java:452) 
                        at com.google.android.exoplayer2.source.ExtractorMediaPeriod.prepare(ExtractorMediaPeriod.java:165) 
                        at com.google.android.exoplayer2.ExoPlayerImplInternal.maybeUpdateLoadingPeriod(ExoPlayerImplInternal.java:1260) 
                        at com.google.android.exoplayer2.ExoPlayerImplInternal.updatePeriods(ExoPlayerImplInternal.java:1102) 
                        at com.google.android.exoplayer2.ExoPlayerImplInternal.doSomeWork(ExoPlayerImplInternal.java:447) 
                        at com.google.android.exoplayer2.ExoPlayerImplInternal.handleMessage(ExoPlayerImplInternal.java:300) 
                        at android.os.Handler.dispatchMessage(Handler.java:98) 
                        at android.os.Looper.loop(Looper.java:234) 
                        at android.os.HandlerThread.run(HandlerThread.java:61) 
                        at com.google.android.exoplayer2.util.PriorityHandlerThread.run(PriorityHandlerThread.java:40) 

エラーは、ByteArrayDataSourceのコンストラクタから来ているようで、渡されたデータがnullであると言っています。これは、呼び出し前にチェックしていないので、その配列に14002427バイトあります。

/** 
    * @param data The data to be read. 
    */ 
    public ByteArrayDataSource(byte[] data) { 
    Assertions.checkNotNull(data); 
    Assertions.checkArgument(data.length > 0); 
    this.data = data; 
    } 

私は間違っていますが、どうすれば回避できますか?誰かがExoplayerでオーディオファイルを再生する作業例がありますか?バイト配列をソースとして渡しますか?

+0

@pskink私はMediaPlayerのを使用しなかった場合でも、あなたが提案した方法は、バイト配列を取ることはありません。無関係なtho、私はExoplayerを使用してこれを行う必要があります。 – ak93

+0

これにはどんな解決策ですか?私はまったく同じ問題に直面しています – Chandru

+0

私の答えはOKの場合は参照してください、次にupvoteしてください。あなたに感謝:) – RaghavPai

答えて

0

byteArrayDataSource.getUriは()あなたが

byteArrayDataSource.open(DataSpec dataSpec)を呼び出すいけない場合は、nullになるだろう。コードを見てください。

public final class ByteArrayDataSource implements DataSource { 

    private final byte[] data; 

    private Uri uri; 
    private int readPosition; 
    private int bytesRemaining; 

    /** 
    * @param data The data to be read. 
    */ 
    public ByteArrayDataSource(byte[] data) { 
    Assertions.checkNotNull(data); 
    Assertions.checkArgument(data.length > 0); 
    this.data = data; 
    } 

    @Override 
    public long open(DataSpec dataSpec) throws IOException { 
    uri = dataSpec.uri; 
    readPosition = (int) dataSpec.position; 
    bytesRemaining = (int) ((dataSpec.length == C.LENGTH_UNSET) 
     ? (data.length - dataSpec.position) : dataSpec.length); 
    if (bytesRemaining <= 0 || readPosition + bytesRemaining > data.length) { 
     throw new IOException("Unsatisfiable range: [" + readPosition + ", " + dataSpec.length 
      + "], length: " + data.length); 
    } 
    return bytesRemaining; 
    } 

    @Override 
    public int read(byte[] buffer, int offset, int readLength) throws IOException { 
    if (readLength == 0) { 
     return 0; 
    } else if (bytesRemaining == 0) { 
     return C.RESULT_END_OF_INPUT; 
    } 

    readLength = Math.min(readLength, bytesRemaining); 
    System.arraycopy(data, readPosition, buffer, offset, readLength); 
    readPosition += readLength; 
    bytesRemaining -= readLength; 
    return readLength; 
    } 

    @Override 
    public Uri getUri() { 
    return uri; 
    } 

    @Override 
    public void close() throws IOException { 
    uri = null; 
    } 

} 
0
class UriByteDataHelper { 


     public Uri getUri(byte[] data) { 

      try { 
       URL url = new URL(null, "bytes:///" + "audio", new BytesHandler(data)); 
       return Uri.parse(url.toURI().toString()); 
      } catch (MalformedURLException e) { 
       throw new RuntimeException(e); 
      } catch (URISyntaxException e) { 
       throw new RuntimeException(e); 
      } 

     } 

     class BytesHandler extends URLStreamHandler { 
      byte[] mData; 
      public BytesHandler(byte[] data) { 
       mData = data; 
      } 

      @Override 
      protected URLConnection openConnection(URL u) throws IOException { 
       return new ByteUrlConnection(u, mData); 
      } 
     } 

     class ByteUrlConnection extends URLConnection { 
      byte[] mData; 
      public ByteUrlConnection(URL url, byte[] data) { 
       super(url); 
       mData = data; 
      } 

      @Override 
      public void connect() throws IOException { 
      } 

      @Override 
      public InputStream getInputStream() throws IOException { 

       return new ByteArrayInputStream(mData); 
      } 
     } 
    } 



    private void prepareExoPlayerFromByteArray(byte[] data){ 
     exoPlayer = ExoPlayerFactory.newSimpleInstance(this, new DefaultTrackSelector(null), new DefaultLoadControl()); 
     exoPlayer.addListener(eventListener); 

     final MByteArrayDataSource byteArrayDataSource = new MByteArrayDataSource(data); 
     Log.i(TAG,"ByteArrayDataSource constructed."); 
     Uri audioByteUri = new UriByteDataHelper().getUri(data); 
     DataSpec dataSpec = new DataSpec(audioByteUri); 
     try { 
      byteArrayDataSource.open(dataSpec); 
     } catch (IOException e) { 
      e.printStackTrace(); 
     } 


     DataSource.Factory factory = new DataSource.Factory() { 
      @Override 
      public DataSource createDataSource() { 
       return byteArrayDataSource; 
      } 
     }; 
     Log.i(TAG,"DataSource.Factory constructed."); 


     MediaSource audioSource = new ExtractorMediaSource(audioByteUri, 
       factory, new DefaultExtractorsFactory(),null,null); 
     Log.i(TAG,"Audio source constructed."); 
     exoPlayer.prepare(audioSource); 
     initMediaControls(); 
    } 
+0

バイト配列から直接オーディオデータを再生するためのUriを作成するために、上記のコードを使用して....私は何か問題を知ってください。 – RaghavPai

関連する問題