mirror of
https://github.com/u2takey/ffmpeg-go.git
synced 2025-09-26 20:11:17 +08:00
50 lines
1.3 KiB
Go
50 lines
1.3 KiB
Go
package ffmpeg_go
|
|
|
|
import (
|
|
"bytes"
|
|
"context"
|
|
"fmt"
|
|
"io"
|
|
"os/exec"
|
|
"time"
|
|
)
|
|
|
|
// ProbeReader** functions are the same as Probe** but accepting io.Reader instead of fileName
|
|
|
|
// ProbeReader runs ffprobe passing given reader via stdin and return a JSON representation of the output.
|
|
func ProbeReader(r io.Reader, kwargs ...KwArgs) (string, error) {
|
|
return ProbeReaderWithTimeout(r, 0, MergeKwArgs(kwargs))
|
|
}
|
|
|
|
func ProbeReaderWithTimeout(r io.Reader, timeOut time.Duration, kwargs KwArgs) (string, error) {
|
|
args := KwArgs{
|
|
"show_format": "",
|
|
"show_streams": "",
|
|
"of": "json",
|
|
}
|
|
|
|
return ProbeReaderWithTimeoutExec(r, timeOut, MergeKwArgs([]KwArgs{args, kwargs}))
|
|
}
|
|
|
|
func ProbeReaderWithTimeoutExec(r io.Reader, timeOut time.Duration, kwargs KwArgs) (string, error) {
|
|
args := ConvertKwargsToCmdLineArgs(kwargs)
|
|
args = append(args, "-")
|
|
ctx := context.Background()
|
|
if timeOut > 0 {
|
|
var cancel func()
|
|
ctx, cancel = context.WithTimeout(context.Background(), timeOut)
|
|
defer cancel()
|
|
}
|
|
cmd := exec.CommandContext(ctx, "ffprobe", args...)
|
|
cmd.Stdin = r
|
|
buf := bytes.NewBuffer(nil)
|
|
stdErrBuf := bytes.NewBuffer(nil)
|
|
cmd.Stdout = buf
|
|
cmd.Stderr = stdErrBuf
|
|
err := cmd.Run()
|
|
if err != nil {
|
|
return "", fmt.Errorf("[%s] %w", string(stdErrBuf.Bytes()), err)
|
|
}
|
|
return string(buf.Bytes()), nil
|
|
}
|