Ramesh S
Ramesh S

Reputation: 661

Golang with ffmpeg dynamic video Encode

Am trying to encode the videos with Golang ffmpeg. Am not able to get the video file, it shows this error

invalid character '-' in numeric literal

Postman: enter image description here

This is my code:

package main

import (
    "encoding/json"
    "fmt"
    "net/http"

    "github.com/gorilla/mux"
    "github.com/xfrr/goffmpeg/transcoder"
)

type Encode struct {
    Video string `json:"video"`
}

func encodeFfmpeg(w http.ResponseWriter, r *http.Request) {
    w.Header().Set("Content-Type", "application/json")
    fmt.Println("Encodeing Started")
    var encode Encode
    video := json.NewDecoder(r.Body).Decode(encode)
    file, err := os.Open(video)
    if err != nil {
        log.Fatalln(err)
    }

    defer file.Close()
    buf, err := ioutil.ReadAll(file)
    if err != nil {
        log.Fatalln(err)
    }


    cmd := exec.Command("ffmpeg",
        "-i", "pipe:0", // take stdin as input
        "-c:a", "libmp3lame", // use mp3 lame codec
        "-f", "avi",
        "pipe:1",
    )

    resultBuffer := bytes.NewBuffer(make([]byte, 5*1024*1024)) // pre allocate 5MiB buffer

    cmd.Stderr = os.Stderr    // bind log stream to stderr
    cmd.Stdout = resultBuffer // stdout result will be written here

    stdin, err := cmd.StdinPipe() // Open stdin pipe
    if err != nil {
        log.Fatalln(err)
    }

    err = cmd.Start() // Start a process on another goroutine
    if err != nil {
        log.Fatalln(err)
    }

    _, err = stdin.Write(buf) // pump audio data to stdin pipe
    if err != nil {
        log.Fatalln(err)
    }

    err = stdin.Close() // close the stdin, or ffmpeg will wait forever
    if err != nil {
        log.Fatalln(err)
    }

    err = cmd.Wait() // wait until ffmpeg finish
    if err != nil {
        log.Fatalln(err)
    }

    outputFile, err := os.Create(encodeFile) // create new file
    if err != nil {
        log.Fatalln(err)
    }
    defer outputFile.Close()

    _, err = outputFile.Write(resultBuffer.Bytes()) // write result buffer to file
    if err != nil {
        log.Fatalln(err)
    }

    json.NewEncoder(w).Encode(map[string]interface{}{
        "status":     "success",
        "statusCode": 200,
        "data":       "Successfully Encoded file",
    })
}


func main() {
    router := mux.NewRouter()

    router.HandleFunc("/encode", encodeFfmpeg).Methods("POST")
    //router.HandleFunc("/rtsp", rtsp).Methods("POST")

    // config port
    fmt.Printf("Starting server at 8080 \n")
    http.ListenAndServe(":8080", router)
}

video.mp4 file not showing in request body. Please help me to solve this issue

Upvotes: 1

Views: 2438

Answers (1)

MenyT
MenyT

Reputation: 2255

json.NewDecoder(r.Body).Decode(encode) returns error not video and another thing is that you send your data in form so you can access file from form like:

file, header, err := r.FormFile("video")

Upvotes: 1

Related Questions