在我的Android应用程序中,它需要播放从其他应用程序接收到的视频流。视频流以字节数组格式接收。我正在使用 androidx.media3.exoplayer 进行视频播放。我搜索了很多将字节数组数据流式传输到 Exo 播放器的示例代码,但我找不到任何解决方案。下面的方法用于设置字节数组数据给播放器,
@OptIn(UnstableApi::class)
private suspend fun prepareExoPlayerFromByteArray(data: ByteArray) {
if(data.isNotEmpty()) {
Log.d(TAG, ">> Data is not empty $data")
val extractorFactory = ExtractorsFactory { arrayOf(Ac3Extractor()) }
val dsf = CustomDataSourceFactory(data)
dsf.createDataSource()
val mediasourceFactory = ProgressiveMediaSource.Factory(dsf,
extractorFactory
)
withContext(Dispatchers.Main) {
exoPlayer = ExoPlayer.Builder(this@MainActivity, mediasourceFactory).build()
exoPlayer!!.setMediaItem(MediaItem.fromUri(Uri.EMPTY))
// Prepare the player.
exoPlayer!!.prepare()
// Start the playback.
exoPlayer!!.play()
}
} else {
Log.d(TAG, ">> Data is empty $data")
}
}
我的目的是仅初始化 Exo-player 的实例一次,之后必须在接收时将字节数组数据设置给播放器。上面的代码崩溃了,
播放错误 androidx.media3.exoplayer.ExoPlaybackException:源错误 androidx.media3.exoplayer.ExoPlayerImplInternal.handleIoException(ExoPlayerImplInternal.java:701) androidx.media3.exoplayer.ExoPlayerImplInternal.handleMessage(ExoPlayerImplInternal.java:671) 在 android.os.Handler.dispatchMessage(Handler.java:102) 在 android.os.Looper.loopOnce(Looper.java:201) 在 android.os.Looper.loop(Looper.java:288) 在 android.os.HandlerThread.run(HandlerThread.java:67) 引起原因:androidx.media3.common.ParserException:在准备完成之前加载已完成。{contentIsMalformed=true,dataType=1} 在 androidx.media3.exoplayer.source.ProgressiveMediaPeriod.maybeThrowPrepareError(ProgressiveMediaPeriod.java:247) 在 androidx.media3.exoplayer.source.MaskingMediaPeriod.maybeThrowPrepareError(MaskingMediaPeriod.java:157) 在 androidx.media3.exoplayer.ExoPlayerImplInternal.doSomeWork(ExoPlayerImplInternal.java:1096)
如果有人知道将自定义数据源设置到 Exo-player 的正确解决方案,请分享确切的源代码...
我试图在这里插入代码,但我不知道为什么要插入这个问题。我附上了一张 Google 表格,请在这里找到您的答案。谢谢
https://docs.google.com/document/d/1Bnsm3AnAyQaIsHMJpgRvTcu-oRJUBigIpB2wpISYQgs/edit?usp=sharing