diff --git a/reader/video_processor/cmd/main.go b/reader/video_processor/cmd/main.go new file mode 100644 index 0000000..b6ae0e5 --- /dev/null +++ b/reader/video_processor/cmd/main.go @@ -0,0 +1,584 @@ +package main + +import ( + "fmt" + "log" + "reader/internal/processor" +) + +func main() { + // Определение параметров записи + var date, startTime, endTime string + fmt.Println("Введите дату записи ДД-ММ-ГГГГ:") + fmt.Scan(&date) + fmt.Println("Введите время начала записи ЧЧ-ММ:") + fmt.Scan(&startTime) + fmt.Println("Введите время окончания записи ЧЧ-ММ:") + fmt.Scan(&endTime) + + // Вычисление времени начала и конца, запрошенного фрагмента + startHour, startMinute, endHour, endMinute := processor.CalcNeededTime(startTime, endTime) + + var endMinuteFirstVideo, durationHour int + + // Вычисление длительности (часов) запрошенного фрагмента видеозаписи + durationHour, endMinuteFirstVideo = + processor.CalcEndMinuteFirstVideo(durationHour, endMinuteFirstVideo, startHour, endHour, endMinute) + + // Определение пути хранения видеозаписей + path := "../writer/" + + switch durationHour { + case 0: + processed, created := processor.CreateFile( + startTime, date, path, startMinute, endMinuteFirstVideo, 0) + log.Println("Создан файл: ", processed) + + processor.MergeMKV(created) + processor.DeleteTrimmedFragments(created) + + case 1: + processed, created1 := processor.CreateFile( + startTime, date, path, startMinute, endMinuteFirstVideo, 0) + log.Println("Создан файл: ", processed) + + processed, created2 := processor.CreateFile( + processed, date, path, startMinute, endMinute, durationHour) + log.Println("Создан файл: ", processed) + + processor.MergeMKV(created1, created2) + processor.DeleteTrimmedFragments(created1, created2) + + case 2: + processed, created1 := processor.CreateFile( + startTime, date, path, startMinute, endMinuteFirstVideo, 0) + log.Println("Создан файл: ", processed) + + processed, created2 := processor.CreateFile( + processed, date, path, startMinute, endMinuteFirstVideo, durationHour) + log.Println("Создан файл: ", processed) + + processed, created3 := processor.CreateFile( + processed, date, path, startMinute, endMinute, durationHour) + log.Println("Создан файл: ", processed) + + processor.MergeMKV(created1, created2, created3) + processor.DeleteTrimmedFragments(created1, created2, created3) + + case 3: + created := "" + + processed, created1 := processor.CreateFile( + startTime, date, path, startMinute, endMinuteFirstVideo, 0) + log.Println("Создан файл: ", processed) + + createdS := make([]string, 4) + createdS[0] = created1 + + for i := 1; i <= 2; i++ { + processed, created = processor.CreateFile( + processed, date, path, startMinute, endMinuteFirstVideo, durationHour) + log.Println("Создан файл: ", processed) + + createdS[i] = created + } + + processed, created4 := processor.CreateFile( + processed, date, path, startMinute, endMinute, durationHour) + log.Println("Создан файл: ", processed) + + createdS[3] = created4 + + processor.MergeMKV(createdS...) + processor.DeleteTrimmedFragments(createdS...) + + case 4: + created := "" + + processed, created1 := processor.CreateFile( + startTime, date, path, startMinute, endMinuteFirstVideo, 0) + log.Println("Создан файл: ", processed) + + createdS := make([]string, 5) + createdS[0] = created1 + + for i := 1; i <= 3; i++ { + processed, created = processor.CreateFile( + processed, date, path, startMinute, endMinuteFirstVideo, durationHour) + log.Println("Создан файл: ", processed) + + createdS[i] = created + } + + processed, created5 := processor.CreateFile( + processed, date, path, startMinute, endMinute, durationHour) + log.Println("Создан файл: ", processed) + + createdS[4] = created5 + + processor.MergeMKV(createdS...) + processor.DeleteTrimmedFragments(createdS...) + + case 5: + created := "" + + processed, created1 := processor.CreateFile( + startTime, date, path, startMinute, endMinuteFirstVideo, 0) + log.Println("Создан файл: ", processed) + + createdS := make([]string, 6) + createdS[0] = created1 + + for i := 1; i <= 4; i++ { + processed, created = processor.CreateFile( + processed, date, path, startMinute, endMinuteFirstVideo, durationHour) + log.Println("Создан файл: ", processed) + + createdS[i] = created + } + + processed, created6 := processor.CreateFile( + processed, date, path, startMinute, endMinute, durationHour) + log.Println("Создан файл: ", processed) + + createdS[5] = created6 + + processor.MergeMKV(createdS...) + processor.DeleteTrimmedFragments(createdS...) + + case 6: + created := "" + + processed, created1 := processor.CreateFile( + startTime, date, path, startMinute, endMinuteFirstVideo, 0) + log.Println("Создан файл: ", processed) + + createdS := make([]string, 7) + createdS[0] = created1 + + for i := 1; i <= 5; i++ { + processed, created = processor.CreateFile( + processed, date, path, startMinute, endMinuteFirstVideo, durationHour) + log.Println("Создан файл: ", processed) + + createdS[i] = created + } + + processed, created7 := processor.CreateFile(processed, date, path, startMinute, endMinute, durationHour) + log.Println("Создан файл: ", processed) + + createdS[6] = created7 + + processor.MergeMKV(createdS...) + processor.DeleteTrimmedFragments(createdS...) + + case 7: + created := "" + + processed, created1 := processor.CreateFile(startTime, date, path, startMinute, endMinuteFirstVideo, 0) + log.Println("Создан файл: ", processed) + + createdS := make([]string, 8) + createdS[0] = created1 + + for i := 1; i <= 6; i++ { + processed, created = processor.CreateFile(processed, date, path, startMinute, endMinuteFirstVideo, durationHour) + log.Println("Создан файл: ", processed) + + createdS[i] = created + } + + processed, created8 := processor.CreateFile(processed, date, path, startMinute, endMinute, durationHour) + log.Println("Создан файл: ", processed) + + createdS[7] = created8 + + processor.MergeMKV(createdS...) + processor.DeleteTrimmedFragments(createdS...) + + case 8: + created := "" + + processed, created1 := processor.CreateFile(startTime, date, path, startMinute, endMinuteFirstVideo, 0) + log.Println("Создан файл: ", processed) + + createdS := make([]string, 9) + createdS[0] = created1 + + for i := 1; i <= 7; i++ { + processed, created = processor.CreateFile(processed, date, path, startMinute, endMinuteFirstVideo, durationHour) + log.Println("Создан файл: ", processed) + + createdS[i] = created + } + + processed, created9 := processor.CreateFile(processed, date, path, startMinute, endMinute, durationHour) + log.Println("Создан файл: ", processed) + + createdS[8] = created9 + + processor.MergeMKV(createdS...) + processor.DeleteTrimmedFragments(createdS...) + + case 9: + created := "" + + processed, created1 := processor.CreateFile(startTime, date, path, startMinute, endMinuteFirstVideo, 0) + log.Println("Создан файл: ", processed) + + createdS := make([]string, 10) + createdS[0] = created1 + + for i := 1; i <= 8; i++ { + processed, created = processor.CreateFile(processed, date, path, startMinute, endMinuteFirstVideo, durationHour) + log.Println("Создан файл: ", processed) + + createdS[i] = created + } + + processed, created10 := processor.CreateFile(processed, date, path, startMinute, endMinute, durationHour) + log.Println("Создан файл: ", processed) + + createdS[9] = created10 + + processor.MergeMKV(createdS...) + processor.DeleteTrimmedFragments(createdS...) + + case 10: + created := "" + + processed, created1 := processor.CreateFile(startTime, date, path, startMinute, endMinuteFirstVideo, 0) + log.Println("Создан файл: ", processed) + + createdS := make([]string, 11) + createdS[0] = created1 + + for i := 1; i <= 9; i++ { + processed, created = processor.CreateFile(processed, date, path, startMinute, endMinuteFirstVideo, durationHour) + log.Println("Создан файл: ", processed) + + createdS[i] = created + } + + processed, created11 := processor.CreateFile(processed, date, path, startMinute, endMinute, durationHour) + log.Println("Создан файл: ", processed) + + createdS[10] = created11 + + processor.MergeMKV(createdS...) + processor.DeleteTrimmedFragments(createdS...) + + case 11: + created := "" + + processed, created1 := processor.CreateFile(startTime, date, path, startMinute, endMinuteFirstVideo, 0) + log.Println("Создан файл: ", processed) + + createdS := make([]string, 12) + createdS[0] = created1 + + for i := 1; i <= 10; i++ { + processed, created = processor.CreateFile(processed, date, path, startMinute, endMinuteFirstVideo, durationHour) + log.Println("Создан файл: ", processed) + + createdS[i] = created + } + + processed, created12 := processor.CreateFile(processed, date, path, startMinute, endMinute, durationHour) + log.Println("Создан файл: ", processed) + + createdS[11] = created12 + + processor.MergeMKV(createdS...) + processor.DeleteTrimmedFragments(createdS...) + + case 12: + created := "" + + processed, created1 := processor.CreateFile(startTime, date, path, startMinute, endMinuteFirstVideo, 0) + log.Println("Создан файл: ", processed) + + createdS := make([]string, 13) + createdS[0] = created1 + + for i := 1; i <= 11; i++ { + processed, created = processor.CreateFile(processed, date, path, startMinute, endMinuteFirstVideo, durationHour) + log.Println("Создан файл: ", processed) + + createdS[i] = created + } + + processed, created13 := processor.CreateFile(processed, date, path, startMinute, endMinute, durationHour) + log.Println("Создан файл: ", processed) + + createdS[12] = created13 + + processor.MergeMKV(createdS...) + processor.DeleteTrimmedFragments(createdS...) + + case 13: + created := "" + + processed, created1 := processor.CreateFile(startTime, date, path, startMinute, endMinuteFirstVideo, 0) + log.Println("Создан файл: ", processed) + + createdS := make([]string, 14) + createdS[0] = created1 + + for i := 1; i <= 12; i++ { + processed, created = processor.CreateFile(processed, date, path, startMinute, endMinuteFirstVideo, durationHour) + log.Println("Создан файл: ", processed) + + createdS[i] = created + } + + processed, created14 := processor.CreateFile(processed, date, path, startMinute, endMinute, durationHour) + log.Println("Создан файл: ", processed) + + createdS[13] = created14 + + processor.MergeMKV(createdS...) + processor.DeleteTrimmedFragments(createdS...) + + case 14: + created := "" + + processed, created1 := processor.CreateFile(startTime, date, path, startMinute, endMinuteFirstVideo, 0) + log.Println("Создан файл: ", processed) + + createdS := make([]string, 15) + createdS[0] = created1 + + for i := 1; i <= 13; i++ { + processed, created = processor.CreateFile(processed, date, path, startMinute, endMinuteFirstVideo, durationHour) + log.Println("Создан файл: ", processed) + + createdS[i] = created + } + + processed, created15 := processor.CreateFile(processed, date, path, startMinute, endMinute, durationHour) + log.Println("Создан файл: ", processed) + + createdS[14] = created15 + + processor.MergeMKV(createdS...) + processor.DeleteTrimmedFragments(createdS...) + + case 15: + created := "" + + processed, created1 := processor.CreateFile(startTime, date, path, startMinute, endMinuteFirstVideo, 0) + log.Println("Создан файл: ", processed) + + createdS := make([]string, 16) + createdS[0] = created1 + + for i := 1; i <= 14; i++ { + processed, created = processor.CreateFile(processed, date, path, startMinute, endMinuteFirstVideo, durationHour) + log.Println("Создан файл: ", processed) + + createdS[i] = created + } + + processed, created16 := processor.CreateFile(processed, date, path, startMinute, endMinute, durationHour) + log.Println("Создан файл: ", processed) + + createdS[15] = created16 + + processor.MergeMKV(createdS...) + processor.DeleteTrimmedFragments(createdS...) + + case 16: + created := "" + + processed, created1 := processor.CreateFile(startTime, date, path, startMinute, endMinuteFirstVideo, 0) + log.Println("Создан файл: ", processed) + + createdS := make([]string, 17) + createdS[0] = created1 + + for i := 1; i <= 15; i++ { + processed, created = processor.CreateFile(processed, date, path, startMinute, endMinuteFirstVideo, durationHour) + log.Println("Создан файл: ", processed) + + createdS[i] = created + } + + processed, created17 := processor.CreateFile(processed, date, path, startMinute, endMinute, durationHour) + log.Println("Создан файл: ", processed) + + createdS[16] = created17 + + processor.MergeMKV(createdS...) + processor.DeleteTrimmedFragments(createdS...) + + case 17: + created := "" + + processed, created1 := processor.CreateFile(startTime, date, path, startMinute, endMinuteFirstVideo, 0) + log.Println("Создан файл: ", processed) + + createdS := make([]string, 18) + createdS[0] = created1 + + for i := 1; i <= 16; i++ { + processed, created = processor.CreateFile(processed, date, path, startMinute, endMinuteFirstVideo, durationHour) + log.Println("Создан файл: ", processed) + + createdS[i] = created + } + + processed, created18 := processor.CreateFile(processed, date, path, startMinute, endMinute, durationHour) + log.Println("Создан файл: ", processed) + + createdS[17] = created18 + + processor.MergeMKV(createdS...) + processor.DeleteTrimmedFragments(createdS...) + + case 18: + created := "" + + processed, created1 := processor.CreateFile(startTime, date, path, startMinute, endMinuteFirstVideo, 0) + log.Println("Создан файл: ", processed) + + createdS := make([]string, 19) + createdS[0] = created1 + + for i := 1; i <= 17; i++ { + processed, created = processor.CreateFile(processed, date, path, startMinute, endMinuteFirstVideo, durationHour) + log.Println("Создан файл: ", processed) + + createdS[i] = created + } + + processed, created19 := processor.CreateFile(processed, date, path, startMinute, endMinute, durationHour) + log.Println("Создан файл: ", processed) + + createdS[18] = created19 + + processor.MergeMKV(createdS...) + processor.DeleteTrimmedFragments(createdS...) + + case 19: + created := "" + + processed, created1 := processor.CreateFile(startTime, date, path, startMinute, endMinuteFirstVideo, 0) + log.Println("Создан файл: ", processed) + + createdS := make([]string, 20) + createdS[0] = created1 + + for i := 1; i <= 18; i++ { + processed, created = processor.CreateFile(processed, date, path, startMinute, endMinuteFirstVideo, durationHour) + log.Println("Создан файл: ", processed) + + createdS[i] = created + } + + processed, created20 := processor.CreateFile(processed, date, path, startMinute, endMinute, durationHour) + log.Println("Создан файл: ", processed) + + createdS[19] = created20 + + processor.MergeMKV(createdS...) + processor.DeleteTrimmedFragments(createdS...) + + case 20: + created := "" + + processed, created1 := processor.CreateFile(startTime, date, path, startMinute, endMinuteFirstVideo, 0) + log.Println("Создан файл: ", processed) + + createdS := make([]string, 21) + createdS[0] = created1 + + for i := 1; i <= 19; i++ { + processed, created = processor.CreateFile(processed, date, path, startMinute, endMinuteFirstVideo, durationHour) + log.Println("Создан файл: ", processed) + + createdS[i] = created + } + + processed, created21 := processor.CreateFile(processed, date, path, startMinute, endMinute, durationHour) + log.Println("Создан файл: ", processed) + + createdS[20] = created21 + + processor.MergeMKV(createdS...) + processor.DeleteTrimmedFragments(createdS...) + + case 21: + created := "" + + processed, created1 := processor.CreateFile(startTime, date, path, startMinute, endMinuteFirstVideo, 0) + log.Println("Создан файл: ", processed) + + createdS := make([]string, 22) + createdS[0] = created1 + + for i := 1; i <= 20; i++ { + processed, created = processor.CreateFile(processed, date, path, startMinute, endMinuteFirstVideo, durationHour) + log.Println("Создан файл: ", processed) + + createdS[i] = created + } + + processed, created22 := processor.CreateFile(processed, date, path, startMinute, endMinute, durationHour) + log.Println("Создан файл: ", processed) + + createdS[21] = created22 + + processor.MergeMKV(createdS...) + processor.DeleteTrimmedFragments(createdS...) + + case 22: + created := "" + + processed, created1 := processor.CreateFile(startTime, date, path, startMinute, endMinuteFirstVideo, 0) + log.Println("Создан файл: ", processed) + + createdS := make([]string, 23) + createdS[0] = created1 + + for i := 1; i <= 21; i++ { + processed, created = processor.CreateFile(processed, date, path, startMinute, endMinuteFirstVideo, durationHour) + log.Println("Создан файл: ", processed) + + createdS[i] = created + } + + processed, created23 := processor.CreateFile(processed, date, path, startMinute, endMinute, durationHour) + log.Println("Создан файл: ", processed) + + createdS[22] = created23 + + processor.MergeMKV(createdS...) + processor.DeleteTrimmedFragments(createdS...) + + case 23: + created := "" + + processed, created1 := processor.CreateFile(startTime, date, path, startMinute, endMinuteFirstVideo, 0) + log.Println("Создан файл: ", processed) + + createdS := make([]string, 24) + createdS[0] = created1 + + for i := 1; i <= 22; i++ { + processed, created = processor.CreateFile(processed, date, path, startMinute, endMinuteFirstVideo, durationHour) + log.Println("Создан файл: ", processed) + + createdS[i] = created + } + + processed, created24 := processor.CreateFile(processed, date, path, startMinute, endMinute, durationHour) + log.Println("Создан файл: ", processed) + + createdS[23] = created24 + + processor.MergeMKV(createdS...) + processor.DeleteTrimmedFragments(createdS...) + } + +} diff --git a/reader/video_processor/go.mod b/reader/video_processor/go.mod new file mode 100644 index 0000000..0a39802 --- /dev/null +++ b/reader/video_processor/go.mod @@ -0,0 +1,3 @@ +module reader + +go 1.23.6 diff --git a/reader/video_processor/internal/processor/file.go b/reader/video_processor/internal/processor/file.go new file mode 100644 index 0000000..38b5ae2 --- /dev/null +++ b/reader/video_processor/internal/processor/file.go @@ -0,0 +1,215 @@ +package processor + +import ( + "errors" + "io" + "log" + "os" + "path/filepath" + "strconv" + "time" +) + +// Функция copyFile находит файл в репозитории и создает его копию. +func copyFiles(path string, filename []string) (filenameCopied []string, err error) { + for i := 0; i < len(filename); i++ { + input, err := os.Open(path + filename[i]) + if err != nil { + log.Println("Ошибка открытия input файла: ", err) + } + defer func() { + err = input.Close() + if err != nil { + log.Println("Ошибка закрытия input файла.") + } + }() + + output, err := os.Create(time.Now().Format("15-04-05") + "video.mkv") + if err != nil { + log.Println("Ошибка создания output файла: ", err) + } + defer func() { + err = output.Close() + if err != nil { + log.Println("Ошибка закрытия output файла.") + } + + }() + + _, err = io.Copy(output, input) + if err != nil { + log.Println("Ошибка копирования файла") + } + } + + log.Println("Файлы скопированы.") + return filename, err +} + +// MergeMKV принимает названия видеофайлов для объединения. +func MergeMKV(filenames ...string) { + // Создание файла со списком видеофайлов для объединения + f, err := os.Create("videoList.txt") + if err != nil { + log.Fatalln("Ошибка создания файла со списком видеофайлов для объединения", err) + } + defer func() { + err = f.Close() + if err != nil { + log.Fatalln("Ошибка закрытия файла: ", err.Error()) + } + }() + + // Запись видеофайлов для объединения + n := len(filenames) + + for i := 0; i < n; i++ { + _, err = f.WriteString("file '" + filenames[i] + "'\n") + if err != nil { + log.Fatalln(err) + } + } + + err = mergeFfmpeg(f) + if err != nil { + log.Fatalln("Ошибка объединения видеофайлов с помощью ffmpeg: ", err) + } + + err = os.Remove("videoList.txt") + if err != nil { + log.Println("Ошибка удаления временного файла videoList.txt: ", err) + } + log.Println("Временный файл videoList.txt успешно удален") +} + +// DeleteTrimmedFragments удаляет временно созданные файлы. +func DeleteTrimmedFragments(filenames ...string) { + n := len(filenames) + + for i := 0; i < n; i++ { + err := os.Remove(filenames[i]) + if err != nil { + log.Printf("Ошибка удаления временного файла %s: %s", filenames[i], err.Error()) + } + log.Printf("Временный файл %s успешно удален", filenames[i]) + } +} + +// Конвертация времени из формата строки в формат чисел +func partitionTime(time string) (startHour int, startMinute int, err error) { + // Разделение часов и минут + s := []byte(time) + h := []byte{s[0], s[1]} + m := []byte{s[3], s[4]} + + // Преобразование часов и минут в целые числа + startHour, err = strconv.Atoi(string(h)) + if err != nil { + return 0, 0, err + } + startMinute, err = strconv.Atoi(string(m)) + if err != nil { + return 0, 0, err + } + + return startHour, startMinute, nil +} + +// Формирование имени файла +func createFilename(time, date string) (fileName string) { + s := []byte(time) + s[3], s[4] = '0', '0' + fileName = string(s) + "_" + date + ".mkv" + return fileName +} + +// Добавление одного часа к строке в формате ЧЧ-ММ +func addHour(startTime string) (fileName string) { + s := []byte(startTime) + if s[0] == '0' && s[1] == '9' { + s[0] = '1' + s[1] = '0' + } else if s[0] == '1' && s[1] == '9' { + s[0] = '2' + s[1] = '0' + } else { + s[1]++ + } + fileName = string(s) + return fileName +} + +// Проверка наличия файла +func checkFile(path, fileName string) error { + found := false + + err := filepath.Walk(path, func(filePath string, info os.FileInfo, err error) error { + if err != nil { + return err // Возвращаем ошибку, если возникла + } + if !info.IsDir() && info.Name() == fileName { + log.Println("Файл обнаружен:", filePath) + found = true + return filepath.SkipDir // Останавливаем обход после нахождения + } + return nil + }) + + if err != nil { + return err + } + + if !found { + return errors.New("file not found") + } + + return nil +} + +// CreateFile проверяет запрошенное количество часов записи, проверяет существование видеофайла в репозитории, +// отрезает запрашиваемый отрезок файла, возвращает обработанный час записи и название обрезанного файла. +// +// При значении параметра durationHour > 0, в первом вызове функции необходимо вручную выставить durationHour на 0. +func CreateFile(startTime, date, path string, startMinute, endMinute, durationHour int) ( + startTimeCreatedFile string, outputFile string) { + var startM, finishM string + + // Проверка длительности видео + if endMinute == 60 || endMinute == 0 { + finishM = "01:00:00" + } else { + finishM = "00:" + strconv.Itoa(endMinute) + ":00" + } + + // Проверка запрошенного количества часов записи + if durationHour > 0 { + startTime = addHour(startTime) + startM = "00:00:00" + } else { + startM = "00:" + strconv.Itoa(startMinute) + ":00" + } + + // Проверка существования видеофайла в репозитории + filename := createFilename(startTime, date) + + err := checkFile(path, filename) + if err != nil { + log.Fatalln("Ошибка начального файла: ", err) + } + + // Обрезание видеофайла + inputFile := path + filename + + if endMinute == 60 { + + } + + outputFile = trimMKV( + inputFile, + filename, + startM, + finishM, + ) + + return startTime, outputFile +} diff --git a/reader/video_processor/internal/processor/time.go b/reader/video_processor/internal/processor/time.go new file mode 100644 index 0000000..32277a5 --- /dev/null +++ b/reader/video_processor/internal/processor/time.go @@ -0,0 +1,45 @@ +package processor + +import "log" + +// CalcNeededTime принимает начальное и конечное время записи, конвертирует временя из формата строки в формат +// числа и возвращает час и минуту начала времени записи, час и минуту конца времени записи. +func CalcNeededTime(startTime, endTime string) (startHour, startMinute, endHour, endMinute int) { + // Расчет требуемого времени записи + startHour, startMinute, err := partitionTime(startTime) + if err != nil { + log.Fatal("Ошибка конвертации: ", err) + } + endHour, endMinute, err = partitionTime(endTime) + if err != nil { + log.Fatal("Ошибка конвертации: ", err) + } + + return startHour, startMinute, endHour, endMinute +} + +// CalcEndMinuteFirstVideo вычисляет необходимость смены часа (переключение одного фрагмента видеозаписи +// (которое длится 1 час) на другой фрагмент видеозаписи) и возвращает количество часов (требуемое количество фрагментов +// видеозаписи), длительность минут (объект, отвечающий за показатель минут) каждого фрагмента для формирования итоговой +// видеозаписи (кроме последнего видеофрагмента, при условии durationHour > 0 (третий объект, возвращаемый функцией +// calcEndMinuteFirstVideo). +// +// В случае, если необходимо взять полный фрагмент видеофайла, например с 00-00 до 03-00, значениеdurationHour будет +// +// снижено на 1 и возвращено. +func CalcEndMinuteFirstVideo(durationHour, endMinuteFirstVideo, startHour, endHour, endMinute int) ( + durationHourCalc int, endMinuteFirstVideoCalc int) { + durationHour = endHour - startHour + + if durationHour > 0 { + endMinuteFirstVideo = 60 + } else { + endMinuteFirstVideo = endMinute + } + + if endMinute == 0 && durationHour > 0 { + durationHour -= 1 + } + + return durationHour, endMinuteFirstVideo +} diff --git a/reader/video_processor/internal/processor/video.go b/reader/video_processor/internal/processor/video.go new file mode 100644 index 0000000..9ded5a7 --- /dev/null +++ b/reader/video_processor/internal/processor/video.go @@ -0,0 +1,49 @@ +package processor + +import ( + "log" + "os" + "os/exec" + "time" +) + +// trimMKV обрезает видеофайл и возвращает название созданного нового файла. +func trimMKV(inputFile, outputFile, startTime, finishTime string) (outputFileTrimmed string) { + outputFile = time.Now().Format("15-04-05") + outputFile + + cmd := exec.Command("ffmpeg", + "-i", inputFile, + "-ss", startTime, + "-to", finishTime, + "-c", "copy", + outputFile) + + err := cmd.Run() + + if err != nil { + log.Fatal(err) + } + + log.Println("Видео успешно обрезано") + return outputFile +} + +// mergeFfmpeg объединяет видеофайлы с помощью ffmpeg +func mergeFfmpeg(f *os.File) error { + cmd := exec.Command("ffmpeg", + "-f", "concat", + "-safe", "0", + "-i", f.Name(), + "-c", "copy", + time.Now().Format("15-04-05")+"_video.mkv") + + err := cmd.Run() + + if err != nil { + log.Println("Ошибка исполнения запроса ffmpeg: ", err) + return err + } + + log.Println("Видео успешно объединено") + return nil +}