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  }