You can not select more than 25 topics
			Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
		
		
		
		
		
			
		
			
				
					
					
						
							77 lines
						
					
					
						
							1.8 KiB
						
					
					
				
			
		
		
		
			
			
			
				
					
				
				
					
				
			
		
		
	
	
							77 lines
						
					
					
						
							1.8 KiB
						
					
					
				| package ffmpegServer | |
| 
 | |
| import ( | |
| 	"context" | |
| 	"errors" | |
| 	ffmpegCmd "github.com/u2takey/ffmpeg-go" | |
| 	"os/exec" | |
| 	"path" | |
| 	"path/filepath" | |
| 	"strings" | |
| ) | |
| 
 | |
| func PrepareUrl(url string) (string, bool) { | |
| 	if url == "" { | |
| 		return "", false | |
| 	} | |
| 	urlArr := strings.Split(url, "?") | |
| 	if len(urlArr) > 2 { | |
| 		return "", false | |
| 	} | |
| 	url = urlArr[0] | |
| 	return url, true | |
| } | |
| 
 | |
| func PrepareStreamPath(streamPath string) (string, bool) { | |
| 	streamArr := strings.Split(streamPath, "/") | |
| 	if len(streamArr) != 2 { | |
| 		return "", false | |
| 	} | |
| 	streamPath = path.Join(streamArr...) | |
| 	return streamPath, true | |
| } | |
| 
 | |
| func BuildStreamFilePath(streamPath string) string { | |
| 	streamArr := strings.Split(streamPath, "/") | |
| 	return filepath.Join(streamArr...) | |
| } | |
| 
 | |
| func ProbeWithTimeout(url string, timeoutMs int) error { | |
| 	args := ffmpegCmd.ConvertKwargsToCmdLineArgs(ffmpegCmd.KwArgs{ | |
| 		"i":        url, | |
| 		"stimeout": timeoutMs * 1000, | |
| 		"loglevel": "error", | |
| 	}) | |
| 	ctx := context.Background() | |
| 	cmd := exec.CommandContext(ctx, "ffprobe", args...) | |
| 	errBuf := new(strings.Builder) | |
| 	cmd.Stderr = errBuf | |
| 	err := cmd.Run() | |
| 	if err != nil { | |
| 		errStr := strings.TrimSpace(errBuf.String()) | |
| 		return errors.New(errStr) | |
| 	} | |
| 	return nil | |
| } | |
| 
 | |
| func ProbeStreamsWithTimeout(url string, timeoutMs int) (string, error) { | |
| 	args := ffmpegCmd.ConvertKwargsToCmdLineArgs(ffmpegCmd.KwArgs{ | |
| 		"i":            url, | |
| 		"show_streams": "", | |
| 		"stimeout":     timeoutMs * 1000, | |
| 		"of":           "json", | |
| 		"loglevel":     "error", | |
| 	}) | |
| 	ctx := context.Background() | |
| 	cmd := exec.CommandContext(ctx, "ffprobe", args...) | |
| 	infoBuf, errBuf := new(strings.Builder), new(strings.Builder) | |
| 	cmd.Stdout = infoBuf | |
| 	cmd.Stderr = errBuf | |
| 	err := cmd.Run() | |
| 	if err != nil { | |
| 		errStr := strings.TrimSpace(errBuf.String()) | |
| 		return "", errors.New(errStr) | |
| 	} | |
| 	infoStr := strings.TrimSpace(infoBuf.String()) | |
| 	return infoStr, nil | |
| }
 | |
| 
 |