github.com/aamcrae/webcam@v0.0.0-20210915060337-934acc13bdc3/examples/stdout_streamer/stdout_streamer.go (about) 1 // Example program that uses blakjack/webcam library 2 // for working with V4L2 devices. 3 // The application reads frames from device and writes them to stdout 4 // If your device supports motion formats (e.g. H264 or MJPEG) you can 5 // use it's output as a video stream. 6 // Example usage: go run stdout_streamer.go | vlc - 7 package main 8 9 import "github.com/aamcrae/webcam" 10 import "os" 11 import "fmt" 12 import "sort" 13 14 func readChoice(s string) int { 15 var i int 16 for true { 17 print(s) 18 _, err := fmt.Scanf("%d\n", &i) 19 if err != nil || i < 1 { 20 println("Invalid input. Try again") 21 } else { 22 break 23 } 24 } 25 return i 26 } 27 28 type FrameSizes []webcam.FrameSize 29 30 func (slice FrameSizes) Len() int { 31 return len(slice) 32 } 33 34 //For sorting purposes 35 func (slice FrameSizes) Less(i, j int) bool { 36 ls := slice[i].MaxWidth * slice[i].MaxHeight 37 rs := slice[j].MaxWidth * slice[j].MaxHeight 38 return ls < rs 39 } 40 41 //For sorting purposes 42 func (slice FrameSizes) Swap(i, j int) { 43 slice[i], slice[j] = slice[j], slice[i] 44 } 45 46 func main() { 47 cam, err := webcam.Open("/dev/video0") 48 if err != nil { 49 panic(err.Error()) 50 } 51 defer cam.Close() 52 53 format_desc := cam.GetSupportedFormats() 54 var formats []webcam.PixelFormat 55 for f := range format_desc { 56 formats = append(formats, f) 57 } 58 59 println("Available formats: ") 60 for i, value := range formats { 61 fmt.Fprintf(os.Stderr, "[%d] %s\n", i+1, format_desc[value]) 62 } 63 64 choice := readChoice(fmt.Sprintf("Choose format [1-%d]: ", len(formats))) 65 format := formats[choice-1] 66 67 fmt.Fprintf(os.Stderr, "Supported frame sizes for format %s\n", format_desc[format]) 68 frames := FrameSizes(cam.GetSupportedFrameSizes(format)) 69 sort.Sort(frames) 70 71 for i, value := range frames { 72 fmt.Fprintf(os.Stderr, "[%d] %s\n", i+1, value.GetString()) 73 } 74 choice = readChoice(fmt.Sprintf("Choose format [1-%d]: ", len(frames))) 75 size := frames[choice-1] 76 77 f, w, h, _, _, err := cam.SetImageFormat(format, uint32(size.MaxWidth), uint32(size.MaxHeight)) 78 79 if err != nil { 80 panic(err.Error()) 81 } else { 82 fmt.Fprintf(os.Stderr, "Resulting image format: %s (%dx%d)\n", format_desc[f], w, h) 83 } 84 85 println("Press Enter to start streaming") 86 fmt.Scanf("\n") 87 err = cam.StartStreaming() 88 if err != nil { 89 panic(err.Error()) 90 } 91 92 timeout := uint32(5) //5 seconds 93 for { 94 err = cam.WaitForFrame(timeout) 95 96 switch err.(type) { 97 case nil: 98 case *webcam.Timeout: 99 fmt.Fprint(os.Stderr, err.Error()) 100 continue 101 default: 102 panic(err.Error()) 103 } 104 105 frame, err := cam.ReadFrame() 106 if len(frame) != 0 { 107 print(".") 108 os.Stdout.Write(frame) 109 os.Stdout.Sync() 110 } else if err != nil { 111 panic(err.Error()) 112 } 113 } 114 }