capture0.go 1.4 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566
  1. package main
  2. import (
  3. "context"
  4. "flag"
  5. "fmt"
  6. "log"
  7. "os"
  8. "time"
  9. "github.com/vladimirvivien/go4vl/device"
  10. "github.com/vladimirvivien/go4vl/v4l2"
  11. )
  12. func main() {
  13. devName := "/dev/video0"
  14. flag.StringVar(&devName, "d", devName, "device name (path)")
  15. flag.Parse()
  16. // open device
  17. device, err := device.Open(
  18. devName,
  19. device.WithPixFormat(v4l2.PixFormat{PixelFormat: v4l2.PixelFmtMJPEG, Width: 640, Height: 480}),
  20. )
  21. if err != nil {
  22. log.Fatalf("failed to open device: %s", err)
  23. }
  24. defer device.Close()
  25. // start stream
  26. ctx, stop := context.WithCancel(context.TODO())
  27. if err := device.Start(ctx); err != nil {
  28. log.Fatalf("failed to start stream: %s", err)
  29. }
  30. // process frames from capture channel
  31. totalFrames := 10
  32. count := 0
  33. log.Printf("Capturing %d frames...", totalFrames)
  34. for frame := range device.GetOutput() {
  35. fileName := fmt.Sprintf("capture_%d.jpg", count)
  36. file, err := os.Create(fileName)
  37. if err != nil {
  38. log.Printf("failed to create file %s: %s", fileName, err)
  39. continue
  40. }
  41. if _, err := file.Write(frame); err != nil {
  42. log.Printf("failed to write file %s: %s", fileName, err)
  43. continue
  44. }
  45. log.Printf("Saved file: %s", fileName)
  46. if err := file.Close(); err != nil {
  47. log.Printf("failed to close file %s: %s", fileName, err)
  48. }
  49. count++
  50. if count >= totalFrames {
  51. break
  52. }
  53. time.Sleep(1 * time.Second)
  54. }
  55. stop() // stop capture
  56. fmt.Println("Done.")
  57. }