mirror of
https://github.com/u2takey/ffmpeg-go.git
synced 2025-10-06 00:16:55 +08:00
ProbeReader (Probe but accepts io.Reader)
This commit is contained in:
46
probe_reader.go
Normal file
46
probe_reader.go
Normal file
@@ -0,0 +1,46 @@
|
||||
package ffmpeg_go
|
||||
|
||||
import (
|
||||
"bytes"
|
||||
"context"
|
||||
"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)
|
||||
cmd.Stdout = buf
|
||||
err := cmd.Run()
|
||||
if err != nil {
|
||||
return "", err
|
||||
}
|
||||
return string(buf.Bytes()), nil
|
||||
}
|
20
probe_reader_test.go
Normal file
20
probe_reader_test.go
Normal file
@@ -0,0 +1,20 @@
|
||||
package ffmpeg_go
|
||||
|
||||
import (
|
||||
"fmt"
|
||||
"os"
|
||||
"testing"
|
||||
|
||||
"github.com/stretchr/testify/assert"
|
||||
)
|
||||
|
||||
func TestProbeReader(t *testing.T) {
|
||||
f, err := os.Open(TestInputFile1)
|
||||
assert.Nil(t, err)
|
||||
|
||||
data, err := ProbeReader(f, nil)
|
||||
assert.Nil(t, err)
|
||||
duration, err := probeOutputDuration(data)
|
||||
assert.Nil(t, err)
|
||||
assert.Equal(t, fmt.Sprintf("%f", duration), "7.036000")
|
||||
}
|
Reference in New Issue
Block a user