mirror of
				https://github.com/pion/mediadevices.git
				synced 2025-10-31 11:56:28 +08:00 
			
		
		
		
	
		
			
				
	
	
		
			87 lines
		
	
	
		
			1.7 KiB
		
	
	
	
		
			Go
		
	
	
	
	
	
			
		
		
	
	
			87 lines
		
	
	
		
			1.7 KiB
		
	
	
	
		
			Go
		
	
	
	
	
	
| // +build !linux
 | |
| 
 | |
| package screen
 | |
| 
 | |
| import (
 | |
| 	"fmt"
 | |
| 	"image"
 | |
| 	"io"
 | |
| 
 | |
| 	"github.com/kbinani/screenshot"
 | |
| 	"github.com/pion/mediadevices/pkg/driver"
 | |
| 	"github.com/pion/mediadevices/pkg/frame"
 | |
| 	"github.com/pion/mediadevices/pkg/io/video"
 | |
| 	"github.com/pion/mediadevices/pkg/prop"
 | |
| )
 | |
| 
 | |
| type screen struct {
 | |
| 	displayIndex int
 | |
| 	doneCh       chan struct{}
 | |
| }
 | |
| 
 | |
| func init() {
 | |
| 	Initialize()
 | |
| }
 | |
| 
 | |
| // Initialize finds and registers active displays. This is part of an experimental API.
 | |
| func Initialize() {
 | |
| 	activeDisplays := screenshot.NumActiveDisplays()
 | |
| 	for i := 0; i < activeDisplays; i++ {
 | |
| 		priority := driver.PriorityNormal
 | |
| 		if i == 0 {
 | |
| 			priority = driver.PriorityHigh
 | |
| 		}
 | |
| 
 | |
| 		s := newScreen(i)
 | |
| 		driver.GetManager().Register(s, driver.Info{
 | |
| 			Label:      fmt.Sprint(i),
 | |
| 			DeviceType: driver.Screen,
 | |
| 			Priority:   priority,
 | |
| 		})
 | |
| 	}
 | |
| }
 | |
| 
 | |
| func newScreen(displayIndex int) *screen {
 | |
| 	s := screen{
 | |
| 		displayIndex: displayIndex,
 | |
| 	}
 | |
| 	return &s
 | |
| }
 | |
| 
 | |
| func (s *screen) Open() error {
 | |
| 	s.doneCh = make(chan struct{})
 | |
| 	return nil
 | |
| }
 | |
| 
 | |
| func (s *screen) Close() error {
 | |
| 	close(s.doneCh)
 | |
| 	return nil
 | |
| }
 | |
| 
 | |
| func (s *screen) VideoRecord(selectedProp prop.Media) (video.Reader, error) {
 | |
| 	r := video.ReaderFunc(func() (img image.Image, release func(), err error) {
 | |
| 		select {
 | |
| 		case <-s.doneCh:
 | |
| 			return nil, nil, io.EOF
 | |
| 		default:
 | |
| 		}
 | |
| 
 | |
| 		img, err = screenshot.CaptureDisplay(s.displayIndex)
 | |
| 		release = func() {}
 | |
| 		return
 | |
| 	})
 | |
| 	return r, nil
 | |
| }
 | |
| 
 | |
| func (s *screen) Properties() []prop.Media {
 | |
| 	resolution := screenshot.GetDisplayBounds(s.displayIndex)
 | |
| 	supportedProp := prop.Media{
 | |
| 		Video: prop.Video{
 | |
| 			Width:       resolution.Dx(),
 | |
| 			Height:      resolution.Dy(),
 | |
| 			FrameFormat: frame.FormatRGBA,
 | |
| 		},
 | |
| 	}
 | |
| 	return []prop.Media{supportedProp}
 | |
| }
 | 
