This commit is contained in:
Alex Eidt 2022-09-13 23:02:38 -07:00
parent 538bcb7a83
commit c9bc141f27
4 changed files with 21 additions and 8 deletions

View file

@ -58,7 +58,6 @@ func (camera *Camera) SetFrameBuffer(buffer []byte) error {
if len(buffer) < size {
return fmt.Errorf("buffer size %d is smaller than frame size %d", len(buffer), size)
}
camera.framebuffer = buffer
return nil
}
@ -95,6 +94,7 @@ func NewCamera(stream int) (*Camera, error) {
if err := camera.getCameraData(device); err != nil {
return nil, err
}
return camera, nil
}
@ -148,18 +148,21 @@ func (camera *Camera) getCameraData(device string) error {
if err != nil {
return err
}
cmd := exec.Command(
"ffmpeg",
"-hide_banner",
"-f", webcamDeviceName,
"-i", device,
)
// The command will fail since we do not give a file to write to, therefore
// it will write the meta data to Stderr.
pipe, err := cmd.StderrPipe()
if err != nil {
return err
}
// Start the command.
if err := cmd.Start(); err != nil {
return err
@ -233,11 +236,13 @@ func (camera *Camera) Read() bool {
return false
}
}
total := 0
for total < camera.width*camera.height*camera.depth {
n, _ := (*camera.pipe).Read(camera.framebuffer[total:])
total += n
}
return true
}

View file

@ -29,13 +29,11 @@ func exists(filename string) bool {
// Checks if the given program is installed.
func installed(program string) error {
cmd := exec.Command(program, "-version")
errmsg := fmt.Errorf("%s is not installed", program)
if err := cmd.Start(); err != nil {
return errmsg
}
if err := cmd.Wait(); err != nil {
return errmsg
if err := cmd.Run(); err != nil {
return fmt.Errorf("%s is not installed", program)
}
return nil
}
@ -60,6 +58,7 @@ func ffprobe(filename, stype string) ([]map[string]string, error) {
if err := cmd.Start(); err != nil {
return nil, err
}
// Read ffprobe output from Stdout.
builder := bytes.Buffer{}
buffer := make([]byte, 1024)
@ -70,6 +69,7 @@ func ffprobe(filename, stype string) ([]map[string]string, error) {
break
}
}
// Wait for ffprobe command to complete.
if err := cmd.Wait(); err != nil {
return nil, err
@ -122,7 +122,6 @@ func webcam() (string, error) {
// For webcam streaming on windows, ffmpeg requires a device name.
// All device names are parsed and returned by this function.
func parseDevices(buffer string) []string {
index := strings.Index(strings.ToLower(buffer), "directshow video device")
if index != -1 {
buffer = buffer[index:]
@ -189,10 +188,12 @@ func getDevicesWindows() ([]string, error) {
"-f", "dshow",
"-i", "dummy",
)
pipe, err := cmd.StderrPipe()
if err != nil {
return nil, err
}
if err := cmd.Start(); err != nil {
return nil, err
}
@ -209,6 +210,7 @@ func getDevicesWindows() ([]string, error) {
}
cmd.Wait()
devices := parseDevices(builder.String())
return devices, nil
}

View file

@ -209,6 +209,7 @@ func (video *Video) init() error {
return err
}
video.pipe = &pipe
if err := cmd.Start(); err != nil {
return err
}
@ -229,6 +230,7 @@ func (video *Video) Read() bool {
return false
}
}
total := 0
for total < video.width*video.height*video.depth {
n, err := (*video.pipe).Read(video.framebuffer[total:])
@ -238,6 +240,7 @@ func (video *Video) Read() bool {
}
total += n
}
return true
}

View file

@ -280,6 +280,7 @@ func (writer *VideoWriter) init() error {
return err
}
writer.pipe = &pipe
if err := cmd.Start(); err != nil {
return err
}
@ -295,6 +296,7 @@ func (writer *VideoWriter) Write(frame []byte) error {
return err
}
}
total := 0
for total < len(frame) {
n, err := (*writer.pipe).Write(frame[total:])
@ -303,6 +305,7 @@ func (writer *VideoWriter) Write(frame []byte) error {
}
total += n
}
return nil
}