seagazer / ccplayer

A media player for OpenHarmony & HarmonyOS.
Apache License 2.0
13 stars 3 forks source link

如何实现进入页面自动加载视频播放地址进行播放。目前都需要设置播放按钮点击才可以播放。谢谢 #3

Closed bluesky0506 closed 5 months ago

bluesky0506 commented 5 months ago

如何实现进入页面自动加载视频播放地址进行播放。目前都需要设置播放按钮点击才可以播放。谢谢

seagazer commented 5 months ago

如何实现进入页面自动加载视频播放地址进行播放。目前都需要设置播放按钮点击才可以播放。谢谢

自动播放,可以在XComponent的onload回调以后,按照如下顺序设置surface,设置url,然后在播放器的onReady回调里开始start播放即可

bluesky0506 commented 5 months ago

XComponent({ type: "surface", id: "video", controller: this.controller }).onLoad(() => { this.surfaceId = this.controller.getXComponentSurfaceId() Logger.d(TAG, "surface view created: " + this.surfaceId) // bind a surface to render picture this.player!.setSurface(this.surfaceId) Logger.d(TAG, "surface view created: " + this.surfaceId)

            setTimeout(() => {
                this.player!.setMediaSource(MediaSourceFactory.createUrl(this.filePath), () => {
                    this.player!.start()
                })
            }, 50);

        }).onDestroy(() => {
            Logger.d(TAG, "surface view destroy")

        })

我试了下,设置url时如果不加定时器延迟,几乎不能自动播放。但是加上这个延迟50毫秒就可以了。麻烦帮我看看是不是那些写的不对,这个是我在git上的demo上进行修改调试的。谢谢

seagazer commented 5 months ago

XComponent({ type: "surface", id: "video", controller: this.controller }).onLoad(() => { this.surfaceId = this.controller.getXComponentSurfaceId() Logger.d(TAG, "surface view created: " + this.surfaceId) // bind a surface to render picture this.player!.setSurface(this.surfaceId) Logger.d(TAG, "surface view created: " + this.surfaceId)

            setTimeout(() => {
                this.player!.setMediaSource(MediaSourceFactory.createUrl(this.filePath), () => {
                    this.player!.start()
                })
            }, 50);

        }).onDestroy(() => {
            Logger.d(TAG, "surface view destroy")

        })

我试了下,设置url时如果不加定时器延迟,几乎不能自动播放。但是加上这个延迟50毫秒就可以了。麻烦帮我看看是不是那些写的不对,这个是我在git上的demo上进行修改调试的。谢谢

我在我这边的3568平台试了,同样代码是正常的哦,播放地址https://media.w3.org/2010/05/sintel/trailer.mp4。请问下你的运行环境是怎样的,或者能否提供一份日志我看看

seagazer commented 5 months ago

XComponent({ type: "surface", id: "video", controller: this.controller }).onLoad(() => { this.surfaceId = this.controller.getXComponentSurfaceId() Logger.d(TAG, "surface view created: " + this.surfaceId) // bind a surface to render picture this.player!.setSurface(this.surfaceId) Logger.d(TAG, "surface view created: " + this.surfaceId)

            setTimeout(() => {
                this.player!.setMediaSource(MediaSourceFactory.createUrl(this.filePath), () => {
                    this.player!.start()
                })
            }, 50);

        }).onDestroy(() => {
            Logger.d(TAG, "surface view destroy")

        })

我试了下,设置url时如果不加定时器延迟,几乎不能自动播放。但是加上这个延迟50毫秒就可以了。麻烦帮我看看是不是那些写的不对,这个是我在git上的demo上进行修改调试的。谢谢

如果你加个延时就可以了,那很有可能是系统执行创建播放器实例比较慢,因为目前AvPlayer创建没有同步接口,只有异步创建,如果比onload回调要慢,那有可能出现start的时候播放器实例还未成功创建,导致无法播放。 实际项目中,player一般会封装成单例,可以考虑在ability的oncreate中初始化单例,这样进入页面后基本上就不存在还未创建实例了。

bluesky0506 commented 5 months ago

我使用的是11的api了,使用的是华为的模拟器。

bluesky0506 commented 5 months ago

[Uploading log.txt…]()

bluesky0506 commented 5 months ago

我明天按照你说的再试试,非常感谢

seagazer commented 5 months ago

我明天按照你说的再试试,非常感谢

已更新1.0.5版本,可以尝试使用最新版本了,内部已经针对创建实例接口执行慢的场景进行了优化处理