Cleanup
This commit is contained in:
parent
538bcb7a83
commit
c9bc141f27
4 changed files with 21 additions and 8 deletions
|
@ -58,7 +58,6 @@ func (camera *Camera) SetFrameBuffer(buffer []byte) error {
|
||||||
if len(buffer) < size {
|
if len(buffer) < size {
|
||||||
return fmt.Errorf("buffer size %d is smaller than frame size %d", len(buffer), size)
|
return fmt.Errorf("buffer size %d is smaller than frame size %d", len(buffer), size)
|
||||||
}
|
}
|
||||||
|
|
||||||
camera.framebuffer = buffer
|
camera.framebuffer = buffer
|
||||||
return nil
|
return nil
|
||||||
}
|
}
|
||||||
|
@ -95,6 +94,7 @@ func NewCamera(stream int) (*Camera, error) {
|
||||||
if err := camera.getCameraData(device); err != nil {
|
if err := camera.getCameraData(device); err != nil {
|
||||||
return nil, err
|
return nil, err
|
||||||
}
|
}
|
||||||
|
|
||||||
return camera, nil
|
return camera, nil
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -148,18 +148,21 @@ func (camera *Camera) getCameraData(device string) error {
|
||||||
if err != nil {
|
if err != nil {
|
||||||
return err
|
return err
|
||||||
}
|
}
|
||||||
|
|
||||||
cmd := exec.Command(
|
cmd := exec.Command(
|
||||||
"ffmpeg",
|
"ffmpeg",
|
||||||
"-hide_banner",
|
"-hide_banner",
|
||||||
"-f", webcamDeviceName,
|
"-f", webcamDeviceName,
|
||||||
"-i", device,
|
"-i", device,
|
||||||
)
|
)
|
||||||
|
|
||||||
// The command will fail since we do not give a file to write to, therefore
|
// The command will fail since we do not give a file to write to, therefore
|
||||||
// it will write the meta data to Stderr.
|
// it will write the meta data to Stderr.
|
||||||
pipe, err := cmd.StderrPipe()
|
pipe, err := cmd.StderrPipe()
|
||||||
if err != nil {
|
if err != nil {
|
||||||
return err
|
return err
|
||||||
}
|
}
|
||||||
|
|
||||||
// Start the command.
|
// Start the command.
|
||||||
if err := cmd.Start(); err != nil {
|
if err := cmd.Start(); err != nil {
|
||||||
return err
|
return err
|
||||||
|
@ -233,11 +236,13 @@ func (camera *Camera) Read() bool {
|
||||||
return false
|
return false
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
total := 0
|
total := 0
|
||||||
for total < camera.width*camera.height*camera.depth {
|
for total < camera.width*camera.height*camera.depth {
|
||||||
n, _ := (*camera.pipe).Read(camera.framebuffer[total:])
|
n, _ := (*camera.pipe).Read(camera.framebuffer[total:])
|
||||||
total += n
|
total += n
|
||||||
}
|
}
|
||||||
|
|
||||||
return true
|
return true
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
16
utils.go
16
utils.go
|
@ -29,13 +29,11 @@ func exists(filename string) bool {
|
||||||
// Checks if the given program is installed.
|
// Checks if the given program is installed.
|
||||||
func installed(program string) error {
|
func installed(program string) error {
|
||||||
cmd := exec.Command(program, "-version")
|
cmd := exec.Command(program, "-version")
|
||||||
errmsg := fmt.Errorf("%s is not installed", program)
|
|
||||||
if err := cmd.Start(); err != nil {
|
if err := cmd.Run(); err != nil {
|
||||||
return errmsg
|
return fmt.Errorf("%s is not installed", program)
|
||||||
}
|
|
||||||
if err := cmd.Wait(); err != nil {
|
|
||||||
return errmsg
|
|
||||||
}
|
}
|
||||||
|
|
||||||
return nil
|
return nil
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -60,6 +58,7 @@ func ffprobe(filename, stype string) ([]map[string]string, error) {
|
||||||
if err := cmd.Start(); err != nil {
|
if err := cmd.Start(); err != nil {
|
||||||
return nil, err
|
return nil, err
|
||||||
}
|
}
|
||||||
|
|
||||||
// Read ffprobe output from Stdout.
|
// Read ffprobe output from Stdout.
|
||||||
builder := bytes.Buffer{}
|
builder := bytes.Buffer{}
|
||||||
buffer := make([]byte, 1024)
|
buffer := make([]byte, 1024)
|
||||||
|
@ -70,6 +69,7 @@ func ffprobe(filename, stype string) ([]map[string]string, error) {
|
||||||
break
|
break
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
// Wait for ffprobe command to complete.
|
// Wait for ffprobe command to complete.
|
||||||
if err := cmd.Wait(); err != nil {
|
if err := cmd.Wait(); err != nil {
|
||||||
return nil, err
|
return nil, err
|
||||||
|
@ -122,7 +122,6 @@ func webcam() (string, error) {
|
||||||
// For webcam streaming on windows, ffmpeg requires a device name.
|
// For webcam streaming on windows, ffmpeg requires a device name.
|
||||||
// All device names are parsed and returned by this function.
|
// All device names are parsed and returned by this function.
|
||||||
func parseDevices(buffer string) []string {
|
func parseDevices(buffer string) []string {
|
||||||
|
|
||||||
index := strings.Index(strings.ToLower(buffer), "directshow video device")
|
index := strings.Index(strings.ToLower(buffer), "directshow video device")
|
||||||
if index != -1 {
|
if index != -1 {
|
||||||
buffer = buffer[index:]
|
buffer = buffer[index:]
|
||||||
|
@ -189,10 +188,12 @@ func getDevicesWindows() ([]string, error) {
|
||||||
"-f", "dshow",
|
"-f", "dshow",
|
||||||
"-i", "dummy",
|
"-i", "dummy",
|
||||||
)
|
)
|
||||||
|
|
||||||
pipe, err := cmd.StderrPipe()
|
pipe, err := cmd.StderrPipe()
|
||||||
if err != nil {
|
if err != nil {
|
||||||
return nil, err
|
return nil, err
|
||||||
}
|
}
|
||||||
|
|
||||||
if err := cmd.Start(); err != nil {
|
if err := cmd.Start(); err != nil {
|
||||||
return nil, err
|
return nil, err
|
||||||
}
|
}
|
||||||
|
@ -209,6 +210,7 @@ func getDevicesWindows() ([]string, error) {
|
||||||
}
|
}
|
||||||
|
|
||||||
cmd.Wait()
|
cmd.Wait()
|
||||||
|
|
||||||
devices := parseDevices(builder.String())
|
devices := parseDevices(builder.String())
|
||||||
return devices, nil
|
return devices, nil
|
||||||
}
|
}
|
||||||
|
|
3
video.go
3
video.go
|
@ -209,6 +209,7 @@ func (video *Video) init() error {
|
||||||
return err
|
return err
|
||||||
}
|
}
|
||||||
video.pipe = &pipe
|
video.pipe = &pipe
|
||||||
|
|
||||||
if err := cmd.Start(); err != nil {
|
if err := cmd.Start(); err != nil {
|
||||||
return err
|
return err
|
||||||
}
|
}
|
||||||
|
@ -229,6 +230,7 @@ func (video *Video) Read() bool {
|
||||||
return false
|
return false
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
total := 0
|
total := 0
|
||||||
for total < video.width*video.height*video.depth {
|
for total < video.width*video.height*video.depth {
|
||||||
n, err := (*video.pipe).Read(video.framebuffer[total:])
|
n, err := (*video.pipe).Read(video.framebuffer[total:])
|
||||||
|
@ -238,6 +240,7 @@ func (video *Video) Read() bool {
|
||||||
}
|
}
|
||||||
total += n
|
total += n
|
||||||
}
|
}
|
||||||
|
|
||||||
return true
|
return true
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
@ -280,6 +280,7 @@ func (writer *VideoWriter) init() error {
|
||||||
return err
|
return err
|
||||||
}
|
}
|
||||||
writer.pipe = &pipe
|
writer.pipe = &pipe
|
||||||
|
|
||||||
if err := cmd.Start(); err != nil {
|
if err := cmd.Start(); err != nil {
|
||||||
return err
|
return err
|
||||||
}
|
}
|
||||||
|
@ -295,6 +296,7 @@ func (writer *VideoWriter) Write(frame []byte) error {
|
||||||
return err
|
return err
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
total := 0
|
total := 0
|
||||||
for total < len(frame) {
|
for total < len(frame) {
|
||||||
n, err := (*writer.pipe).Write(frame[total:])
|
n, err := (*writer.pipe).Write(frame[total:])
|
||||||
|
@ -303,6 +305,7 @@ func (writer *VideoWriter) Write(frame []byte) error {
|
||||||
}
|
}
|
||||||
total += n
|
total += n
|
||||||
}
|
}
|
||||||
|
|
||||||
return nil
|
return nil
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
Loading…
Add table
Add a link
Reference in a new issue