Skip to content

Commit

Permalink
seekto 循坏无法设置成功后,改为重新播放
Browse files Browse the repository at this point in the history
  • Loading branch information
zengjiale2 committed Sep 2, 2024
1 parent 6b61ea0 commit 2691f1c
Showing 1 changed file with 31 additions and 9 deletions.
40 changes: 31 additions & 9 deletions yyevac/src/main/java/com/yy/yyeva/decoder/EvaHardDecoder.kt
Original file line number Diff line number Diff line change
@@ -1,7 +1,11 @@
package com.yy.yyeva.decoder

import android.graphics.*
import android.media.*
import android.graphics.Bitmap
import android.graphics.SurfaceTexture
import android.media.MediaCodec
import android.media.MediaCodecInfo
import android.media.MediaExtractor
import android.media.MediaFormat
import android.opengl.GLES20
import android.os.Build
import android.view.Surface
Expand Down Expand Up @@ -40,6 +44,7 @@ class EvaHardDecoder(playerEva: EvaAnimPlayer) : Decoder(playerEva), SurfaceText
private var isPause = false
private var retryCount = 0 //初始化失败重试次数
private val lock = Object() //用于暂停和帧抽取速度调整
private var evaFileContainer: IEvaFileContainer? = null

override fun prepareToPlay(evaFileContainer: IEvaFileContainer) {
ELog.i(TAG, "prepareToPlay")
Expand Down Expand Up @@ -132,6 +137,7 @@ class EvaHardDecoder(playerEva: EvaAnimPlayer) : Decoder(playerEva), SurfaceText
}

private fun startPlay(evaFileContainer: IEvaFileContainer) {
this.evaFileContainer = evaFileContainer
var extractor: MediaExtractor? = null
var decoder: MediaCodec? = null
var format: MediaFormat? = null
Expand Down Expand Up @@ -391,13 +397,28 @@ class EvaHardDecoder(playerEva: EvaAnimPlayer) : Decoder(playerEva), SurfaceText
ELog.d(TAG, "Reached EOD, looping")
playerEva.pluginManager.onLoopStart()
extractor.seekTo(0, MediaExtractor.SEEK_TO_CLOSEST_SYNC)
inputDone = false
decoder.flush()
speedControlUtil.reset()
frameIndex = 0
isLoop = true
onVideoRestart()
onVideoStart(true)
val presentationTimeUs = extractor.sampleTime
if (presentationTimeUs == -1L) {
ELog.i(
TAG,
"Reached EOD, presentationTimeUs $presentationTimeUs"
)
decoder.apply {
stop()
release()
}
extractor.release()
startPlay(evaFileContainer!!)
break
} else {
inputDone = false
decoder.flush()
speedControlUtil.reset()
frameIndex = 0
isLoop = true
onVideoRestart()
onVideoStart(true)
}
}
if (outputDone) { //输出完成
if (playerEva.isSetLastFrame) {
Expand Down Expand Up @@ -559,6 +580,7 @@ class EvaHardDecoder(playerEva: EvaAnimPlayer) : Decoder(playerEva), SurfaceText
private fun destroyInner() {
ELog.i(TAG, "destroyInner")
renderThread.handler?.post {
evaFileContainer?.close()
playerEva.pluginManager.onDestroy()
EvaJniUtil.destroyRender(playerEva.controllerId)
if (playerEva.isVideoRecord) {
Expand Down

0 comments on commit 2691f1c

Please sign in to comment.