Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Decoder init failed #1365

Open
zebraoo opened this issue May 11, 2024 · 0 comments
Open

Decoder init failed #1365

zebraoo opened this issue May 11, 2024 · 0 comments

Comments

@zebraoo
Copy link

zebraoo commented May 11, 2024

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

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment
Projects
None yet
Development

No branches or pull requests

2 participants