3 changed files with 80 additions and 4 deletions
@ -0,0 +1,72 @@
@@ -0,0 +1,72 @@
|
||||
package main |
||||
|
||||
import ( |
||||
"fmt" |
||||
"io/ioutil" |
||||
"os" |
||||
"os/exec" |
||||
"path" |
||||
"time" |
||||
) |
||||
|
||||
func startThumbnailGenerator(chunkPath string) { |
||||
// Every 20 seconds create a thumbnail from the most
|
||||
// recent video segment.
|
||||
ticker := time.NewTicker(20 * time.Second) |
||||
quit := make(chan struct{}) |
||||
go func() { |
||||
for { |
||||
select { |
||||
case <-ticker.C: |
||||
fireThumbnailGenerator(chunkPath) |
||||
case <-quit: |
||||
ticker.Stop() |
||||
return |
||||
} |
||||
} |
||||
}() |
||||
} |
||||
|
||||
func fireThumbnailGenerator(chunkPath string) { |
||||
framePath := path.Join(chunkPath, "0") |
||||
files, err := ioutil.ReadDir(framePath) |
||||
outputFile := path.Join("webroot", "thumbnail.png") |
||||
|
||||
// fmt.Println("Generating thumbnail from", framePath, "to", outputFile)
|
||||
|
||||
if err != nil { |
||||
fmt.Fprintln(os.Stderr, err) |
||||
os.Exit(1) |
||||
} |
||||
|
||||
var modTime time.Time |
||||
var names []string |
||||
for _, fi := range files { |
||||
if path.Ext(fi.Name()) != ".ts" { |
||||
continue |
||||
} |
||||
|
||||
if fi.Mode().IsRegular() { |
||||
if !fi.ModTime().Before(modTime) { |
||||
if fi.ModTime().After(modTime) { |
||||
modTime = fi.ModTime() |
||||
names = names[:0] |
||||
} |
||||
names = append(names, fi.Name()) |
||||
} |
||||
} |
||||
} |
||||
|
||||
if len(names) == 0 { |
||||
return |
||||
} |
||||
|
||||
mostRecentFile := path.Join(framePath, names[0]) |
||||
|
||||
ffmpegCmd := "ffmpeg -y -i " + mostRecentFile + " -ss 00:00:01.000 -vframes 1 " + outputFile |
||||
|
||||
// fmt.Println(ffmpegCmd)
|
||||
|
||||
_, err = exec.Command("sh", "-c", ffmpegCmd).Output() |
||||
verifyError(err) |
||||
} |
Loading…
Reference in new issue