mirror of
https://github.com/m1k1o/neko.git
synced 2026-11-03 00:11:48 -06:00
feat(capture): toggle mouse pointer via capture.video.show_pointer (#691)
* feat(capture): toggle mouse pointer via capture.video.show_pointer - config: register capture.video.show_pointer config option - config: default pointer to visible (ShowPointer: true) on the hardcoded fallback pipeline, override applies only when the flag is explicitly set, so per-pipeline YAML overrides stay untouched - compose: document NEKO_CAPTURE_VIDEO_SHOW_POINTER example * fix(capture): apply show_pointer to all pipelines - capture: thread capture.video.show_pointer into broadcast and screencast gstreamer pipelines, previously hardcoded show-pointer=true and silently ignored the flag - config: resolve capture.video.show_pointer once into Capture.VideoShowPointer so all pipeline builders share one value - docs: document capture.video.show_pointer in configuration/capture.md, including its reach into broadcast and screencast, and regenerate help.txt/help.json - compose: drop stray commented-out example, default compose file is not meant to list every option
This commit is contained in:
@@ -101,12 +101,12 @@ func New(desktop types.DesktopManager, config *config.Capture) *CaptureManagerCt
|
||||
"! queue "+
|
||||
"! voaacenc bitrate=%d "+
|
||||
"! mux. "+
|
||||
"ximagesrc display-name=%s show-pointer=true use-damage=false "+
|
||||
"ximagesrc display-name=%s show-pointer=%v use-damage=false "+
|
||||
"! video/x-raw "+
|
||||
"! videoconvert "+
|
||||
"! queue "+
|
||||
"! x264enc threads=4 bitrate=%d key-int-max=15 byte-stream=true tune=zerolatency speed-preset=%s "+
|
||||
"! mux.", url, config.AudioDevice, config.BroadcastAudioBitrate*1000, config.Display, config.BroadcastVideoBitrate, config.BroadcastPreset,
|
||||
"! mux.", url, config.AudioDevice, config.BroadcastAudioBitrate*1000, config.Display, config.VideoShowPointer, config.BroadcastVideoBitrate, config.BroadcastPreset,
|
||||
), nil
|
||||
}, config.BroadcastUrl, config.BroadcastAutostart),
|
||||
screencast: screencastNew(config.ScreencastEnabled, func() string {
|
||||
@@ -116,12 +116,12 @@ func New(desktop types.DesktopManager, config *config.Capture) *CaptureManagerCt
|
||||
}
|
||||
|
||||
return fmt.Sprintf(
|
||||
"ximagesrc display-name=%s show-pointer=true use-damage=false "+
|
||||
"ximagesrc display-name=%s show-pointer=%v use-damage=false "+
|
||||
"! video/x-raw,framerate=%s "+
|
||||
"! videoconvert "+
|
||||
"! queue "+
|
||||
"! jpegenc quality=%s "+
|
||||
"! appsink name=appsink", config.Display, config.ScreencastRate, config.ScreencastQuality,
|
||||
"! appsink name=appsink", config.Display, config.VideoShowPointer, config.ScreencastRate, config.ScreencastQuality,
|
||||
)
|
||||
}()),
|
||||
|
||||
|
||||
@@ -28,9 +28,10 @@ const (
|
||||
type Capture struct {
|
||||
Display string
|
||||
|
||||
VideoCodec codec.RTPCodec
|
||||
VideoIDs []string
|
||||
VideoPipelines map[string]types.VideoConfig
|
||||
VideoCodec codec.RTPCodec
|
||||
VideoIDs []string
|
||||
VideoPipelines map[string]types.VideoConfig
|
||||
VideoShowPointer bool
|
||||
|
||||
AudioDevice string
|
||||
AudioCodec codec.RTPCodec
|
||||
@@ -100,6 +101,11 @@ func (Capture) Init(cmd *cobra.Command) error {
|
||||
return err
|
||||
}
|
||||
|
||||
cmd.PersistentFlags().Bool("capture.video.show_pointer", true, "show mouse pointer in captured video, overrides show_pointer of all video pipelines")
|
||||
if err := viper.BindPFlag("capture.video.show_pointer", cmd.PersistentFlags().Lookup("capture.video.show_pointer")); err != nil {
|
||||
return err
|
||||
}
|
||||
|
||||
// broadcast
|
||||
cmd.PersistentFlags().Int("capture.broadcast.audio_bitrate", 128, "broadcast audio bitrate in KB/s")
|
||||
if err := viper.BindPFlag("capture.broadcast.audio_bitrate", cmd.PersistentFlags().Lookup("capture.broadcast.audio_bitrate")); err != nil {
|
||||
@@ -369,8 +375,9 @@ func (s *Capture) Set() {
|
||||
s.VideoCodec = codec.VP8()
|
||||
s.VideoPipelines = map[string]types.VideoConfig{
|
||||
"main": {
|
||||
Fps: "25",
|
||||
GstEncoder: "vp8enc",
|
||||
Fps: "25",
|
||||
GstEncoder: "vp8enc",
|
||||
ShowPointer: true,
|
||||
GstParams: map[string]string{
|
||||
"target-bitrate": "round(3072 * 650)",
|
||||
"cpu-used": "4",
|
||||
@@ -400,6 +407,14 @@ func (s *Capture) Set() {
|
||||
log.Warn().Msg("you are setting both single video pipeline and multiple video pipelines, ignoring single video pipeline")
|
||||
}
|
||||
|
||||
s.VideoShowPointer = viper.GetBool("capture.video.show_pointer")
|
||||
if viper.IsSet("capture.video.show_pointer") {
|
||||
for k, p := range s.VideoPipelines {
|
||||
p.ShowPointer = s.VideoShowPointer
|
||||
s.VideoPipelines[k] = p
|
||||
}
|
||||
}
|
||||
|
||||
// audio
|
||||
s.AudioDevice = viper.GetString("capture.audio.device")
|
||||
s.AudioPipeline = viper.GetString("capture.audio.pipeline")
|
||||
|
||||
Reference in New Issue
Block a user