@Maxim_SH

Как параллельно сконвертировать rstp потоки ip камер в изображения на golang?

Всем привет!
Ситуация следующая есть n-ое количество ip камер, с которых необходимо конвертировать rtsp поток в изображение и желательно делать это параллельно.
Сделал тестовый пример с 3 камерами, выглядит следующим образом:
func convert1() {
	cmd := "/usr/bin/ffmpeg"
	args := []string{"-i", "rtsp://ip:port", "-f", "image2", "filename.ext"}

	exec.Command(cmd, args...).Run()
}

func convert2() {
	cmd := "/usr/bin/ffmpeg"
	args := []string{"-i", "rtsp://ip:port", "-f", "image2", "filename.ext"}

	exec.Command(cmd, args...).Run()
}

func convert3() {
	cmd := "/usr/bin/ffmpeg"
	args := []string{"-i", "rtsp://ip:port", "-f", "image2", "filename.ext"}

	exec.Command(cmd, args...).Run()
}

func main() {
	go convert1()
	go convert2()
	convert3()
	fmt.Println("RTSP streams of videocameras successfully converted!")
}

В этом случае все отрабатывает отлично. Но как можно реализовать подобное, если мне допустим приходит информация о камерах в json и количество камер может быть все время разное. Как вариант преобразовывать json допустим в map, где ключи это наименования изображений, а значения - ссылки на rtsp потоки камер, либо наоборот. Затем проходится по этому map'у и производить конвертацию на основании тех данных, что содержатся в map'е. Тогда каким образом реализовать параллельную конвертацию, аналогично вышеприведенному примеру? Прошу помощи в решении данного вопроса.
  • Вопрос задан
  • 1278 просмотров
Решения вопроса 2
Сделайте одну функцию конвертации, которая бы принимала параметры: ип, порт, выходной файл.
В цикле запускайте эту функцию с нужными параметрами через go
Для ожидания завершения горутин можно использовать sync.WaitGroup
nathanleclaire.com/blog/2014/02/15/how-to-wait-for...
Ответ написан
@Maxim_SH Автор вопроса
Приведу полный код решения вопроса на основе ответа Александра Павлюка, возможно другим пригодится:
package main

import (
	"os/exec"
	"sync"
)

func convert(stream, fileName string) {
	cmd := "/usr/bin/ffmpeg"
	args := []string{"-i", stream, "-f", "image2", fileName}

	exec.Command(cmd, args...).Run()
}

func main() {
	rtspStreams := map[string]string{
		"filename.ext": "rtsp://ip:port",
		"filename.ext": "rtsp://ip:port",
		"filename.ext": "rtsp://ip:port",
	}

	var wg sync.WaitGroup

	wg.Add(len(rtspStreams))

	for fileName, stream := range rtspStreams {
		go func(fileName, stream string) {
			defer wg.Done()
			convert(stream, fileName)
		}(fileName, stream)
	}

	wg.Wait()
}
Ответ написан
Пригласить эксперта
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Войти через центр авторизации
Похожие вопросы