Generate a static thumbnail png every 20s
This commit is contained in:
72
thumbnailGenerator.go
Normal file
72
thumbnailGenerator.go
Normal file
@@ -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)
|
||||
}
|
||||
Reference in New Issue
Block a user