Skip to content

Commit

Permalink
从exoplayer修改为ijkplayer,改为surface显示画面。
Browse files Browse the repository at this point in the history
  • Loading branch information
caixxxin committed Apr 30, 2024
1 parent df5b006 commit c630436
Show file tree
Hide file tree
Showing 4 changed files with 28 additions and 95 deletions.
7 changes: 5 additions & 2 deletions app/build.gradle
Original file line number Diff line number Diff line change
Expand Up @@ -26,7 +26,7 @@ android {
cmake {
arguments "-DIS_SO_BUILD=${project.hasProperty('IS_SO_BUILD') ? project.IS_SO_BUILD : true}"

abiFilters "armeabi-v7a", "arm64-v8a"
abiFilters "armeabi-v7a"
}
}

Expand All @@ -36,7 +36,7 @@ android {
ndk {
// Specifies the ABI configurations of your native
// libraries Gradle should build and package with your app.
abiFilters "armeabi-v7a", "arm64-v8a"
abiFilters "armeabi-v7a"
}
multiDexEnabled true
}
Expand Down Expand Up @@ -129,4 +129,7 @@ dependencies {
implementation 'com.google.android.exoplayer:exoplayer-hls:2.13.3'

implementation 'javax.annotation:javax.annotation-api:1.3.2'

implementation 'tv.danmaku.ijk.media:ijkplayer-java:0.8.8'
implementation 'tv.danmaku.ijk.media:ijkplayer-armv7a:0.8.8'
}
108 changes: 22 additions & 86 deletions app/src/main/java/com/lizongying/mytv/PlayerFragment.kt
Original file line number Diff line number Diff line change
Expand Up @@ -15,114 +15,54 @@ import androidx.media3.common.PlaybackException
import androidx.media3.common.Player
import androidx.media3.common.VideoSize
import androidx.media3.common.util.UnstableApi
import androidx.media3.exoplayer.ExoPlayer
import androidx.media3.ui.PlayerView
import com.google.android.exoplayer2.SimpleExoPlayer
import com.lizongying.mytv.databinding.PlayerBinding
import com.lizongying.mytv.models.TVViewModel

import tv.danmaku.ijk.media.player.IMediaPlayer;
import tv.danmaku.ijk.media.player.IjkMediaPlayer;

