From 6946d4b3ea484bd7fe4089f580b2ed2e78194b82 Mon Sep 17 00:00:00 2001 From: Anoop <46913894+anoopmsivadas@users.noreply.github.com> Date: Fri, 2 Oct 2020 12:04:29 +0530 Subject: [PATCH] Make video segment filename unique (#214) * Make video segment filename unique * fix typo * Remove type casting function --- core/ffmpeg/transcoder.go | 13 ++++++++++++- core/ffmpeg/transcoder_test.go | 3 ++- 2 files changed, 14 insertions(+), 2 deletions(-) diff --git a/core/ffmpeg/transcoder.go b/core/ffmpeg/transcoder.go index 9a03649d0..d320cdb96 100644 --- a/core/ffmpeg/transcoder.go +++ b/core/ffmpeg/transcoder.go @@ -8,6 +8,7 @@ import ( "strings" log "github.com/sirupsen/logrus" + "github.com/teris-io/shortid" "github.com/gabek/owncast/config" "github.com/gabek/owncast/utils" @@ -25,6 +26,7 @@ type Transcoder struct { segmentLengthSeconds int appendToStream bool ffmpegPath string + segmentIdentifier string } // HLSVariant is a combination of settings that results in a single HLS stream @@ -103,6 +105,10 @@ func (t *Transcoder) getString() string { hlsOptionFlags = append(hlsOptionFlags, "append_list") } + if t.segmentIdentifier == "" { + t.segmentIdentifier = shortid.MustGenerate() + } + ffmpegFlags := []string{ "cat", t.input, "|", t.ffmpegPath, @@ -125,7 +131,7 @@ func (t *Transcoder) getString() string { // Filenames "-master_pl_name", "stream.m3u8", "-strftime 1", // Support the use of strftime in filenames - "-hls_segment_filename", path.Join(t.segmentOutputPath, "/%v/stream-%s.ts"), // Each segment's filename + "-hls_segment_filename", path.Join(t.segmentOutputPath, "/%v/stream-%s-"+t.segmentIdentifier+".ts"), // Each segment's filename "-max_muxing_queue_size", "400", // Workaround for Too many packets error: https://trac.ffmpeg.org/ticket/6375?cversion=0 path.Join(t.segmentOutputPath, "/%v/stream.m3u8"), // Each variant's playlist "2> transcoder.log", @@ -353,3 +359,8 @@ func (t *Transcoder) SetSegmentLength(seconds int) { func (t *Transcoder) SetAppendToStream(append bool) { t.appendToStream = append } + +// SetIdentifer enables appending a unique identifier to segment file name +func (t *Transcoder) SetIdentifier(output string) { + t.segmentIdentifier = output +} diff --git a/core/ffmpeg/transcoder_test.go b/core/ffmpeg/transcoder_test.go index 58e0f7cbb..322406683 100644 --- a/core/ffmpeg/transcoder_test.go +++ b/core/ffmpeg/transcoder_test.go @@ -11,6 +11,7 @@ func TestFFmpegCommand(t *testing.T) { transcoder.SetInput("fakecontent.flv") transcoder.SetOutputPath("fakeOutput") transcoder.SetHLSPlaylistLength(10) + transcoder.SetIdentifier("jdofFGg") variant := HLSVariant{} variant.videoBitrate = 1200 @@ -22,7 +23,7 @@ func TestFFmpegCommand(t *testing.T) { cmd := transcoder.getString() - expected := `cat fakecontent.flv | /fake/path/ffmpeg -hide_banner -i pipe: -map v:0 -c:v:0 libx264 -b:v:0 1200k -maxrate:v:0 1272k -bufsize:v:0 1440k -g:v:0 119 -x264-params:v:0 "scenecut=0:open_gop=0:min-keyint=119:keyint=119" -map a:0 -c:a:0 copy -r 30 -preset veryfast -var_stream_map "v:0,a:0 " -f hls -hls_time 4 -hls_list_size 10 -hls_delete_threshold 10 -hls_flags delete_segments+program_date_time+temp_file -tune zerolatency -sc_threshold 0 -master_pl_name stream.m3u8 -strftime 1 -hls_segment_filename fakeOutput/%v/stream-%s.ts -max_muxing_queue_size 400 fakeOutput/%v/stream.m3u8 2> transcoder.log` + expected := `cat fakecontent.flv | /fake/path/ffmpeg -hide_banner -i pipe: -map v:0 -c:v:0 libx264 -b:v:0 1200k -maxrate:v:0 1272k -bufsize:v:0 1440k -g:v:0 119 -x264-params:v:0 "scenecut=0:open_gop=0:min-keyint=119:keyint=119" -map a:0 -c:a:0 copy -r 30 -preset veryfast -var_stream_map "v:0,a:0 " -f hls -hls_time 4 -hls_list_size 10 -hls_delete_threshold 10 -hls_flags delete_segments+program_date_time+temp_file -tune zerolatency -sc_threshold 0 -master_pl_name stream.m3u8 -strftime 1 -hls_segment_filename fakeOutput/%v/stream-%s-jdofFGg.ts -max_muxing_queue_size 400 fakeOutput/%v/stream.m3u8 2> transcoder.log` if cmd != expected { t.Errorf("ffmpeg command does not match expected. Got %s, want: %s", cmd, expected)