CarGuo / GSYVideoPlayer

视频播放器(IJKplayer、ExoPlayer、MediaPlayer),HTTPS,16k page size,支持弹幕,外挂字幕,支持滤镜、水印、gif截图,片头广告、中间广告,多个同时播放,支持基本的拖动,声音、亮度调节,支持边播边缓存,支持视频自带rotation的旋转(90,270之类),重力旋转与手动旋转的同步支持,支持列表播放 ,列表全屏动画,视频加载速度,列表小窗口支持拖动,动画效果,调整比例,多分辨率切换,支持切换播放器,进度条小窗口预览,列表切换详情页面无缝播放,rtsp、concat、mpeg。
https://juejin.cn/user/817692379985752/posts
Apache License 2.0
20.25k stars 4.2k forks source link

请问怎么像IjkMediaPlayer一样传入Surface播放 #4009

Closed baboony closed 4 months ago

baboony commented 4 months ago

(!!!!请务必务必按照issue模板,修改 后提交问题!!!!,不按模板提Isuue删除处理)

(ps 首页问题集锦和demo请先了解一下!)

⚠️提问前建议先看看: https://mp.weixin.qq.com/s/HjSdmAsHuvixCH_EWdvk3Q

问题描述:

这是我从vcamsx拉的代码 目前想把IjkMediaPlayer改成gsyvideoplayer 但我看源码都是传入Context(vcamsx是虚拟摄像头项目:https://github.com/iiheng/VCAMSX) fun playRTMPStream(holder: SurfaceHolder, rtmpUrl: String) { ijkMediaPlayer = IjkMediaPlayer().apply { try { // 硬件解码设置,0为软解,1为硬解 setOption(IjkMediaPlayer.OPT_CATEGORY_PLAYER, "mediacodec", 0) setOption(IjkMediaPlayer.OPT_CATEGORY_PLAYER, "mediacodec-auto-rotate", 1) setOption( IjkMediaPlayer.OPT_CATEGORY_PLAYER, "mediacodec-handle-resolution-change", 1 )

                // 缓冲设置
                setOption(IjkMediaPlayer.OPT_CATEGORY_FORMAT, "dns_cache_clear", 1)
                setOption(IjkMediaPlayer.OPT_CATEGORY_PLAYER, "start-on-prepared", 0)
                setOption(IjkMediaPlayer.OPT_CATEGORY_PLAYER, "mediacodec_mpeg4", 1)
                setOption(IjkMediaPlayer.OPT_CATEGORY_PLAYER, "analyzemaxduration", 100L)
                setOption(IjkMediaPlayer.OPT_CATEGORY_PLAYER, "probesize", 1024L)
                setOption(IjkMediaPlayer.OPT_CATEGORY_PLAYER, "flush_packets", 1L)
                setOption(IjkMediaPlayer.OPT_CATEGORY_PLAYER, "packet-buffering", 1L)
                setOption(IjkMediaPlayer.OPT_CATEGORY_PLAYER, "framedrop", 1L)

                // 错误监听器
                setOnErrorListener { _, what, extra ->
                    Log.e("IjkMediaPlayer", "Error occurred. What: $what, Extra: $extra")
                    Toast.makeText(context, "直播接收失败$what", Toast.LENGTH_SHORT).show()
                    true
                }

                // 信息监听器
                setOnInfoListener { _, what, extra ->
                    Log.i("IjkMediaPlayer", "Info received. What: $what, Extra: $extra")
                    true
                }

                // 设置 RTMP 流的 URL
                dataSource = rtmpUrl

                // 设置视频输出的 SurfaceHolder
                setDisplay(holder)

                // 异步准备播放器
                prepareAsync()

                // 当播放器准备好后,开始播放
                setOnPreparedListener {
                    Toast.makeText(context, "直播接收成功,可以进行投屏", Toast.LENGTH_SHORT)
                        .show()
                    start()
                }
            } catch (e: Exception) {
                Log.d("vcamsx", "播放报错$e")
            }
        }

}

出现问题的视频流

rtmp://liteavapp.qcloud.com/live/liteavdemoplayerstreamid

❗❗❗⚠️⚠️⚠️这个很重要!!!!没有问题流的问题无法处理复现⚠️⚠️⚠️❗❗❗

问题机型/系统:

例如 真机 小米note2 Android7.0

GSY依赖版本

例如 implementation 'com.shuyu:gsyVideoPlayer-java:7.0.1'

Demo中的复现步骤

Demo中的detailPlayer页面打开后XXXX会出现这个问题。

问题代码:(如果有)

xxxxxxx

问题log(如果有)


xxxxxxx
CarGuo commented 4 months ago

Surface 是在 View UI 层传入给 Manager 最终传入 PlayerManager ,如下图参考

baboony commented 4 months ago

@CarGuo 对不起,我不太明白;请问有示例吗