github.com/0chain/gosdk@v1.17.11/zboxcore/sdk/chunked_upload_web_streaming.go (about) 1 package sdk 2 3 import ( 4 "bufio" 5 "bytes" 6 "io" 7 "os" 8 "os/exec" 9 "path" 10 "path/filepath" 11 "strings" 12 13 thrown "github.com/0chain/errors" 14 "github.com/0chain/gosdk/zboxcore/logger" 15 ) 16 17 // Converting the video file to fmp4 format for web streaming 18 func TranscodeWebStreaming(workdir string, fileReader io.Reader, fileMeta FileMeta) (io.Reader, *FileMeta, string, error) { 19 var stdErr bytes.Buffer 20 21 outDir := filepath.Join(workdir, ".zcn", "transcode") 22 // create ./zcn/transcode folder if it doesn't exists 23 os.MkdirAll(outDir, 0766) //nolint: errcheck 24 25 remoteName, remotePath := GetTranscodeFile(fileMeta.RemotePath) 26 27 fileName := filepath.Join(outDir, remoteName) 28 29 logger.Logger.Info("transcode: start ", fileName) 30 31 args := []string{"-i", fileMeta.Path, "-f", "mp4", "-movflags", "frag_keyframe+empty_moov+default_base_moof", fileName, "-y"} 32 cmd := exec.Command(CmdFFmpeg, args...) 33 cmd.Stderr = bufio.NewWriter(&stdErr) 34 cmd.SysProcAttr = sysProcAttr 35 err := cmd.Run() 36 37 defer func() { 38 // w.Close() 39 err = cmd.Process.Kill() 40 if err != nil { 41 logger.Logger.Error(err) 42 } 43 }() 44 45 if err != nil { 46 logger.Logger.Error(err, stdErr.String()) 47 return nil, nil, "", thrown.New("Transcoding Failed: ", err.Error()) 48 } 49 50 // open file reader with readonly 51 r, err := os.Open(fileName) 52 53 if err != nil { 54 return nil, nil, fileName, err 55 } 56 57 logger.Logger.Info("transcode: done ", fileName) 58 59 fi, err := r.Stat() 60 if err != nil { 61 return nil, nil, fileName, err 62 } 63 64 fm := &FileMeta{ 65 MimeType: "video/mp4", 66 Path: fileMeta.Path, 67 ThumbnailPath: fileMeta.ThumbnailPath, 68 ActualHash: fileMeta.ActualHash, 69 ActualSize: fi.Size(), 70 ActualThumbnailSize: fileMeta.ActualThumbnailSize, 71 ActualThumbnailHash: fileMeta.ActualThumbnailHash, 72 RemoteName: remoteName, 73 RemotePath: remotePath, 74 } 75 76 return r, fm, fileName, nil 77 } 78 79 func GetTranscodeFile(remotePath string) (string, string) { 80 newRemotePath, newRemoteName := path.Split(remotePath) 81 newRemoteNameSlice := strings.Split(newRemoteName, ".") 82 if len(newRemoteNameSlice) > 0 { 83 newRemoteNameSlice = newRemoteNameSlice[:len(newRemoteNameSlice)-1] 84 } 85 newRemoteNameWithoutType := strings.Join(newRemoteNameSlice, ".") 86 newRemoteName = newRemoteNameWithoutType + ".mp4" 87 newRemotePath = newRemotePath + newRemoteName 88 return newRemoteName, newRemotePath 89 }