Live video on the AT Protocol
at eli/rust-experimentation 60 lines 1.3 kB view raw
1package cmd 2 3import ( 4 "context" 5 "fmt" 6 "io" 7 "os" 8 "path/filepath" 9 10 "stream.place/streamplace/pkg/log" 11 "stream.place/streamplace/pkg/media" 12) 13 14func Split(ctx context.Context, inFile, outDir string) error { 15 inFD, err := os.Open(inFile) 16 if err != nil { 17 return err 18 } 19 defer inFD.Close() 20 err = os.MkdirAll(outDir, 0755) 21 if err != nil { 22 return err 23 } 24 25 names := []string{} 26 27 err = media.SplitSegments(ctx, inFD, func(fname string) media.ReadWriteSeekCloser { 28 fullPath := filepath.Join(outDir, fname) 29 names = append(names, fullPath) 30 log.Log(ctx, "creating segment file", "path", fullPath) 31 fd, err := os.Create(fullPath) 32 if err != nil { 33 log.Error(ctx, "failed to open segment file", "error", err) 34 return nil 35 } 36 return fd 37 }) 38 if err != nil { 39 return fmt.Errorf("failed to split segments: %w", err) 40 } 41 42 for _, name := range names { 43 fd, err := os.Open(name) 44 if err != nil { 45 return fmt.Errorf("failed to open segment file: %w", err) 46 } 47 defer fd.Close() 48 bs, err := io.ReadAll(fd) 49 if err != nil { 50 return fmt.Errorf("failed to read segment file: %w", err) 51 } 52 _, err = media.ValidateMP4Media(ctx, bs) 53 if err != nil { 54 return fmt.Errorf("failed to validate segment file: %w", err) 55 } 56 log.Log(ctx, "validated segment file", "path", name) 57 } 58 59 return nil 60}