commit f84bef5ffa0f9eeea0b7d18b9369f45f48b08ae0 Author: hhu67 Date: Wed Aug 5 14:39:15 2026 +0300 INITIAL diff --git a/.idea/.gitignore b/.idea/.gitignore new file mode 100644 index 0000000..30cf57e --- /dev/null +++ b/.idea/.gitignore @@ -0,0 +1,10 @@ +# Default ignored files +/shelf/ +/workspace.xml +# Editor-based HTTP Client requests +/httpRequests/ +# Ignored default folder with query files +/queries/ +# Datasource local storage ignored files +/dataSources/ +/dataSources.local.xml diff --git a/.idea/convertbackend.iml b/.idea/convertbackend.iml new file mode 100644 index 0000000..7c421e3 --- /dev/null +++ b/.idea/convertbackend.iml @@ -0,0 +1,9 @@ + + + + + + + + + \ No newline at end of file diff --git a/.idea/go.imports.xml b/.idea/go.imports.xml new file mode 100644 index 0000000..644cdf0 --- /dev/null +++ b/.idea/go.imports.xml @@ -0,0 +1,10 @@ + + + + + + \ No newline at end of file diff --git a/.idea/modules.xml b/.idea/modules.xml new file mode 100644 index 0000000..1dbd13b --- /dev/null +++ b/.idea/modules.xml @@ -0,0 +1,8 @@ + + + + + + + + \ No newline at end of file diff --git a/convert.go b/convert.go new file mode 100644 index 0000000..0b8a831 --- /dev/null +++ b/convert.go @@ -0,0 +1,71 @@ +package main + +import ( + "bytes" + "context" + "fmt" + "io" + "log" + "net/http" + "os/exec" + "time" +) + +func compressRAMHandler(w http.ResponseWriter, r *http.Request) { + if r.Method != http.MethodPost { + http.Error(w, "Только POST метод", http.StatusMethodNotAllowed) + return + } + + w.Header().Set("Content-Type", "video/mp4") + w.Header().Set("Transfer-Encoding", "chunked") + + ctx, cancel := context.WithTimeout(r.Context(), 60*time.Second) + defer cancel() + + args := []string{ + "-y", + "-analyzeduration", "10M", + "-probesize", "10M", + "-i", "pipe:0", + "-c:v", "libx264", + "-preset", "veryfast", + "-crf", "28", + "-threads", "4", + "-movflags", "frag_keyframe+empty_moov", + "-f", "mp4", + "pipe:1", + } + + cmd := exec.CommandContext(ctx, "ffmpeg", args...) + + cmd.Stdin = r.Body + + // Буфер для сбора ошибок FFmpeg + var stderrBuf bytes.Buffer + cmd.Stderr = &stderrBuf + + stdoutPipe, err := cmd.StdoutPipe() + if err != nil { + http.Error(w, fmt.Sprintf("Ошибка pipe stdout: %v", err), http.StatusInternalServerError) + return + } + + if err := cmd.Start(); err != nil { + http.Error(w, fmt.Sprintf("Ошибка запуска FFmpeg: %v", err), http.StatusInternalServerError) + return + } + + _, _ = io.Copy(w, stdoutPipe) + + if waitErr := cmd.Wait(); waitErr != nil { + log.Printf("FFmpeg завершился с ошибкой (%v):\n%s", waitErr, stderrBuf.String()) + } +} + +func main() { + http.HandleFunc("/compress", compressRAMHandler) + + log.Println("RAM Converter запущен на :1554...") + log.Fatal(http.ListenAndServe("127.0.0.1:1554", nil)) +} diff --git a/go.mod b/go.mod new file mode 100644 index 0000000..ded88a5 --- /dev/null +++ b/go.mod @@ -0,0 +1,3 @@ +module convert + +go 1.26.5 diff --git a/go_build_convert b/go_build_convert new file mode 100755 index 0000000..d843e38 Binary files /dev/null and b/go_build_convert differ