androidx / androidx/media

Decoder init failed

Open
#1,365 1 comment 0 reactions 1 assignee View on GitHub

@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

Open the contributing guide

First steps

  1. Read the whole issue, then the project's contributing guide.
  2. Comment on the issue to say you are picking it up — it saves two people doing the same work.
  3. Fork the repository and make your change on a branch.
  4. Open a pull request that references the issue number.

Assessment

This issue has not been assessed yet.

Get new issues in your inbox

A short digest of beginner-friendly GitHub issues.