v0.1 Reader/video_processor search, cut and create video file according to input parameters

This commit is contained in:
Сергей Петров 2025-02-20 17:43:23 +05:00
parent 992f9d8138
commit dfbe5cc941
5 changed files with 896 additions and 0 deletions

View File

@ -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...)
}
}

View File

@ -0,0 +1,3 @@
module reader
go 1.23.6

View File

@ -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
}

View File

@ -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
}

View File

@ -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
}