Live video on the AT Protocol
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}