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  }