Moved transcoder command creation to separate package entirely

This commit is contained in:
Muaz Ahmad 2023-09-08 14:56:21 +05:00
parent 8be70f035b
commit 53af3d325f
2 changed files with 42 additions and 24 deletions

View file

@ -2,9 +2,8 @@ package flv
import ( import (
"io" "io"
"os/exec"
"encoding/binary" "encoding/binary"
"os" "stream_server/transcoder"
) )
type FLVWriter struct { type FLVWriter struct {
@ -12,29 +11,8 @@ type FLVWriter struct {
} }
func NewFLVWriter(stream_key string) (*FLVWriter, error) { func NewFLVWriter(stream_key string) (*FLVWriter, error) {
base_dir, _ := os.UserHomeDir()
writer := new(FLVWriter) writer := new(FLVWriter)
// spawn ffmpeg as a transcoder + hls segmenter flvpipe, err := transcoder.NewTranscoder(stream_key) // give control over the ffmpeg input as a stdin pipe (will push in flv packets as they come)
// most are generic commands, added a prefix to each segment url to make serving it over http easier
transcoder := exec.Command(
"ffmpeg",
"-probesize", "500",
"-i", "pipe:0",
"-c:a", "aac",
"-c:v", "h264",
"-b:v", "1M",
"-g", "30",
"-hls_time", "6",
"-hls_list_size", "4",
"-hls_base_url", "/vid/" + stream_key + "/",
"-hls_segment_type", "fmp4",
"-hls_flags", "delete_segments",
"-hls_flags", "+program_date_time",
"stream.m3u8",
)
transcoder.Dir = base_dir + "/live/" + stream_key + "/" // shift to the appropriate dir for the given stream key
flvpipe, err := transcoder.StdinPipe() // give control over the ffmpeg input as a stdin pipe (will push in flv packets as they come)
transcoder.Start() // spawn ffmpeg
if err != nil { if err != nil {
return nil, err return nil, err
} }

40
transcoder/transcoder.go Normal file
View file

@ -0,0 +1,40 @@
package transcoder
import (
"os/exec"
"os"
"io"
)
func NewTranscoder(stream_key string) (io.WriteCloser, error) {
base_dir, _ := os.UserHomeDir()
command := "ffmpeg"
command_args := []string{
"-probesize", "500",
"-i", "pipe:0",
"-c:a", "libopus",
"-c:v", "vp9",
"-quality", "realtime",
"-speed", "7",
"-tile-columns", "4",
"-frame-parallel", "1",
"-threads", "8",
"-b:v", "1M",
"-g", "30",
"-hls_time", "6",
"-hls_list_size", "4",
"-hls_base_url", "/vid/" + stream_key + "/",
"-hls_segment_type", "fmp4",
"-hls_flags", "delete_segments",
"-hls_flags", "+program_date_time",
"stream.m3u8",
}
transcoder := exec.Command(command, command_args...)
transcoder.Dir = base_dir + "/live/" + stream_key + "/"
data_in, err := transcoder.StdinPipe()
if err != nil {
return nil, err
}
transcoder.Start()
return data_in, nil
}