diff --git a/go.mod b/go.mod index afe1b0c..c5cf2d0 100644 --- a/go.mod +++ b/go.mod @@ -17,6 +17,7 @@ require ( ) require ( + github.com/adrg/libvlc-go/v3 v3.1.6 // indirect github.com/aliyun/alibaba-cloud-sdk-go v1.63.76 // indirect github.com/ebitengine/oto/v3 v3.3.2 // indirect github.com/ebitengine/purego v0.8.1 // indirect diff --git a/go.sum b/go.sum index 7dbc9e7..54b7e8d 100644 --- a/go.sum +++ b/go.sum @@ -1,6 +1,8 @@ dmitri.shuralyov.com/gpu/mtl v0.0.0-20190408044501-666a987793e9/go.mod h1:H6x//7gZCb22OMCxBHrMx7a5I7Hp++hsVxbQ4BYO7hU= github.com/BurntSushi/xgb v0.0.0-20160522181843-27f122750802/go.mod h1:IVnqGOEym/WlBOVXweHU+Q+/VP0lqqI8lqeDx9IjBqo= github.com/HdrHistogram/hdrhistogram-go v1.1.2/go.mod h1:yDgFjdqOqDEKOvasDdhWNXYg9BVp4O+o5f6V/ehm6Oo= +github.com/adrg/libvlc-go/v3 v3.1.6 h1:Cm22w6xNMDdzYCW8koHgAvjonYm4xbPP5TrlVTtMdl4= +github.com/adrg/libvlc-go/v3 v3.1.6/go.mod h1:xJK0YD8cyMDejnrTFQinStE6RYCV1nlfS8KmqTpszSc= github.com/ajstarks/svgo v0.0.0-20180226025133-644b8db467af/go.mod h1:K08gAheRH3/J6wwsYMMT4xOr94bZjxIelGM0+d/wbFw= github.com/aliyun/alibaba-cloud-sdk-go v1.61.1376/go.mod h1:9CMdKNL3ynIGPpfTcdwTvIm8SGuAZYYC4jFVSSvE1YQ= github.com/aliyun/alibaba-cloud-sdk-go v1.63.76 h1:mg/+23+/gAw6zdxv9I5dPCj666WJPLk8S1nXm0dOumQ= diff --git a/internal/routes/wait.go b/internal/routes/wait.go index 47ca1ec..5bf5903 100644 --- a/internal/routes/wait.go +++ b/internal/routes/wait.go @@ -199,7 +199,7 @@ func ttsAction(c context.Context, item schema.WaitItemModel) error { return fmt.Errorf("语音合成异常: %w", err) } - zap.S().Infoln("循环播放待机 TTS 语音") + zap.S().Infoln("播放待机 TTS 语音") defer zap.S().Infoln("结束待机 TTS 语音") for { @@ -235,7 +235,7 @@ func videoAction(c context.Context, item schema.WaitItemModel) error { return fmt.Errorf("视频文件获取异常: %w", err) } - zap.S().Infoln("循环播放待机视频") + zap.S().Infoln("播放待机视频") defer zap.S().Infoln("结束待机视频") utils.BlankOpen() diff --git a/pkg/video/play.go b/pkg/video/play.go new file mode 100644 index 0000000..dda8be4 --- /dev/null +++ b/pkg/video/play.go @@ -0,0 +1,68 @@ +package video + +import ( + "context" + "fmt" + libvlc "github.com/adrg/libvlc-go/v3" +) + +func Play(ctx context.Context, file string) error { + // 1. 初始化 VLC + if err := libvlc.Init("--no-xlib"); err != nil { + return fmt.Errorf("VLC初始化失败: %w", err) + } + defer libvlc.Release() + + // 2. 创建播放器 + player, err := libvlc.NewPlayer() + if err != nil { + return fmt.Errorf("播放器创建失败: %w", err) + } + defer player.Stop() + defer player.Release() + + // 3. 注册结束事件 + eventManager, err := player.EventManager() + if err != nil { + return fmt.Errorf("事件管理器获取失败: %w", err) + } + + done := make(chan struct{}) + defer close(done) + + _, err = eventManager.Attach(libvlc.MediaPlayerEndReached, func(libvlc.Event, interface{}) { + done <- struct{}{} + }, nil) + if err != nil { + return fmt.Errorf("事件绑定失败: %w", err) + } + + // 4. 加载并播放文件 + if _, err := player.LoadMediaFromPath(file); err != nil { + return fmt.Errorf("文件加载失败: %w", err) + } + + if err := player.Play(); err != nil { + return fmt.Errorf("播放启动失败: %w", err) + } + + // 设置全屏模式 + if err := player.SetFullScreen(true); err != nil { + return fmt.Errorf("设置全屏模式失败: %w", err) + } + + // 设置音量为最大 + if err := player.SetVolume(100); err != nil { + return fmt.Errorf("设置音量失败: %w", err) + } + + // 5. 等待事件 + fmt.Printf("正在播放: %s\n", file) + select { + case <-ctx.Done(): + return fmt.Errorf("播放被用户中断") + case <-done: + fmt.Println("播放正常结束") + return nil + } +} diff --git a/pkg/video/paly.go b/pkg/video_old/paly.go similarity index 97% rename from pkg/video/paly.go rename to pkg/video_old/paly.go index ee8b75c..d9f7062 100644 --- a/pkg/video/paly.go +++ b/pkg/video_old/paly.go @@ -1,4 +1,4 @@ -package video +package video_old import ( "bufio"