Decoder init failed
Open
@microkatz is already working on this.
Since May 16, 2024.
needs triage
question
- Dominant language
- Java
- Stars
- 3k
- Forks
- 955
- Avg merge
- 12d 14h
- Merged PRs (30d)
- 2
Description
Video codec error
androidx.media3.exoplayer.mediacodec.MediaCodecRenderer$DecoderInitializationException: Decoder init failed: OMX.rk.video_decoder.avc, Format(1, null, null, video/avc, avc1.640020, -1, null, [720, 1280, 25.0, ColorInfo(BT709, Limited range, SDR SMPTE 170M, false, 8bit Luma, 8bit Chroma)], [-1, -1])
at androidx.media3.exoplayer.mediacodec.MediaCodecRenderer.maybeInitCodecWithFallback(MediaCodecRenderer.java:1114)
at androidx.media3.exoplayer.mediacodec.MediaCodecRenderer.maybeInitCodecOrBypass(MediaCodecRenderer.java:551)
at androidx.media3.exoplayer.mediacodec.MediaCodecRenderer.reinitializeCodec(MediaCodecRenderer.java:2272)
at androidx.media3.exoplayer.mediacodec.MediaCodecRenderer.drainAndReinitializeCodec(MediaCodecRenderer.java:1909)
at androidx.media3.exoplayer.mediacodec.MediaCodecRenderer.onInputFormatChanged(MediaCodecRenderer.java:1590)
at androidx.media3.exoplayer.video.MediaCodecVideoRenderer.onInputFormatChanged(MediaCodecVideoRenderer.java:1150)
at androidx.media3.exoplayer.mediacodec.MediaCodecRenderer.readSourceOmittingSampleData(MediaCodecRenderer.java:994)
at androidx.media3.exoplayer.mediacodec.MediaCodecRenderer.render(MediaCodecRenderer.java:814)
at androidx.media3.exoplayer.video.MediaCodecVideoRenderer.render(MediaCodecVideoRenderer.java:940)
at androidx.media3.exoplayer.ExoPlayerImplInternal.doSomeWork(ExoPlayerImplInternal.java:1112)
at androidx.media3.exoplayer.ExoPlayerImplInternal.handleMessage(ExoPlayerImplInternal.java:544)
at android.os.Handler.dispatchMessage(Handler.java:98)
at android.os.Looper.loop(Looper.java:154)
at android.os.HandlerThread.run(HandlerThread.java:61)
Caused by: java.lang.IllegalArgumentException: start failed
at android.media.MediaCodec.native_start(Native Method)
at android.media.MediaCodec.start(MediaCodec.java:1991)
at androidx.media3.exoplayer.mediacodec.SynchronousMediaCodecAdapter$Factory.createAdapter(SynchronousMediaCodecAdapter.java:60)
at androidx.media3.exoplayer.mediacodec.DefaultMediaCodecAdapterFactory.createAdapter(DefaultMediaCodecAdapterFactory.java:139)
at androidx.media3.exoplayer.mediacodec.MediaCodecRenderer.initCodec(MediaCodecRenderer.java:1195)
at androidx.media3.exoplayer.mediacodec.MediaCodecRenderer.maybeInitCodecWithFallback(MediaCodecRenderer.java:1103)
at androidx.media3.exoplayer.mediacodec.MediaCodecRenderer.maybeInitCodecOrBypass(MediaCodecRenderer.java:551)
at androidx.media3.exoplayer.mediacodec.MediaCodecRenderer.reinitializeCodec(MediaCodecRenderer.java:2272)
at androidx.media3.exoplayer.mediacodec.MediaCodecRenderer.drainAndReinitializeCodec(MediaCodecRenderer.java:1909)
at androidx.media3.exoplayer.mediacodec.MediaCodecRenderer.onInputFormatChanged(MediaCodecRenderer.java:1590)
at androidx.media3.exoplayer.video.MediaCodecVideoRenderer.onInputFormatChanged(MediaCodecVideoRenderer.java:1150)
at androidx.media3.exoplayer.mediacodec.MediaCodecRenderer.readSourceOmittingSampleData(MediaCodecRenderer.java:994)
at androidx.media3.exoplayer.mediacodec.MediaCodecRenderer.render(MediaCodecRenderer.java:814)
at androidx.media3.exoplayer.video.MediaCodecVideoRenderer.render(MediaCodecVideoRenderer.java:940)
at androidx.media3.exoplayer.ExoPlayerImplInternal.doSomeWork(ExoPlayerImplInternal.java:1112)
at androidx.media3.exoplayer.ExoPlayerImplInternal.handleMessage(ExoPlayerImplInternal.java:544)
at android.os.Handler.dispatchMessage(Handler.java:98)
at android.os.Looper.loop(Looper.java:154)
at android.os.HandlerThread.run(HandlerThread.java:61)
class BannerAdapter(
private val context: Context,
private val list: List<BannerData>,
private val playerListener: Player.Listener
) : RecyclerView.Adapter<RecyclerView.ViewHolder>() {
companion object {
const val TYPE_ITEM_IMAGE = 0
const val TYPE_ITEM_VIDEO = 1
}
override fun onViewRecycled(holder: RecyclerView.ViewHolder) {
super.onViewRecycled(holder)
if (holder is VideoViewHolder) {
holder.binding.playView.player?.apply {
playWhenReady = false
removeListener(playerListener)
clearVideoSurface()
PlayerPool.INSTANCE.release(this)
Log.e("", "ExoPlayerImpl onViewRecycled ${holder.binding.playView.player}")
}
holder.binding.playView.player = null
}
}
@OptIn(UnstableApi::class)
override fun onViewDetachedFromWindow(holder: RecyclerView.ViewHolder) {
super.onViewDetachedFromWindow(holder)
if (holder is VideoViewHolder) {
holder.binding.playView.player?.apply {
playWhenReady = false
}
Log.e("", "ExoPlayerImpl onViewDetachedFromWindow ${holder.binding.playView.player}")
}
}
override fun onViewAttachedToWindow(holder: RecyclerView.ViewHolder) {
super.onViewAttachedToWindow(holder)
if (holder is VideoViewHolder) {
holder.binding.playView.player?.apply {
addListener(playerListener)
prepare()
}
}
}
override fun onCreateViewHolder(parent: ViewGroup, viewType: Int): RecyclerView.ViewHolder {
val layoutInflater = LayoutInflater.from(parent.context)
val layoutParams = ViewGroup.LayoutParams(
ViewGroup.LayoutParams.MATCH_PARENT, ViewGroup.LayoutParams.MATCH_PARENT
)
return when (viewType) {
TYPE_ITEM_IMAGE -> {
val itemImageBinding = ItemImageBinding.inflate(layoutInflater, parent, false)
ImageViewHolder(itemImageBinding)
}
TYPE_ITEM_VIDEO -> {
val itemVideoBinding = ItemVideoBinding.inflate(layoutInflater, parent, false)
VideoViewHolder(
context, itemVideoBinding
)
}
else -> throw IllegalArgumentException("Invalid view type: $viewType")
}.apply {
itemView.layoutParams = layoutParams
}
}
override fun onBindViewHolder(holder: RecyclerView.ViewHolder, position: Int) {
when (holder.itemViewType) {
TYPE_ITEM_IMAGE -> (holder as ImageViewHolder).bind(
list[position]
)
TYPE_ITEM_VIDEO -> {
val videoHolder = holder as VideoViewHolder
videoHolder.bind(list[position])
}
}
}
override fun getItemViewType(position: Int): Int {
return list[position].type
}
override fun getItemCount(): Int {
return list.size
}
class ImageViewHolder(private val binding: ItemImageBinding) :
RecyclerView.ViewHolder(binding.root) {
fun bind(item: BannerData) {
binding.bannerImageView.load(item.url)
}
}
@OptIn(UnstableApi::class)
class VideoViewHolder(
private val context: Context,
val binding: ItemVideoBinding,
) : RecyclerView.ViewHolder(binding.root) {
fun bind(item: BannerData) {
val player = PlayerPool.INSTANCE.acquire(context).apply {
Log.e("", "ExoPlayerImpl bind $this")
this as ExoPlayer
val mediaSource = DataSourceHolder.getMediaSourceFactory(context)
.createMediaSource(MediaItem.fromUri(item.url))
setMediaSource(mediaSource)
prepare()
}
binding.playView.player = player
}
}
}
enum class PlayerPool {
INSTANCE;
companion object {
const val MAX_SIZE = 2
}
private val exoPlayers = LinkedList<Player>()
private val lock = ReentrantLock()
@OptIn(UnstableApi::class)
fun acquire(context: Context): Player {
lock.withLock {
val iterator = exoPlayers.iterator()
while (iterator.hasNext()) {
val exoplayer = iterator.next()
iterator.remove()
return exoplayer
}
val renderersFactory = DefaultRenderersFactory(context)
renderersFactory.setExtensionRendererMode(DefaultRenderersFactory.EXTENSION_RENDERER_MODE_PREFER) // 选择扩展编码器
renderersFactory.setEnableDecoderFallback(true)
val trackSelector = DefaultTrackSelector(context)
val parametersBuilder: DefaultTrackSelector.Parameters.Builder =
trackSelector.buildUponParameters()
parametersBuilder.setRendererDisabled(C.TRACK_TYPE_AUDIO, true)
trackSelector.setParameters(parametersBuilder) // 去掉音轨
return ExoPlayer.Builder(context, renderersFactory).setTrackSelector(trackSelector)
.build()
}
}
fun release(exoPlayer: Player) {
lock.withLock {
Log.e("", "ExoPlayerImpl exoPlayers.size ${exoPlayers.size}")
if (exoPlayers.size > MAX_SIZE) {
val exoPlayerTemp = exoPlayers.remove()
exoPlayerTemp.release()
}
exoPlayers.add(exoPlayer)
}
}
fun releaseAllPlayers() {
lock.withLock {
val iterator = exoPlayers.iterator()
while (iterator.hasNext()) {
val exoplayer = iterator.next()
iterator.remove()
exoplayer.release()
}
}
}
}
After running for a period of time, this error will appear,
What should I do? Thank you
Contributor guide
First steps
- Read the whole issue, then the project's contributing guide.
- Comment on the issue to say you are picking it up — it saves two people doing the same work.
- Fork the repository and make your change on a branch.
- Open a pull request that references the issue number.
Assessment
This issue has not been assessed yet.