class PlayerFragment : Fragment(), SurfaceHolder.Callback {

private var _binding: PlayerBinding? = null
private var playerView: PlayerView? = null
private var tvViewModel: TVViewModel? = null
private val aspectRatio = 16f / 9f


private lateinit var surfaceView: SurfaceView
private lateinit var surfaceHolder: SurfaceHolder
private var exoPlayer: SimpleExoPlayer? = null
private var ijkMediaPlayer: IjkMediaPlayer? = null

override fun onCreateView(
inflater: LayoutInflater, container: ViewGroup?,
savedInstanceState: Bundle?
): View {
_binding = PlayerBinding.inflate(inflater, container, false)

if (Utils.isTmallDevice()) {
_binding!!.playerView.visibility = View.GONE
surfaceView = _binding!!.surfaceView
surfaceHolder = surfaceView.holder
surfaceHolder.addCallback(this)
} else {
_binding!!.surfaceView.visibility = View.GONE
playerView = _binding!!.playerView
}
surfaceView = _binding!!.surfaceView
surfaceHolder = surfaceView.holder
surfaceHolder.addCallback(this)

playerView?.viewTreeObserver?.addOnGlobalLayoutListener(object :
ViewTreeObserver.OnGlobalLayoutListener {
override fun onGlobalLayout() {
playerView!!.viewTreeObserver.removeOnGlobalLayoutListener(this)
playerView!!.player = activity?.let {
ExoPlayer.Builder(it)
.build()
}
playerView!!.player?.playWhenReady = true
playerView!!.player?.addListener(object : Player.Listener {
override fun onVideoSizeChanged(videoSize: VideoSize) {
val ratio = playerView?.measuredWidth?.div(playerView?.measuredHeight!!)
if (ratio != null) {
val layoutParams = playerView?.layoutParams
if (ratio < aspectRatio) {
layoutParams?.height =
(playerView?.measuredWidth?.div(aspectRatio))?.toInt()
playerView?.layoutParams = layoutParams
} else if (ratio > aspectRatio) {
layoutParams?.width =
(playerView?.measuredHeight?.times(aspectRatio))?.toInt()
playerView?.layoutParams = layoutParams
}
}
}

override fun onPlayerError(error: PlaybackException) {
super.onPlayerError(error)
Log.e(TAG, "PlaybackException $error")
val err = "播放错误"
tvViewModel?.setErrInfo(err)
tvViewModel?.changed("retry")
}

override fun onIsPlayingChanged(isPlaying: Boolean) {
super.onIsPlayingChanged(isPlaying)
if (isPlaying) {
tvViewModel?.setErrInfo("")
}
}
})
}
})
(activity as MainActivity).fragmentReady("PlayerFragment")
return _binding!!.root
}

@OptIn(UnstableApi::class)
fun play(tvViewModel: TVViewModel) {
this.tvViewModel = tvViewModel
playerView?.player?.run {
setMediaItem(MediaItem.fromUri(tvViewModel.getVideoUrlCurrent()))
prepare()
}
exoPlayer?.run {
setMediaItem(com.google.android.exoplayer2.MediaItem.fromUri(tvViewModel.getVideoUrlCurrent()))
prepare()
ijkMediaPlayer?.reset()
ijkMediaPlayer?.setDisplay(surfaceHolder)
ijkMediaPlayer?.setDataSource(tvViewModel.getVideoUrlCurrent())
ijkMediaPlayer?.setOnPreparedListener{
Log.i(TAG, "play onPrepared")
it.start()
tvViewModel.setErrInfo("")
}
ijkMediaPlayer?.prepareAsync()
}

override fun onStart() {
Log.i(TAG, "onStart")
super.onStart()
if (playerView != null && playerView!!.player?.isPlaying == false) {
Log.i(TAG, "replay")
playerView!!.player?.prepare()
playerView!!.player?.play()
}
if (exoPlayer?.isPlaying == false) {
Log.i(TAG, "replay")
exoPlayer?.prepare()
exoPlayer?.play()
}
}

override fun onResume() {
Expand All @@ -132,24 +72,19 @@ class PlayerFragment : Fragment(), SurfaceHolder.Callback {

override fun onPause() {
super.onPause()
if (playerView != null && playerView!!.player?.isPlaying == true) {
playerView!!.player?.stop()
}
if (exoPlayer?.isPlaying == true) {
exoPlayer?.stop()
if (ijkMediaPlayer?.isPlaying() == true) {
ijkMediaPlayer?.stop()
}
}

override fun onDestroy() {
super.onDestroy()
if (playerView != null) {
playerView!!.player?.release()
}
exoPlayer?.release()
ijkMediaPlayer?.release()
}

override fun onDestroyView() {
super.onDestroyView()
ijkMediaPlayer?.release()
_binding = null
}

Expand All @@ -158,9 +93,10 @@ class PlayerFragment : Fragment(), SurfaceHolder.Callback {
}

override fun surfaceCreated(holder: SurfaceHolder) {
exoPlayer = SimpleExoPlayer.Builder(requireContext()).build()
exoPlayer?.setVideoSurfaceHolder(surfaceHolder)
exoPlayer?.playWhenReady = true
Log.i(TAG, "surfaceCreated")
if (ijkMediaPlayer == null) {
ijkMediaPlayer = IjkMediaPlayer()
}
}

override fun surfaceChanged(holder: SurfaceHolder, format: Int, width: Int, height: Int) {
Expand Down
7 changes: 0 additions & 7 deletions app/src/main/res/layout/player.xml
Original file line number Diff line number Diff line change
Expand Up @@ -15,11 +15,4 @@
app:resize_mode="fill"
app:use_controller="false" />

<androidx.media3.ui.PlayerView
android:id="@+id/player_view"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:layout_gravity="center"
app:resize_mode="fill"
app:use_controller="false" />
</FrameLayout>
1 change: 1 addition & 0 deletions settings.gradle
Original file line number Diff line number Diff line change
Expand Up @@ -10,6 +10,7 @@ dependencyResolutionManagement {
repositories {
google()
mavenCentral()
maven {url 'https://maven.aliyun.com/repository/jcenter'}
}
}
rootProject.name = "My TV"
Expand Down

0 comments on commit c630436

Please sign in to comment.