123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566 |
- package main
- import (
- "context"
- "flag"
- "fmt"
- "log"
- "os"
- "time"
- "github.com/vladimirvivien/go4vl/device"
- "github.com/vladimirvivien/go4vl/v4l2"
- )
- func main() {
- devName := "/dev/video0"
- flag.StringVar(&devName, "d", devName, "device name (path)")
- flag.Parse()
- // open device
- device, err := device.Open(
- devName,
- device.WithPixFormat(v4l2.PixFormat{PixelFormat: v4l2.PixelFmtMJPEG, Width: 640, Height: 480}),
- )
- if err != nil {
- log.Fatalf("failed to open device: %s", err)
- }
- defer device.Close()
- // start stream
- ctx, stop := context.WithCancel(context.TODO())
- if err := device.Start(ctx); err != nil {
- log.Fatalf("failed to start stream: %s", err)
- }
- // process frames from capture channel
- totalFrames := 10
- count := 0
- log.Printf("Capturing %d frames...", totalFrames)
- for frame := range device.GetOutput() {
- fileName := fmt.Sprintf("capture_%d.jpg", count)
- file, err := os.Create(fileName)
- if err != nil {
- log.Printf("failed to create file %s: %s", fileName, err)
- continue
- }
- if _, err := file.Write(frame); err != nil {
- log.Printf("failed to write file %s: %s", fileName, err)
- continue
- }
- log.Printf("Saved file: %s", fileName)
- if err := file.Close(); err != nil {
- log.Printf("failed to close file %s: %s", fileName, err)
- }
- count++
- if count >= totalFrames {
- break
- }
- time.Sleep(1 * time.Second)
- }
- stop() // stop capture
- fmt.Println("Done.")
- }
|